diff --git a/services/token-aggregation/reports/audit/omnl-audit.jsonl b/services/token-aggregation/reports/audit/omnl-audit.jsonl new file mode 100644 index 0000000..0b900d3 --- /dev/null +++ b/services/token-aggregation/reports/audit/omnl-audit.jsonl @@ -0,0 +1,6 @@ +{"id":"c99cd462-7d3d-477e-bcff-0903bd33ef68","ts":"2026-07-05T23:51:49.003Z","category":"reconcile","action":"triple_state_reconcile","traceId":"0xfefb7411285a639b00be06bbffe897eb802ee817983aa57facf5bde6a1b52ff4","status":"error","metadata":{"breakCount":3,"aligned":false}} +{"id":"33510913-6f91-4c3b-a672-3b5eee875c73","ts":"2026-07-05T23:53:58.873Z","category":"reconcile","action":"triple_state_reconcile","traceId":"0xfefb7411285a639b00be06bbffe897eb802ee817983aa57facf5bde6a1b52ff4","status":"error","metadata":{"breakCount":3,"aligned":false}} +{"id":"717a6667-2cff-4cdc-b2f6-aaf59761b9b3","ts":"2026-07-06T00:07:39.756Z","category":"reconcile","action":"triple_state_reconcile","traceId":"0xfefb7411285a639b00be06bbffe897eb802ee817983aa57facf5bde6a1b52ff4","status":"error","metadata":{"breakCount":3,"aligned":false}} +{"id":"4d21094d-56fd-4324-a75b-1075f9a5dd59","ts":"2026-07-06T00:23:58.822Z","category":"reconcile","action":"triple_state_reconcile","traceId":"0xfefb7411285a639b00be06bbffe897eb802ee817983aa57facf5bde6a1b52ff4","status":"error","metadata":{"breakCount":3,"aligned":false}} +{"id":"9b28b030-b396-4e07-9aa8-47854797096c","ts":"2026-07-06T00:28:58.771Z","category":"reconcile","action":"triple_state_reconcile","traceId":"0xfefb7411285a639b00be06bbffe897eb802ee817983aa57facf5bde6a1b52ff4","status":"error","metadata":{"breakCount":3,"aligned":false}} +{"id":"d7ea5f0c-5827-4795-ae98-23f958b92646","ts":"2026-07-06T00:29:30.710Z","category":"reconcile","action":"triple_state_reconcile","traceId":"0xfefb7411285a639b00be06bbffe897eb802ee817983aa57facf5bde6a1b52ff4","status":"error","metadata":{"breakCount":3,"aligned":false}} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol new file mode 100644 index 0000000..6955b35 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol) + +pragma solidity ^0.8.20; + +import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import {ERC165Upgradeable} from "../utils/introspection/ERC165Upgradeable.sol"; +import {Initializable} from "../proxy/utils/Initializable.sol"; + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ```solidity + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ```solidity + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} + * to enforce additional security measures for this role. + */ +abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControl, ERC165Upgradeable { + struct RoleData { + mapping(address account => bool) hasRole; + bytes32 adminRole; + } + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + + /// @custom:storage-location erc7201:openzeppelin.storage.AccessControl + struct AccessControlStorage { + mapping(bytes32 role => RoleData) _roles; + } + + // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControl")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant AccessControlStorageLocation = 0x02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800; + + function _getAccessControlStorage() private pure returns (AccessControlStorage storage $) { + assembly { + $.slot := AccessControlStorageLocation + } + } + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with an {AccessControlUnauthorizedAccount} error including the required role. + */ + modifier onlyRole(bytes32 role) { + _checkRole(role); + _; + } + + function __AccessControl_init() internal onlyInitializing { + } + + function __AccessControl_init_unchained() internal onlyInitializing { + } + /// @inheritdoc IERC165 + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view virtual returns (bool) { + AccessControlStorage storage $ = _getAccessControlStorage(); + return $._roles[role].hasRole[account]; + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` + * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. + */ + function _checkRole(bytes32 role) internal view virtual { + _checkRole(role, _msgSender()); + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` + * is missing `role`. + */ + function _checkRole(bytes32 role, address account) internal view virtual { + if (!hasRole(role, account)) { + revert AccessControlUnauthorizedAccount(account, role); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { + AccessControlStorage storage $ = _getAccessControlStorage(); + return $._roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleGranted} event. + */ + function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleRevoked} event. + */ + function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been revoked `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + * + * May emit a {RoleRevoked} event. + */ + function renounceRole(bytes32 role, address callerConfirmation) public virtual { + if (callerConfirmation != _msgSender()) { + revert AccessControlBadConfirmation(); + } + + _revokeRole(role, callerConfirmation); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + AccessControlStorage storage $ = _getAccessControlStorage(); + bytes32 previousAdminRole = getRoleAdmin(role); + $._roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + /** + * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. + * + * Internal function without access restriction. + * + * May emit a {RoleGranted} event. + */ + function _grantRole(bytes32 role, address account) internal virtual returns (bool) { + AccessControlStorage storage $ = _getAccessControlStorage(); + if (!hasRole(role, account)) { + $._roles[role].hasRole[account] = true; + emit RoleGranted(role, account, _msgSender()); + return true; + } else { + return false; + } + } + + /** + * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked. + * + * Internal function without access restriction. + * + * May emit a {RoleRevoked} event. + */ + function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { + AccessControlStorage storage $ = _getAccessControlStorage(); + if (hasRole(role, account)) { + $._roles[role].hasRole[account] = false; + emit RoleRevoked(role, account, _msgSender()); + return true; + } else { + return false; + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol new file mode 100644 index 0000000..0d05fdb --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol @@ -0,0 +1,238 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol) + +pragma solidity ^0.8.20; + +/** + * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed + * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an + * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer + * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. + * + * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be + * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in + * case an upgrade adds a module that needs to be initialized. + * + * For example: + * + * [.hljs-theme-light.nopadding] + * ```solidity + * contract MyToken is ERC20Upgradeable { + * function initialize() initializer public { + * __ERC20_init("MyToken", "MTK"); + * } + * } + * + * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { + * function initializeV2() reinitializer(2) public { + * __ERC20Permit_init("MyToken"); + * } + * } + * ``` + * + * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as + * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. + * + * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure + * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. + * + * [CAUTION] + * ==== + * Avoid leaving a contract uninitialized. + * + * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation + * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke + * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: + * + * [.hljs-theme-light.nopadding] + * ``` + * /// @custom:oz-upgrades-unsafe-allow constructor + * constructor() { + * _disableInitializers(); + * } + * ``` + * ==== + */ +abstract contract Initializable { + /** + * @dev Storage of the initializable contract. + * + * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions + * when using with upgradeable contracts. + * + * @custom:storage-location erc7201:openzeppelin.storage.Initializable + */ + struct InitializableStorage { + /** + * @dev Indicates that the contract has been initialized. + */ + uint64 _initialized; + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool _initializing; + } + + // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; + + /** + * @dev The contract is already initialized. + */ + error InvalidInitialization(); + + /** + * @dev The contract is not initializing. + */ + error NotInitializing(); + + /** + * @dev Triggered when the contract has been initialized or reinitialized. + */ + event Initialized(uint64 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. + * + * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any + * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in + * production. + * + * Emits an {Initialized} event. + */ + modifier initializer() { + // solhint-disable-next-line var-name-mixedcase + InitializableStorage storage $ = _getInitializableStorage(); + + // Cache values to avoid duplicated sloads + bool isTopLevelCall = !$._initializing; + uint64 initialized = $._initialized; + + // Allowed calls: + // - initialSetup: the contract is not in the initializing state and no previous version was + // initialized + // - construction: the contract is initialized at version 1 (no reinitialization) and the + // current contract is just being deployed + bool initialSetup = initialized == 0 && isTopLevelCall; + bool construction = initialized == 1 && address(this).code.length == 0; + + if (!initialSetup && !construction) { + revert InvalidInitialization(); + } + $._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. + * + * 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. + * + * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` + * cannot be nested. If one is invoked in the context of another, execution will revert. + * + * 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. + * + * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. + * + * Emits an {Initialized} event. + */ + modifier reinitializer(uint64 version) { + // solhint-disable-next-line var-name-mixedcase + InitializableStorage storage $ = _getInitializableStorage(); + + if ($._initializing || $._initialized >= version) { + revert InvalidInitialization(); + } + $._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() { + _checkInitializing(); + _; + } + + /** + * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. + */ + function _checkInitializing() internal view virtual { + if (!_isInitializing()) { + revert NotInitializing(); + } + } + + /** + * @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. + * + * Emits an {Initialized} event the first time it is successfully executed. + */ + function _disableInitializers() internal virtual { + // solhint-disable-next-line var-name-mixedcase + InitializableStorage storage $ = _getInitializableStorage(); + + if ($._initializing) { + revert InvalidInitialization(); + } + if ($._initialized != type(uint64).max) { + $._initialized = type(uint64).max; + emit Initialized(type(uint64).max); + } + } + + /** + * @dev Returns the highest version that has been initialized. See {reinitializer}. + */ + function _getInitializedVersion() internal view returns (uint64) { + return _getInitializableStorage()._initialized; + } + + /** + * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. + */ + function _isInitializing() internal view returns (bool) { + return _getInitializableStorage()._initializing; + } + + /** + * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location. + * + * NOTE: Consider following the ERC-7201 formula to derive storage locations. + */ + function _initializableStorageSlot() internal pure virtual returns (bytes32) { + return INITIALIZABLE_STORAGE; + } + + /** + * @dev Returns a pointer to the storage namespace. + */ + // solhint-disable-next-line var-name-mixedcase + function _getInitializableStorage() private pure returns (InitializableStorage storage $) { + bytes32 slot = _initializableStorageSlot(); + assembly { + $.slot := slot + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol new file mode 100644 index 0000000..d1b4a32 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/UUPSUpgradeable.sol) + +pragma solidity ^0.8.22; + +import {IERC1822Proxiable} from "@openzeppelin/contracts/interfaces/draft-IERC1822.sol"; +import {ERC1967Utils} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol"; +import {Initializable} from "./Initializable.sol"; + +/** + * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an + * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. + * + * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is + * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing + * `UUPSUpgradeable` with a custom implementation of upgrades. + * + * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. + */ +abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable { + /// @custom:oz-upgrades-unsafe-allow state-variable-immutable + address private immutable __self = address(this); + + /** + * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)` + * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called, + * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string. + * If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must + * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function + * during an upgrade. + */ + string public constant UPGRADE_INTERFACE_VERSION = "5.0.0"; + + /** + * @dev The call is from an unauthorized context. + */ + error UUPSUnauthorizedCallContext(); + + /** + * @dev The storage `slot` is unsupported as a UUID. + */ + error UUPSUnsupportedProxiableUUID(bytes32 slot); + + /** + * @dev Check that the execution is being performed through a delegatecall call and that the execution context is + * a proxy contract with an implementation (as defined in ERC-1967) pointing to self. This should only be the case + * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a + * function through ERC-1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to + * fail. + */ + modifier onlyProxy() { + _checkProxy(); + _; + } + + /** + * @dev Check that the execution is not being performed through a delegate call. This allows a function to be + * callable on the implementing contract but not through proxies. + */ + modifier notDelegated() { + _checkNotDelegated(); + _; + } + + function __UUPSUpgradeable_init() internal onlyInitializing { + } + + function __UUPSUpgradeable_init_unchained() internal onlyInitializing { + } + /** + * @dev Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the + * implementation. It is used to validate the implementation's compatibility when performing an upgrade. + * + * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks + * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this + * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. + */ + function proxiableUUID() external view virtual notDelegated returns (bytes32) { + return ERC1967Utils.IMPLEMENTATION_SLOT; + } + + /** + * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call + * encoded in `data`. + * + * Calls {_authorizeUpgrade}. + * + * Emits an {Upgraded} event. + * + * @custom:oz-upgrades-unsafe-allow-reachable delegatecall + */ + function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { + _authorizeUpgrade(newImplementation); + _upgradeToAndCallUUPS(newImplementation, data); + } + + /** + * @dev Reverts if the execution is not performed via delegatecall or the execution + * context is not of a proxy with an ERC-1967 compliant implementation pointing to self. + */ + function _checkProxy() internal view virtual { + if ( + address(this) == __self || // Must be called through delegatecall + ERC1967Utils.getImplementation() != __self // Must be called through an active proxy + ) { + revert UUPSUnauthorizedCallContext(); + } + } + + /** + * @dev Reverts if the execution is performed via delegatecall. + * See {notDelegated}. + */ + function _checkNotDelegated() internal view virtual { + if (address(this) != __self) { + // Must not be called through delegatecall + revert UUPSUnauthorizedCallContext(); + } + } + + /** + * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by + * {upgradeToAndCall}. + * + * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. + * + * ```solidity + * function _authorizeUpgrade(address) internal onlyOwner {} + * ``` + */ + function _authorizeUpgrade(address newImplementation) internal virtual; + + /** + * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call. + * + * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value + * is expected to be the implementation slot in ERC-1967. + * + * Emits an {IERC1967-Upgraded} event. + */ + function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private { + try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { + if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) { + revert UUPSUnsupportedProxiableUUID(slot); + } + ERC1967Utils.upgradeToAndCall(newImplementation, data); + } catch { + // The implementation is not UUPS + revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation); + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol new file mode 100644 index 0000000..0c36cf1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol @@ -0,0 +1,330 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol) + +pragma solidity ^0.8.20; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {ContextUpgradeable} from "../../utils/ContextUpgradeable.sol"; +import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; +import {Initializable} from "../../proxy/utils/Initializable.sol"; + +/** + * @dev Implementation of the {IERC20} interface. + * + * This implementation is agnostic to the way tokens are created. This means + * that a supply mechanism has to be added in a derived contract using {_mint}. + * + * TIP: For a detailed writeup see our guide + * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * The default value of {decimals} is 18. To change this, you should override + * this function so it returns a different value. + * + * We have followed general OpenZeppelin Contracts guidelines: functions revert + * instead returning `false` on failure. This behavior is nonetheless + * conventional and does not conflict with the expectations of ERC-20 + * applications. + */ +abstract contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors { + /// @custom:storage-location erc7201:openzeppelin.storage.ERC20 + struct ERC20Storage { + mapping(address account => uint256) _balances; + + mapping(address account => mapping(address spender => uint256)) _allowances; + + uint256 _totalSupply; + + string _name; + string _symbol; + } + + // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00; + + function _getERC20Storage() private pure returns (ERC20Storage storage $) { + assembly { + $.slot := ERC20StorageLocation + } + } + + /** + * @dev Sets the values for {name} and {symbol}. + * + * Both values are immutable: they can only be set once during construction. + */ + function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { + __ERC20_init_unchained(name_, symbol_); + } + + function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { + ERC20Storage storage $ = _getERC20Storage(); + $._name = name_; + $._symbol = symbol_; + } + + /** + * @dev Returns the name of the token. + */ + function name() public view virtual returns (string memory) { + ERC20Storage storage $ = _getERC20Storage(); + return $._name; + } + + /** + * @dev Returns the symbol of the token, usually a shorter version of the + * name. + */ + function symbol() public view virtual returns (string memory) { + ERC20Storage storage $ = _getERC20Storage(); + return $._symbol; + } + + /** + * @dev Returns the number of decimals used to get its user representation. + * For example, if `decimals` equals `2`, a balance of `505` tokens should + * be displayed to a user as `5.05` (`505 / 10 ** 2`). + * + * Tokens usually opt for a value of 18, imitating the relationship between + * Ether and Wei. This is the default value returned by this function, unless + * it's overridden. + * + * NOTE: This information is only used for _display_ purposes: it in + * no way affects any of the arithmetic of the contract, including + * {IERC20-balanceOf} and {IERC20-transfer}. + */ + function decimals() public view virtual returns (uint8) { + return 18; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual returns (uint256) { + ERC20Storage storage $ = _getERC20Storage(); + return $._totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual returns (uint256) { + ERC20Storage storage $ = _getERC20Storage(); + return $._balances[account]; + } + + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `to` cannot be the zero address. + * - the caller must have a balance of at least `value`. + */ + function transfer(address to, uint256 value) public virtual returns (bool) { + address owner = _msgSender(); + _transfer(owner, to, value); + return true; + } + + /// @inheritdoc IERC20 + function allowance(address owner, address spender) public view virtual returns (uint256) { + ERC20Storage storage $ = _getERC20Storage(); + return $._allowances[owner][spender]; + } + + /** + * @dev See {IERC20-approve}. + * + * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on + * `transferFrom`. This is semantically equivalent to an infinite approval. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 value) public virtual returns (bool) { + address owner = _msgSender(); + _approve(owner, spender, value); + return true; + } + + /** + * @dev See {IERC20-transferFrom}. + * + * Skips emitting an {Approval} event indicating an allowance update. This is not + * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. + * + * NOTE: Does not update the allowance if the current allowance + * is the maximum `uint256`. + * + * Requirements: + * + * - `from` and `to` cannot be the zero address. + * - `from` must have a balance of at least `value`. + * - the caller must have allowance for ``from``'s tokens of at least + * `value`. + */ + function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { + address spender = _msgSender(); + _spendAllowance(from, spender, value); + _transfer(from, to, value); + return true; + } + + /** + * @dev Moves a `value` amount of tokens from `from` to `to`. + * + * This internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * NOTE: This function is not virtual, {_update} should be overridden instead. + */ + function _transfer(address from, address to, uint256 value) internal { + if (from == address(0)) { + revert ERC20InvalidSender(address(0)); + } + if (to == address(0)) { + revert ERC20InvalidReceiver(address(0)); + } + _update(from, to, value); + } + + /** + * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` + * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding + * this function. + * + * Emits a {Transfer} event. + */ + function _update(address from, address to, uint256 value) internal virtual { + ERC20Storage storage $ = _getERC20Storage(); + if (from == address(0)) { + // Overflow check required: The rest of the code assumes that totalSupply never overflows + $._totalSupply += value; + } else { + uint256 fromBalance = $._balances[from]; + if (fromBalance < value) { + revert ERC20InsufficientBalance(from, fromBalance, value); + } + unchecked { + // Overflow not possible: value <= fromBalance <= totalSupply. + $._balances[from] = fromBalance - value; + } + } + + if (to == address(0)) { + unchecked { + // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. + $._totalSupply -= value; + } + } else { + unchecked { + // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. + $._balances[to] += value; + } + } + + emit Transfer(from, to, value); + } + + /** + * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). + * Relies on the `_update` mechanism + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * NOTE: This function is not virtual, {_update} should be overridden instead. + */ + function _mint(address account, uint256 value) internal { + if (account == address(0)) { + revert ERC20InvalidReceiver(address(0)); + } + _update(address(0), account, value); + } + + /** + * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. + * Relies on the `_update` mechanism. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * NOTE: This function is not virtual, {_update} should be overridden instead + */ + function _burn(address account, uint256 value) internal { + if (account == address(0)) { + revert ERC20InvalidSender(address(0)); + } + _update(account, address(0), value); + } + + /** + * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens. + * + * This internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + * + * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. + */ + function _approve(address owner, address spender, uint256 value) internal { + _approve(owner, spender, value, true); + } + + /** + * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. + * + * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by + * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any + * `Approval` event during `transferFrom` operations. + * + * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to + * true using the following override: + * + * ```solidity + * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { + * super._approve(owner, spender, value, true); + * } + * ``` + * + * Requirements are the same as {_approve}. + */ + function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { + ERC20Storage storage $ = _getERC20Storage(); + if (owner == address(0)) { + revert ERC20InvalidApprover(address(0)); + } + if (spender == address(0)) { + revert ERC20InvalidSpender(address(0)); + } + $._allowances[owner][spender] = value; + if (emitEvent) { + emit Approval(owner, spender, value); + } + } + + /** + * @dev Updates `owner`'s allowance for `spender` based on spent `value`. + * + * Does not update the allowance value in case of infinite allowance. + * Revert if not enough allowance is available. + * + * Does not emit an {Approval} event. + */ + function _spendAllowance(address owner, address spender, uint256 value) internal virtual { + uint256 currentAllowance = allowance(owner, spender); + if (currentAllowance < type(uint256).max) { + if (currentAllowance < value) { + revert ERC20InsufficientAllowance(spender, currentAllowance, value); + } + unchecked { + _approve(owner, spender, currentAllowance - value, false); + } + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol new file mode 100644 index 0000000..5aa9b48 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) + +pragma solidity ^0.8.20; +import {Initializable} from "../proxy/utils/Initializable.sol"; + +/** + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +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; + } + + function _contextSuffixLength() internal view virtual returns (uint256) { + return 0; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol new file mode 100644 index 0000000..5c66d6f --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol) + +pragma solidity ^0.8.20; +import {Initializable} from "../proxy/utils/Initializable.sol"; + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, + * consider using {ReentrancyGuardTransient} instead. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuardUpgradeable is Initializable { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant NOT_ENTERED = 1; + uint256 private constant ENTERED = 2; + + /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard + struct ReentrancyGuardStorage { + uint256 _status; + } + + // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00; + + function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) { + assembly { + $.slot := ReentrancyGuardStorageLocation + } + } + + /** + * @dev Unauthorized reentrant call. + */ + error ReentrancyGuardReentrantCall(); + + function __ReentrancyGuard_init() internal onlyInitializing { + __ReentrancyGuard_init_unchained(); + } + + function __ReentrancyGuard_init_unchained() internal onlyInitializing { + ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); + $._status = NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and making it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + _nonReentrantBefore(); + _; + _nonReentrantAfter(); + } + + function _nonReentrantBefore() private { + ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); + // On the first call to nonReentrant, _status will be NOT_ENTERED + if ($._status == ENTERED) { + revert ReentrancyGuardReentrantCall(); + } + + // Any calls to nonReentrant after this point will fail + $._status = ENTERED; + } + + function _nonReentrantAfter() private { + ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + $._status = NOT_ENTERED; + } + + /** + * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a + * `nonReentrant` function in the call stack. + */ + function _reentrancyGuardEntered() internal view returns (bool) { + ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); + return $._status == ENTERED; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol new file mode 100644 index 0000000..296c4a1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import {Initializable} from "../../proxy/utils/Initializable.sol"; + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + */ +abstract contract ERC165Upgradeable is Initializable, IERC165 { + function __ERC165_init() internal onlyInitializing { + } + + function __ERC165_init_unchained() internal onlyInitializing { + } + /// @inheritdoc IERC165 + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/access/AccessControl.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/access/AccessControl.sol new file mode 100644 index 0000000..3e3341e --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/access/AccessControl.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) + +pragma solidity ^0.8.20; + +import {IAccessControl} from "./IAccessControl.sol"; +import {Context} from "../utils/Context.sol"; +import {ERC165} from "../utils/introspection/ERC165.sol"; + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ```solidity + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ```solidity + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} + * to enforce additional security measures for this role. + */ +abstract contract AccessControl is Context, IAccessControl, ERC165 { + struct RoleData { + mapping(address account => bool) hasRole; + bytes32 adminRole; + } + + mapping(bytes32 role => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with an {AccessControlUnauthorizedAccount} error including the required role. + */ + modifier onlyRole(bytes32 role) { + _checkRole(role); + _; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view virtual returns (bool) { + return _roles[role].hasRole[account]; + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` + * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. + */ + function _checkRole(bytes32 role) internal view virtual { + _checkRole(role, _msgSender()); + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` + * is missing `role`. + */ + function _checkRole(bytes32 role, address account) internal view virtual { + if (!hasRole(role, account)) { + revert AccessControlUnauthorizedAccount(account, role); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleGranted} event. + */ + function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleRevoked} event. + */ + function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been revoked `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + * + * May emit a {RoleRevoked} event. + */ + function renounceRole(bytes32 role, address callerConfirmation) public virtual { + if (callerConfirmation != _msgSender()) { + revert AccessControlBadConfirmation(); + } + + _revokeRole(role, callerConfirmation); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + /** + * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. + * + * Internal function without access restriction. + * + * May emit a {RoleGranted} event. + */ + function _grantRole(bytes32 role, address account) internal virtual returns (bool) { + if (!hasRole(role, account)) { + _roles[role].hasRole[account] = true; + emit RoleGranted(role, account, _msgSender()); + return true; + } else { + return false; + } + } + + /** + * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. + * + * Internal function without access restriction. + * + * May emit a {RoleRevoked} event. + */ + function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { + if (hasRole(role, account)) { + _roles[role].hasRole[account] = false; + emit RoleRevoked(role, account, _msgSender()); + return true; + } else { + return false; + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/access/IAccessControl.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/access/IAccessControl.sol new file mode 100644 index 0000000..2ac89ca --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/access/IAccessControl.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) + +pragma solidity ^0.8.20; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev The `account` is missing a role. + */ + error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); + + /** + * @dev The caller of a function is not the expected one. + * + * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. + */ + error AccessControlBadConfirmation(); + + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + */ + event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + */ + function renounceRole(bytes32 role, address callerConfirmation) external; +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/access/Ownable.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/access/Ownable.sol new file mode 100644 index 0000000..bd96f66 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/access/Ownable.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) + +pragma solidity ^0.8.20; + +import {Context} from "../utils/Context.sol"; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * The initial owner is set to the address provided by the deployer. This can + * later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +abstract contract Ownable is Context { + address private _owner; + + /** + * @dev The caller account is not authorized to perform an operation. + */ + error OwnableUnauthorizedAccount(address account); + + /** + * @dev The owner is not a valid owner account. (eg. `address(0)`) + */ + error OwnableInvalidOwner(address owner); + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the address provided by the deployer as the initial owner. + */ + constructor(address initialOwner) { + if (initialOwner == address(0)) { + revert OwnableInvalidOwner(address(0)); + } + _transferOwnership(initialOwner); + } + + /** + * @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 { + if (owner() != _msgSender()) { + revert OwnableUnauthorizedAccount(_msgSender()); + } + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby disabling 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 { + if (newOwner == address(0)) { + revert OwnableInvalidOwner(address(0)); + } + _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); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC165.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC165.sol new file mode 100644 index 0000000..944dd0d --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC165.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "../utils/introspection/IERC165.sol"; diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC4906.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC4906.sol new file mode 100644 index 0000000..bc008e3 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC4906.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "./IERC165.sol"; +import {IERC721} from "./IERC721.sol"; + +/// @title EIP-721 Metadata Update Extension +interface IERC4906 is IERC165, IERC721 { + /// @dev This event emits when the metadata of a token is changed. + /// So that the third-party platforms such as NFT market could + /// timely update the images and related attributes of the NFT. + event MetadataUpdate(uint256 _tokenId); + + /// @dev This event emits when the metadata of a range of tokens is changed. + /// So that the third-party platforms such as NFT market could + /// timely update the images and related attributes of the NFTs. + event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC5267.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC5267.sol new file mode 100644 index 0000000..47a9fd5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC5267.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol) + +pragma solidity ^0.8.20; + +interface IERC5267 { + /** + * @dev MAY be emitted to signal that the domain could have changed. + */ + event EIP712DomainChanged(); + + /** + * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 + * signature. + */ + function eip712Domain() + external + view + returns ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 salt, + uint256[] memory extensions + ); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC721.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC721.sol new file mode 100644 index 0000000..0ea735b --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/IERC721.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol) + +pragma solidity ^0.8.20; + +import {IERC721} from "../token/ERC721/IERC721.sol"; diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/draft-IERC1822.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/draft-IERC1822.sol new file mode 100644 index 0000000..4d0f0f8 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/draft-IERC1822.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol) + +pragma solidity ^0.8.20; + +/** + * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified + * proxy whose upgrades are fully controlled by the current implementation. + */ +interface IERC1822Proxiable { + /** + * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation + * address. + * + * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks + * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this + * function revert if invoked through a proxy. + */ + function proxiableUUID() external view returns (bytes32); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/draft-IERC6093.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/draft-IERC6093.sol new file mode 100644 index 0000000..f6990e6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/interfaces/draft-IERC6093.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) +pragma solidity ^0.8.20; + +/** + * @dev Standard ERC20 Errors + * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. + */ +interface IERC20Errors { + /** + * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + * @param balance Current balance for the interacting account. + * @param needed Minimum amount required to perform a transfer. + */ + error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); + + /** + * @dev Indicates a failure with the token `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + */ + error ERC20InvalidSender(address sender); + + /** + * @dev Indicates a failure with the token `receiver`. Used in transfers. + * @param receiver Address to which tokens are being transferred. + */ + error ERC20InvalidReceiver(address receiver); + + /** + * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. + * @param spender Address that may be allowed to operate on tokens without being their owner. + * @param allowance Amount of tokens a `spender` is allowed to operate with. + * @param needed Minimum amount required to perform a transfer. + */ + error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); + + /** + * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. + * @param approver Address initiating an approval operation. + */ + error ERC20InvalidApprover(address approver); + + /** + * @dev Indicates a failure with the `spender` to be approved. Used in approvals. + * @param spender Address that may be allowed to operate on tokens without being their owner. + */ + error ERC20InvalidSpender(address spender); +} + +/** + * @dev Standard ERC721 Errors + * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. + */ +interface IERC721Errors { + /** + * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. + * Used in balance queries. + * @param owner Address of the current owner of a token. + */ + error ERC721InvalidOwner(address owner); + + /** + * @dev Indicates a `tokenId` whose `owner` is the zero address. + * @param tokenId Identifier number of a token. + */ + error ERC721NonexistentToken(uint256 tokenId); + + /** + * @dev Indicates an error related to the ownership over a particular token. Used in transfers. + * @param sender Address whose tokens are being transferred. + * @param tokenId Identifier number of a token. + * @param owner Address of the current owner of a token. + */ + error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); + + /** + * @dev Indicates a failure with the token `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + */ + error ERC721InvalidSender(address sender); + + /** + * @dev Indicates a failure with the token `receiver`. Used in transfers. + * @param receiver Address to which tokens are being transferred. + */ + error ERC721InvalidReceiver(address receiver); + + /** + * @dev Indicates a failure with the `operator`’s approval. Used in transfers. + * @param operator Address that may be allowed to operate on tokens without being their owner. + * @param tokenId Identifier number of a token. + */ + error ERC721InsufficientApproval(address operator, uint256 tokenId); + + /** + * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. + * @param approver Address initiating an approval operation. + */ + error ERC721InvalidApprover(address approver); + + /** + * @dev Indicates a failure with the `operator` to be approved. Used in approvals. + * @param operator Address that may be allowed to operate on tokens without being their owner. + */ + error ERC721InvalidOperator(address operator); +} + +/** + * @dev Standard ERC1155 Errors + * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. + */ +interface IERC1155Errors { + /** + * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + * @param balance Current balance for the interacting account. + * @param needed Minimum amount required to perform a transfer. + * @param tokenId Identifier number of a token. + */ + error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); + + /** + * @dev Indicates a failure with the token `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + */ + error ERC1155InvalidSender(address sender); + + /** + * @dev Indicates a failure with the token `receiver`. Used in transfers. + * @param receiver Address to which tokens are being transferred. + */ + error ERC1155InvalidReceiver(address receiver); + + /** + * @dev Indicates a failure with the `operator`’s approval. Used in transfers. + * @param operator Address that may be allowed to operate on tokens without being their owner. + * @param owner Address of the current owner of a token. + */ + error ERC1155MissingApprovalForAll(address operator, address owner); + + /** + * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. + * @param approver Address initiating an approval operation. + */ + error ERC1155InvalidApprover(address approver); + + /** + * @dev Indicates a failure with the `operator` to be approved. Used in approvals. + * @param operator Address that may be allowed to operate on tokens without being their owner. + */ + error ERC1155InvalidOperator(address operator); + + /** + * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. + * Used in batch transfers. + * @param idsLength Length of the array of token identifiers + * @param valuesLength Length of the array of token amounts + */ + error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol new file mode 100644 index 0000000..0fa61b5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Proxy.sol) + +pragma solidity ^0.8.20; + +import {Proxy} from "../Proxy.sol"; +import {ERC1967Utils} from "./ERC1967Utils.sol"; + +/** + * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an + * implementation address that can be changed. This address is stored in storage in the location specified by + * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the + * implementation behind the proxy. + */ +contract ERC1967Proxy is Proxy { + /** + * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`. + * + * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an + * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor. + * + * Requirements: + * + * - If `data` is empty, `msg.value` must be zero. + */ + constructor(address implementation, bytes memory _data) payable { + ERC1967Utils.upgradeToAndCall(implementation, _data); + } + + /** + * @dev Returns the current implementation address. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using + * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` + */ + function _implementation() internal view virtual override returns (address) { + return ERC1967Utils.getImplementation(); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol new file mode 100644 index 0000000..e55bae2 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol @@ -0,0 +1,193 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol) + +pragma solidity ^0.8.20; + +import {IBeacon} from "../beacon/IBeacon.sol"; +import {Address} from "../../utils/Address.sol"; +import {StorageSlot} from "../../utils/StorageSlot.sol"; + +/** + * @dev This abstract contract provides getters and event emitting update functions for + * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. + */ +library ERC1967Utils { + // We re-declare ERC-1967 events here because they can't be used directly from IERC1967. + // This will be fixed in Solidity 0.8.21. At that point we should remove these events. + /** + * @dev Emitted when the implementation is upgraded. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Emitted when the admin account has changed. + */ + event AdminChanged(address previousAdmin, address newAdmin); + + /** + * @dev Emitted when the beacon is changed. + */ + event BeaconUpgraded(address indexed beacon); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1. + */ + // solhint-disable-next-line private-vars-leading-underscore + bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev The `implementation` of the proxy is invalid. + */ + error ERC1967InvalidImplementation(address implementation); + + /** + * @dev The `admin` of the proxy is invalid. + */ + error ERC1967InvalidAdmin(address admin); + + /** + * @dev The `beacon` of the proxy is invalid. + */ + error ERC1967InvalidBeacon(address beacon); + + /** + * @dev An upgrade function sees `msg.value > 0` that may be lost. + */ + error ERC1967NonPayable(); + + /** + * @dev Returns the current implementation address. + */ + function getImplementation() internal view returns (address) { + return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value; + } + + /** + * @dev Stores a new address in the EIP1967 implementation slot. + */ + function _setImplementation(address newImplementation) private { + if (newImplementation.code.length == 0) { + revert ERC1967InvalidImplementation(newImplementation); + } + StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation; + } + + /** + * @dev Performs implementation upgrade with additional setup call if data is nonempty. + * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected + * to avoid stuck value in the contract. + * + * Emits an {IERC1967-Upgraded} event. + */ + function upgradeToAndCall(address newImplementation, bytes memory data) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + + if (data.length > 0) { + Address.functionDelegateCall(newImplementation, data); + } else { + _checkNonPayable(); + } + } + + /** + * @dev Storage slot with the admin of the contract. + * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. + */ + // solhint-disable-next-line private-vars-leading-underscore + bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + + /** + * @dev Returns the current admin. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using + * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` + */ + function getAdmin() internal view returns (address) { + return StorageSlot.getAddressSlot(ADMIN_SLOT).value; + } + + /** + * @dev Stores a new address in the EIP1967 admin slot. + */ + function _setAdmin(address newAdmin) private { + if (newAdmin == address(0)) { + revert ERC1967InvalidAdmin(address(0)); + } + StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin; + } + + /** + * @dev Changes the admin of the proxy. + * + * Emits an {IERC1967-AdminChanged} event. + */ + function changeAdmin(address newAdmin) internal { + emit AdminChanged(getAdmin(), newAdmin); + _setAdmin(newAdmin); + } + + /** + * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. + * This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1. + */ + // solhint-disable-next-line private-vars-leading-underscore + bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; + + /** + * @dev Returns the current beacon. + */ + function getBeacon() internal view returns (address) { + return StorageSlot.getAddressSlot(BEACON_SLOT).value; + } + + /** + * @dev Stores a new beacon in the EIP1967 beacon slot. + */ + function _setBeacon(address newBeacon) private { + if (newBeacon.code.length == 0) { + revert ERC1967InvalidBeacon(newBeacon); + } + + StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon; + + address beaconImplementation = IBeacon(newBeacon).implementation(); + if (beaconImplementation.code.length == 0) { + revert ERC1967InvalidImplementation(beaconImplementation); + } + } + + /** + * @dev Change the beacon and trigger a setup call if data is nonempty. + * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected + * to avoid stuck value in the contract. + * + * Emits an {IERC1967-BeaconUpgraded} event. + * + * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since + * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for + * efficiency. + */ + function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal { + _setBeacon(newBeacon); + emit BeaconUpgraded(newBeacon); + + if (data.length > 0) { + Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); + } else { + _checkNonPayable(); + } + } + + /** + * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract + * if an upgrade doesn't perform an initialization call. + */ + function _checkNonPayable() private { + if (msg.value > 0) { + revert ERC1967NonPayable(); + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/Proxy.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/Proxy.sol new file mode 100644 index 0000000..0e73651 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/Proxy.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol) + +pragma solidity ^0.8.20; + +/** + * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM + * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to + * be specified by overriding the virtual {_implementation} function. + * + * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a + * different contract through the {_delegate} function. + * + * The success and return data of the delegated call will be returned back to the caller of the proxy. + */ +abstract contract Proxy { + /** + * @dev Delegates the current call to `implementation`. + * + * This function does not return to its internal call site, it will return directly to the external caller. + */ + function _delegate(address implementation) internal virtual { + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev This is a virtual function that should be overridden so it returns the address to which the fallback + * function and {_fallback} should delegate. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates the current call to the address returned by `_implementation()`. + * + * This function does not return to its internal call site, it will return directly to the external caller. + */ + function _fallback() internal virtual { + _delegate(_implementation()); + } + + /** + * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other + * function in the contract matches the call data. + */ + fallback() external payable virtual { + _fallback(); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol new file mode 100644 index 0000000..05e26e5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/BeaconProxy.sol) + +pragma solidity ^0.8.20; + +import {IBeacon} from "./IBeacon.sol"; +import {Proxy} from "../Proxy.sol"; +import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol"; + +/** + * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}. + * + * The beacon address can only be set once during construction, and cannot be changed afterwards. It is stored in an + * immutable variable to avoid unnecessary storage reads, and also in the beacon storage slot specified by + * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] so that it can be accessed externally. + * + * CAUTION: Since the beacon address can never be changed, you must ensure that you either control the beacon, or trust + * the beacon to not upgrade the implementation maliciously. + * + * IMPORTANT: Do not use the implementation logic to modify the beacon storage slot. Doing so would leave the proxy in + * an inconsistent state where the beacon storage slot does not match the beacon address. + */ +contract BeaconProxy is Proxy { + // An immutable address for the beacon to avoid unnecessary SLOADs before each delegate call. + address private immutable _beacon; + + /** + * @dev Initializes the proxy with `beacon`. + * + * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This + * will typically be an encoded function call, and allows initializing the storage of the proxy like a Solidity + * constructor. + * + * Requirements: + * + * - `beacon` must be a contract with the interface {IBeacon}. + * - If `data` is empty, `msg.value` must be zero. + */ + constructor(address beacon, bytes memory data) payable { + ERC1967Utils.upgradeBeaconToAndCall(beacon, data); + _beacon = beacon; + } + + /** + * @dev Returns the current implementation address of the associated beacon. + */ + function _implementation() internal view virtual override returns (address) { + return IBeacon(_getBeacon()).implementation(); + } + + /** + * @dev Returns the beacon. + */ + function _getBeacon() internal view virtual returns (address) { + return _beacon; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/beacon/IBeacon.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/beacon/IBeacon.sol new file mode 100644 index 0000000..36a3c76 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/beacon/IBeacon.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol) + +pragma solidity ^0.8.20; + +/** + * @dev This is the interface that {BeaconProxy} expects of its beacon. + */ +interface IBeacon { + /** + * @dev Must return an address that can be used as a delegate call target. + * + * {UpgradeableBeacon} will check that this address is a contract. + */ + function implementation() external view returns (address); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol new file mode 100644 index 0000000..8db9bd2 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/UpgradeableBeacon.sol) + +pragma solidity ^0.8.20; + +import {IBeacon} from "./IBeacon.sol"; +import {Ownable} from "../../access/Ownable.sol"; + +/** + * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their + * implementation contract, which is where they will delegate all function calls. + * + * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon. + */ +contract UpgradeableBeacon is IBeacon, Ownable { + address private _implementation; + + /** + * @dev The `implementation` of the beacon is invalid. + */ + error BeaconInvalidImplementation(address implementation); + + /** + * @dev Emitted when the implementation returned by the beacon is changed. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Sets the address of the initial implementation, and the initial owner who can upgrade the beacon. + */ + constructor(address implementation_, address initialOwner) Ownable(initialOwner) { + _setImplementation(implementation_); + } + + /** + * @dev Returns the current implementation address. + */ + function implementation() public view virtual returns (address) { + return _implementation; + } + + /** + * @dev Upgrades the beacon to a new implementation. + * + * Emits an {Upgraded} event. + * + * Requirements: + * + * - msg.sender must be the owner of the contract. + * - `newImplementation` must be a contract. + */ + function upgradeTo(address newImplementation) public virtual onlyOwner { + _setImplementation(newImplementation); + } + + /** + * @dev Sets the implementation contract address for this beacon + * + * Requirements: + * + * - `newImplementation` must be a contract. + */ + function _setImplementation(address newImplementation) private { + if (newImplementation.code.length == 0) { + revert BeaconInvalidImplementation(newImplementation); + } + _implementation = newImplementation; + emit Upgraded(newImplementation); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/ERC20.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/ERC20.sol new file mode 100644 index 0000000..1fde527 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/ERC20.sol @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) + +pragma solidity ^0.8.20; + +import {IERC20} from "./IERC20.sol"; +import {IERC20Metadata} from "./extensions/IERC20Metadata.sol"; +import {Context} from "../../utils/Context.sol"; +import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol"; + +/** + * @dev Implementation of the {IERC20} interface. + * + * This implementation is agnostic to the way tokens are created. This means + * that a supply mechanism has to be added in a derived contract using {_mint}. + * + * TIP: For a detailed writeup see our guide + * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * The default value of {decimals} is 18. To change this, you should override + * this function so it returns a different value. + * + * We have followed general OpenZeppelin Contracts guidelines: functions revert + * instead returning `false` on failure. This behavior is nonetheless + * conventional and does not conflict with the expectations of ERC20 + * applications. + * + * Additionally, an {Approval} event is emitted on calls to {transferFrom}. + * This allows applications to reconstruct the allowance for all accounts just + * by listening to said events. Other implementations of the EIP may not emit + * these events, as it isn't required by the specification. + */ +abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { + mapping(address account => uint256) private _balances; + + mapping(address account => mapping(address spender => uint256)) private _allowances; + + uint256 private _totalSupply; + + string private _name; + string private _symbol; + + /** + * @dev Sets the values for {name} and {symbol}. + * + * All two of these values are immutable: they can only be set once during + * construction. + */ + constructor(string memory name_, string memory symbol_) { + _name = name_; + _symbol = symbol_; + } + + /** + * @dev Returns the name of the token. + */ + function name() public view virtual returns (string memory) { + return _name; + } + + /** + * @dev Returns the symbol of the token, usually a shorter version of the + * name. + */ + function symbol() public view virtual returns (string memory) { + return _symbol; + } + + /** + * @dev Returns the number of decimals used to get its user representation. + * For example, if `decimals` equals `2`, a balance of `505` tokens should + * be displayed to a user as `5.05` (`505 / 10 ** 2`). + * + * Tokens usually opt for a value of 18, imitating the relationship between + * Ether and Wei. This is the default value returned by this function, unless + * it's overridden. + * + * NOTE: This information is only used for _display_ purposes: it in + * no way affects any of the arithmetic of the contract, including + * {IERC20-balanceOf} and {IERC20-transfer}. + */ + function decimals() public view virtual returns (uint8) { + return 18; + } + + /** + * @dev See {IERC20-totalSupply}. + */ + function totalSupply() public view virtual returns (uint256) { + return _totalSupply; + } + + /** + * @dev See {IERC20-balanceOf}. + */ + function balanceOf(address account) public view virtual returns (uint256) { + return _balances[account]; + } + + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `to` cannot be the zero address. + * - the caller must have a balance of at least `value`. + */ + function transfer(address to, uint256 value) public virtual returns (bool) { + address owner = _msgSender(); + _transfer(owner, to, value); + return true; + } + + /** + * @dev See {IERC20-allowance}. + */ + function allowance(address owner, address spender) public view virtual returns (uint256) { + return _allowances[owner][spender]; + } + + /** + * @dev See {IERC20-approve}. + * + * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on + * `transferFrom`. This is semantically equivalent to an infinite approval. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 value) public virtual returns (bool) { + address owner = _msgSender(); + _approve(owner, spender, value); + return true; + } + + /** + * @dev See {IERC20-transferFrom}. + * + * Emits an {Approval} event indicating the updated allowance. This is not + * required by the EIP. See the note at the beginning of {ERC20}. + * + * NOTE: Does not update the allowance if the current allowance + * is the maximum `uint256`. + * + * Requirements: + * + * - `from` and `to` cannot be the zero address. + * - `from` must have a balance of at least `value`. + * - the caller must have allowance for ``from``'s tokens of at least + * `value`. + */ + function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { + address spender = _msgSender(); + _spendAllowance(from, spender, value); + _transfer(from, to, value); + return true; + } + + /** + * @dev Moves a `value` amount of tokens from `from` to `to`. + * + * This internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * NOTE: This function is not virtual, {_update} should be overridden instead. + */ + function _transfer(address from, address to, uint256 value) internal { + if (from == address(0)) { + revert ERC20InvalidSender(address(0)); + } + if (to == address(0)) { + revert ERC20InvalidReceiver(address(0)); + } + _update(from, to, value); + } + + /** + * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` + * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding + * this function. + * + * Emits a {Transfer} event. + */ + function _update(address from, address to, uint256 value) internal virtual { + if (from == address(0)) { + // Overflow check required: The rest of the code assumes that totalSupply never overflows + _totalSupply += value; + } else { + uint256 fromBalance = _balances[from]; + if (fromBalance < value) { + revert ERC20InsufficientBalance(from, fromBalance, value); + } + unchecked { + // Overflow not possible: value <= fromBalance <= totalSupply. + _balances[from] = fromBalance - value; + } + } + + if (to == address(0)) { + unchecked { + // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. + _totalSupply -= value; + } + } else { + unchecked { + // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. + _balances[to] += value; + } + } + + emit Transfer(from, to, value); + } + + /** + * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). + * Relies on the `_update` mechanism + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * NOTE: This function is not virtual, {_update} should be overridden instead. + */ + function _mint(address account, uint256 value) internal { + if (account == address(0)) { + revert ERC20InvalidReceiver(address(0)); + } + _update(address(0), account, value); + } + + /** + * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. + * Relies on the `_update` mechanism. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * NOTE: This function is not virtual, {_update} should be overridden instead + */ + function _burn(address account, uint256 value) internal { + if (account == address(0)) { + revert ERC20InvalidSender(address(0)); + } + _update(account, address(0), value); + } + + /** + * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. + * + * This internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + * + * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. + */ + function _approve(address owner, address spender, uint256 value) internal { + _approve(owner, spender, value, true); + } + + /** + * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. + * + * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by + * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any + * `Approval` event during `transferFrom` operations. + * + * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to + * true using the following override: + * ``` + * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { + * super._approve(owner, spender, value, true); + * } + * ``` + * + * Requirements are the same as {_approve}. + */ + function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { + if (owner == address(0)) { + revert ERC20InvalidApprover(address(0)); + } + if (spender == address(0)) { + revert ERC20InvalidSpender(address(0)); + } + _allowances[owner][spender] = value; + if (emitEvent) { + emit Approval(owner, spender, value); + } + } + + /** + * @dev Updates `owner` s allowance for `spender` based on spent `value`. + * + * Does not update the allowance value in case of infinite allowance. + * Revert if not enough allowance is available. + * + * Does not emit an {Approval} event. + */ + function _spendAllowance(address owner, address spender, uint256 value) internal virtual { + uint256 currentAllowance = allowance(owner, spender); + if (currentAllowance != type(uint256).max) { + if (currentAllowance < value) { + revert ERC20InsufficientAllowance(spender, currentAllowance, value); + } + unchecked { + _approve(owner, spender, currentAllowance - value, false); + } + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/IERC20.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/IERC20.sol new file mode 100644 index 0000000..db01cf4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/IERC20.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); + + /** + * @dev Returns the value of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the value of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves a `value` amount of tokens from the caller's account to `to`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address to, uint256 value) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets a `value` amount of tokens as the allowance of `spender` over the + * caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 value) external returns (bool); + + /** + * @dev Moves a `value` amount of tokens from `from` to `to` using the + * allowance mechanism. `value` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address from, address to, uint256 value) external returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol new file mode 100644 index 0000000..4d482d8 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol) + +pragma solidity ^0.8.20; + +import {ERC20} from "../ERC20.sol"; +import {Context} from "../../../utils/Context.sol"; + +/** + * @dev Extension of {ERC20} that allows token holders to destroy both their own + * tokens and those that they have an allowance for, in a way that can be + * recognized off-chain (via event analysis). + */ +abstract contract ERC20Burnable is Context, ERC20 { + /** + * @dev Destroys a `value` amount of tokens from the caller. + * + * See {ERC20-_burn}. + */ + function burn(uint256 value) public virtual { + _burn(_msgSender(), value); + } + + /** + * @dev Destroys a `value` amount of tokens from `account`, deducting from + * the caller's allowance. + * + * See {ERC20-_burn} and {ERC20-allowance}. + * + * Requirements: + * + * - the caller must have allowance for ``accounts``'s tokens of at least + * `value`. + */ + function burnFrom(address account, uint256 value) public virtual { + _spendAllowance(account, _msgSender(), value); + _burn(account, value); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol new file mode 100644 index 0000000..1a38cba --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) + +pragma solidity ^0.8.20; + +import {IERC20} from "../IERC20.sol"; + +/** + * @dev Interface for the optional metadata functions from the ERC20 standard. + */ +interface IERC20Metadata is IERC20 { + /** + * @dev Returns the name of the token. + */ + function name() external view returns (string memory); + + /** + * @dev Returns the symbol of the token. + */ + function symbol() external view returns (string memory); + + /** + * @dev Returns the decimals places of the token. + */ + function decimals() external view returns (uint8); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol new file mode 100644 index 0000000..5af4810 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in + * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. + * + * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by + * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't + * need to send a transaction, and thus is not required to hold Ether at all. + * + * ==== Security Considerations + * + * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature + * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be + * considered as an intention to spend the allowance in any specific way. The second is that because permits have + * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should + * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be + * generally recommended is: + * + * ```solidity + * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { + * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} + * doThing(..., value); + * } + * + * function doThing(..., uint256 value) public { + * token.safeTransferFrom(msg.sender, address(this), value); + * ... + * } + * ``` + * + * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of + * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also + * {SafeERC20-safeTransferFrom}). + * + * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so + * contracts should have entry points that don't rely on permit. + */ +interface IERC20Permit { + /** + * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, + * given ``owner``'s signed approval. + * + * IMPORTANT: The same issues {IERC20-approve} has related to transaction + * ordering also apply here. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `deadline` must be a timestamp in the future. + * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` + * over the EIP712-formatted function arguments. + * - the signature must use ``owner``'s current nonce (see {nonces}). + * + * For more information on the signature format, see the + * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP + * section]. + * + * CAUTION: See Security Considerations above. + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @dev Returns the current nonce for `owner`. This value must be + * included whenever a signature is generated for {permit}. + * + * Every successful call to {permit} increases ``owner``'s nonce by one. This + * prevents a signature from being used multiple times. + */ + function nonces(address owner) external view returns (uint256); + + /** + * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. + */ + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view returns (bytes32); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol new file mode 100644 index 0000000..bb65709 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) + +pragma solidity ^0.8.20; + +import {IERC20} from "../IERC20.sol"; +import {IERC20Permit} from "../extensions/IERC20Permit.sol"; +import {Address} from "../../../utils/Address.sol"; + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using Address for address; + + /** + * @dev An operation with an ERC20 token failed. + */ + error SafeERC20FailedOperation(address token); + + /** + * @dev Indicates a failed `decreaseAllowance` request. + */ + error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); + + /** + * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeTransfer(IERC20 token, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); + } + + /** + * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the + * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. + */ + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); + } + + /** + * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + uint256 oldAllowance = token.allowance(address(this), spender); + forceApprove(token, spender, oldAllowance + value); + } + + /** + * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no + * value, non-reverting calls are assumed to be successful. + */ + function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { + unchecked { + uint256 currentAllowance = token.allowance(address(this), spender); + if (currentAllowance < requestedDecrease) { + revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); + } + forceApprove(token, spender, currentAllowance - requestedDecrease); + } + } + + /** + * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval + * to be set to zero before setting it to a non-zero value, such as USDT. + */ + function forceApprove(IERC20 token, address spender, uint256 value) internal { + bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); + + if (!_callOptionalReturnBool(token, approvalCall)) { + _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); + _callOptionalReturn(token, approvalCall); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function _callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that + // the target address contains contract code and also asserts for success in the low-level call. + + bytes memory returndata = address(token).functionCall(data); + if (returndata.length != 0 && !abi.decode(returndata, (bool))) { + revert SafeERC20FailedOperation(address(token)); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + * + * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. + */ + function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false + // and not revert is the subcall reverts. + + (bool success, bytes memory returndata) = address(token).call(data); + return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/ERC721.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/ERC721.sol new file mode 100644 index 0000000..98a80e5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/ERC721.sol @@ -0,0 +1,483 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol) + +pragma solidity ^0.8.20; + +import {IERC721} from "./IERC721.sol"; +import {IERC721Receiver} from "./IERC721Receiver.sol"; +import {IERC721Metadata} from "./extensions/IERC721Metadata.sol"; +import {Context} from "../../utils/Context.sol"; +import {Strings} from "../../utils/Strings.sol"; +import {IERC165, ERC165} from "../../utils/introspection/ERC165.sol"; +import {IERC721Errors} from "../../interfaces/draft-IERC6093.sol"; + +/** + * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including + * the Metadata extension, but not including the Enumerable extension, which is available separately as + * {ERC721Enumerable}. + */ +abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { + using Strings for uint256; + + // Token name + string private _name; + + // Token symbol + string private _symbol; + + mapping(uint256 tokenId => address) private _owners; + + mapping(address owner => uint256) private _balances; + + mapping(uint256 tokenId => address) private _tokenApprovals; + + mapping(address owner => mapping(address operator => bool)) private _operatorApprovals; + + /** + * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. + */ + constructor(string memory name_, string memory symbol_) { + _name = name_; + _symbol = symbol_; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { + return + interfaceId == type(IERC721).interfaceId || + interfaceId == type(IERC721Metadata).interfaceId || + super.supportsInterface(interfaceId); + } + + /** + * @dev See {IERC721-balanceOf}. + */ + function balanceOf(address owner) public view virtual returns (uint256) { + if (owner == address(0)) { + revert ERC721InvalidOwner(address(0)); + } + return _balances[owner]; + } + + /** + * @dev See {IERC721-ownerOf}. + */ + function ownerOf(uint256 tokenId) public view virtual returns (address) { + return _requireOwned(tokenId); + } + + /** + * @dev See {IERC721Metadata-name}. + */ + function name() public view virtual returns (string memory) { + return _name; + } + + /** + * @dev See {IERC721Metadata-symbol}. + */ + function symbol() public view virtual returns (string memory) { + return _symbol; + } + + /** + * @dev See {IERC721Metadata-tokenURI}. + */ + function tokenURI(uint256 tokenId) public view virtual returns (string memory) { + _requireOwned(tokenId); + + string memory baseURI = _baseURI(); + return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : ""; + } + + /** + * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each + * token will be the concatenation of the `baseURI` and the `tokenId`. Empty + * by default, can be overridden in child contracts. + */ + function _baseURI() internal view virtual returns (string memory) { + return ""; + } + + /** + * @dev See {IERC721-approve}. + */ + function approve(address to, uint256 tokenId) public virtual { + _approve(to, tokenId, _msgSender()); + } + + /** + * @dev See {IERC721-getApproved}. + */ + function getApproved(uint256 tokenId) public view virtual returns (address) { + _requireOwned(tokenId); + + return _getApproved(tokenId); + } + + /** + * @dev See {IERC721-setApprovalForAll}. + */ + function setApprovalForAll(address operator, bool approved) public virtual { + _setApprovalForAll(_msgSender(), operator, approved); + } + + /** + * @dev See {IERC721-isApprovedForAll}. + */ + function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { + return _operatorApprovals[owner][operator]; + } + + /** + * @dev See {IERC721-transferFrom}. + */ + function transferFrom(address from, address to, uint256 tokenId) public virtual { + if (to == address(0)) { + revert ERC721InvalidReceiver(address(0)); + } + // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists + // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. + address previousOwner = _update(to, tokenId, _msgSender()); + if (previousOwner != from) { + revert ERC721IncorrectOwner(from, tokenId, previousOwner); + } + } + + /** + * @dev See {IERC721-safeTransferFrom}. + */ + function safeTransferFrom(address from, address to, uint256 tokenId) public { + safeTransferFrom(from, to, tokenId, ""); + } + + /** + * @dev See {IERC721-safeTransferFrom}. + */ + function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { + transferFrom(from, to, tokenId); + _checkOnERC721Received(from, to, tokenId, data); + } + + /** + * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist + * + * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the + * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances + * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by + * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`. + */ + function _ownerOf(uint256 tokenId) internal view virtual returns (address) { + return _owners[tokenId]; + } + + /** + * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. + */ + function _getApproved(uint256 tokenId) internal view virtual returns (address) { + return _tokenApprovals[tokenId]; + } + + /** + * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in + * particular (ignoring whether it is owned by `owner`). + * + * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this + * assumption. + */ + function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { + return + spender != address(0) && + (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); + } + + /** + * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. + * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets + * the `spender` for the specific `tokenId`. + * + * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this + * assumption. + */ + function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { + if (!_isAuthorized(owner, spender, tokenId)) { + if (owner == address(0)) { + revert ERC721NonexistentToken(tokenId); + } else { + revert ERC721InsufficientApproval(spender, tokenId); + } + } + } + + /** + * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. + * + * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that + * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. + * + * WARNING: Increasing an account's balance using this function tends to be paired with an override of the + * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership + * remain consistent with one another. + */ + function _increaseBalance(address account, uint128 value) internal virtual { + unchecked { + _balances[account] += value; + } + } + + /** + * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner + * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. + * + * The `auth` argument is optional. If the value passed is non 0, then this function will check that + * `auth` is either the owner of the token, or approved to operate on the token (by the owner). + * + * Emits a {Transfer} event. + * + * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. + */ + function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { + address from = _ownerOf(tokenId); + + // Perform (optional) operator check + if (auth != address(0)) { + _checkAuthorized(from, auth, tokenId); + } + + // Execute the update + if (from != address(0)) { + // Clear approval. No need to re-authorize or emit the Approval event + _approve(address(0), tokenId, address(0), false); + + unchecked { + _balances[from] -= 1; + } + } + + if (to != address(0)) { + unchecked { + _balances[to] += 1; + } + } + + _owners[tokenId] = to; + + emit Transfer(from, to, tokenId); + + return from; + } + + /** + * @dev Mints `tokenId` and transfers it to `to`. + * + * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible + * + * Requirements: + * + * - `tokenId` must not exist. + * - `to` cannot be the zero address. + * + * Emits a {Transfer} event. + */ + function _mint(address to, uint256 tokenId) internal { + if (to == address(0)) { + revert ERC721InvalidReceiver(address(0)); + } + address previousOwner = _update(to, tokenId, address(0)); + if (previousOwner != address(0)) { + revert ERC721InvalidSender(address(0)); + } + } + + /** + * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. + * + * Requirements: + * + * - `tokenId` must not exist. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. + * + * Emits a {Transfer} event. + */ + function _safeMint(address to, uint256 tokenId) internal { + _safeMint(to, tokenId, ""); + } + + /** + * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is + * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. + */ + function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { + _mint(to, tokenId); + _checkOnERC721Received(address(0), to, tokenId, data); + } + + /** + * @dev Destroys `tokenId`. + * The approval is cleared when the token is burned. + * This is an internal function that does not check if the sender is authorized to operate on the token. + * + * Requirements: + * + * - `tokenId` must exist. + * + * Emits a {Transfer} event. + */ + function _burn(uint256 tokenId) internal { + address previousOwner = _update(address(0), tokenId, address(0)); + if (previousOwner == address(0)) { + revert ERC721NonexistentToken(tokenId); + } + } + + /** + * @dev Transfers `tokenId` from `from` to `to`. + * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. + * + * Requirements: + * + * - `to` cannot be the zero address. + * - `tokenId` token must be owned by `from`. + * + * Emits a {Transfer} event. + */ + function _transfer(address from, address to, uint256 tokenId) internal { + if (to == address(0)) { + revert ERC721InvalidReceiver(address(0)); + } + address previousOwner = _update(to, tokenId, address(0)); + if (previousOwner == address(0)) { + revert ERC721NonexistentToken(tokenId); + } else if (previousOwner != from) { + revert ERC721IncorrectOwner(from, tokenId, previousOwner); + } + } + + /** + * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients + * are aware of the ERC721 standard to prevent tokens from being forever locked. + * + * `data` is additional data, it has no specified format and it is sent in call to `to`. + * + * This internal function is like {safeTransferFrom} in the sense that it invokes + * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. + * implement alternative mechanisms to perform token transfer, such as signature-based. + * + * Requirements: + * + * - `tokenId` token must exist and be owned by `from`. + * - `to` cannot be the zero address. + * - `from` cannot be the zero address. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. + * + * Emits a {Transfer} event. + */ + function _safeTransfer(address from, address to, uint256 tokenId) internal { + _safeTransfer(from, to, tokenId, ""); + } + + /** + * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is + * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. + */ + function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { + _transfer(from, to, tokenId); + _checkOnERC721Received(from, to, tokenId, data); + } + + /** + * @dev Approve `to` to operate on `tokenId` + * + * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is + * either the owner of the token, or approved to operate on all tokens held by this owner. + * + * Emits an {Approval} event. + * + * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. + */ + function _approve(address to, uint256 tokenId, address auth) internal { + _approve(to, tokenId, auth, true); + } + + /** + * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not + * emitted in the context of transfers. + */ + function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { + // Avoid reading the owner unless necessary + if (emitEvent || auth != address(0)) { + address owner = _requireOwned(tokenId); + + // We do not use _isAuthorized because single-token approvals should not be able to call approve + if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { + revert ERC721InvalidApprover(auth); + } + + if (emitEvent) { + emit Approval(owner, to, tokenId); + } + } + + _tokenApprovals[tokenId] = to; + } + + /** + * @dev Approve `operator` to operate on all of `owner` tokens + * + * Requirements: + * - operator can't be the address zero. + * + * Emits an {ApprovalForAll} event. + */ + function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { + if (operator == address(0)) { + revert ERC721InvalidOperator(operator); + } + _operatorApprovals[owner][operator] = approved; + emit ApprovalForAll(owner, operator, approved); + } + + /** + * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). + * Returns the owner. + * + * Overrides to ownership logic should be done to {_ownerOf}. + */ + function _requireOwned(uint256 tokenId) internal view returns (address) { + address owner = _ownerOf(tokenId); + if (owner == address(0)) { + revert ERC721NonexistentToken(tokenId); + } + return owner; + } + + /** + * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the + * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract. + * + * @param from address representing the previous owner of the given token ID + * @param to target address that will receive the tokens + * @param tokenId uint256 ID of the token to be transferred + * @param data bytes optional data to send along with the call + */ + function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { + if (to.code.length > 0) { + try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { + if (retval != IERC721Receiver.onERC721Received.selector) { + revert ERC721InvalidReceiver(to); + } + } catch (bytes memory reason) { + if (reason.length == 0) { + revert ERC721InvalidReceiver(to); + } else { + /// @solidity memory-safe-assembly + assembly { + revert(add(32, reason), mload(reason)) + } + } + } + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/IERC721.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/IERC721.sol new file mode 100644 index 0000000..12f3236 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/IERC721.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "../../utils/introspection/IERC165.sol"; + +/** + * @dev Required interface of an ERC721 compliant contract. + */ +interface IERC721 is IERC165 { + /** + * @dev Emitted when `tokenId` token is transferred from `from` to `to`. + */ + event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); + + /** + * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. + */ + event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); + + /** + * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. + */ + event ApprovalForAll(address indexed owner, address indexed operator, bool approved); + + /** + * @dev Returns the number of tokens in ``owner``'s account. + */ + function balanceOf(address owner) external view returns (uint256 balance); + + /** + * @dev Returns the owner of the `tokenId` token. + * + * Requirements: + * + * - `tokenId` must exist. + */ + function ownerOf(uint256 tokenId) external view returns (address owner); + + /** + * @dev Safely transfers `tokenId` token from `from` to `to`. + * + * Requirements: + * + * - `from` cannot be the zero address. + * - `to` cannot be the zero address. + * - `tokenId` token must exist and be owned by `from`. + * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon + * a safe transfer. + * + * Emits a {Transfer} event. + */ + function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; + + /** + * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients + * are aware of the ERC721 protocol to prevent tokens from being forever locked. + * + * Requirements: + * + * - `from` cannot be the zero address. + * - `to` cannot be the zero address. + * - `tokenId` token must exist and be owned by `from`. + * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or + * {setApprovalForAll}. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon + * a safe transfer. + * + * Emits a {Transfer} event. + */ + function safeTransferFrom(address from, address to, uint256 tokenId) external; + + /** + * @dev Transfers `tokenId` token from `from` to `to`. + * + * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 + * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must + * understand this adds an external call which potentially creates a reentrancy vulnerability. + * + * Requirements: + * + * - `from` cannot be the zero address. + * - `to` cannot be the zero address. + * - `tokenId` token must be owned by `from`. + * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. + * + * Emits a {Transfer} event. + */ + function transferFrom(address from, address to, uint256 tokenId) external; + + /** + * @dev Gives permission to `to` to transfer `tokenId` token to another account. + * The approval is cleared when the token is transferred. + * + * Only a single account can be approved at a time, so approving the zero address clears previous approvals. + * + * Requirements: + * + * - The caller must own the token or be an approved operator. + * - `tokenId` must exist. + * + * Emits an {Approval} event. + */ + function approve(address to, uint256 tokenId) external; + + /** + * @dev Approve or remove `operator` as an operator for the caller. + * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. + * + * Requirements: + * + * - The `operator` cannot be the address zero. + * + * Emits an {ApprovalForAll} event. + */ + function setApprovalForAll(address operator, bool approved) external; + + /** + * @dev Returns the account approved for `tokenId` token. + * + * Requirements: + * + * - `tokenId` must exist. + */ + function getApproved(uint256 tokenId) external view returns (address operator); + + /** + * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. + * + * See {setApprovalForAll} + */ + function isApprovedForAll(address owner, address operator) external view returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol new file mode 100644 index 0000000..f9dc133 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) + +pragma solidity ^0.8.20; + +/** + * @title ERC721 token receiver interface + * @dev Interface for any contract that wants to support safeTransfers + * from ERC721 asset contracts. + */ +interface IERC721Receiver { + /** + * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} + * by `operator` from `from`, this function is called. + * + * It must return its Solidity selector to confirm the token transfer. + * If any other value is returned or the interface is not implemented by the recipient, the transfer will be + * reverted. + * + * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. + */ + function onERC721Received( + address operator, + address from, + uint256 tokenId, + bytes calldata data + ) external returns (bytes4); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol new file mode 100644 index 0000000..2584cb5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol) + +pragma solidity ^0.8.20; + +import {ERC721} from "../ERC721.sol"; +import {Strings} from "../../../utils/Strings.sol"; +import {IERC4906} from "../../../interfaces/IERC4906.sol"; +import {IERC165} from "../../../interfaces/IERC165.sol"; + +/** + * @dev ERC721 token with storage based token URI management. + */ +abstract contract ERC721URIStorage is IERC4906, ERC721 { + using Strings for uint256; + + // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only + // defines events and does not include any external function. + bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906); + + // Optional mapping for token URIs + mapping(uint256 tokenId => string) private _tokenURIs; + + /** + * @dev See {IERC165-supportsInterface} + */ + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) { + return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId); + } + + /** + * @dev See {IERC721Metadata-tokenURI}. + */ + function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { + _requireOwned(tokenId); + + string memory _tokenURI = _tokenURIs[tokenId]; + string memory base = _baseURI(); + + // If there is no base URI, return the token URI. + if (bytes(base).length == 0) { + return _tokenURI; + } + // If both are set, concatenate the baseURI and tokenURI (via string.concat). + if (bytes(_tokenURI).length > 0) { + return string.concat(base, _tokenURI); + } + + return super.tokenURI(tokenId); + } + + /** + * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. + * + * Emits {MetadataUpdate}. + */ + function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { + _tokenURIs[tokenId] = _tokenURI; + emit MetadataUpdate(tokenId); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol new file mode 100644 index 0000000..e9e00fa --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) + +pragma solidity ^0.8.20; + +import {IERC721} from "../IERC721.sol"; + +/** + * @title ERC-721 Non-Fungible Token Standard, optional metadata extension + * @dev See https://eips.ethereum.org/EIPS/eip-721 + */ +interface IERC721Metadata is IERC721 { + /** + * @dev Returns the token collection name. + */ + function name() external view returns (string memory); + + /** + * @dev Returns the token collection symbol. + */ + function symbol() external view returns (string memory); + + /** + * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. + */ + function tokenURI(uint256 tokenId) external view returns (string memory); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Address.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Address.sol new file mode 100644 index 0000000..b7e3059 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Address.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev The ETH balance of the account is not enough to perform the operation. + */ + error AddressInsufficientBalance(address account); + + /** + * @dev There's no code at `target` (it is not a contract). + */ + error AddressEmptyCode(address target); + + /** + * @dev A call to an address target failed. The target may have reverted. + */ + error FailedInnerCall(); + + /** + * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + if (address(this).balance < amount) { + revert AddressInsufficientBalance(address(this)); + } + + (bool success, ) = recipient.call{value: amount}(""); + if (!success) { + revert FailedInnerCall(); + } + } + + /** + * @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 or custom error, it is bubbled + * up by this function (like regular Solidity function calls). However, if + * the call reverted with no returned reason, this function reverts with a + * {FailedInnerCall} error. + * + * 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. + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0); + } + + /** + * @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`. + */ + function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { + if (address(this).balance < value) { + revert AddressInsufficientBalance(address(this)); + } + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + */ + function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target + * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an + * unsuccessful call. + */ + function verifyCallResultFromTarget( + address target, + bool success, + bytes memory returndata + ) internal view returns (bytes memory) { + if (!success) { + _revert(returndata); + } else { + // only check if target is a contract if the call was successful and the return data is empty + // otherwise we already know that it was a contract + if (returndata.length == 0 && target.code.length == 0) { + revert AddressEmptyCode(target); + } + return returndata; + } + } + + /** + * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the + * revert reason or with a default {FailedInnerCall} error. + */ + function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { + if (!success) { + _revert(returndata); + } else { + return returndata; + } + } + + /** + * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. + */ + function _revert(bytes memory returndata) private pure { + // 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 FailedInnerCall(); + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Base64.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Base64.sol new file mode 100644 index 0000000..0124cdd --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Base64.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.2) (utils/Base64.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Provides a set of functions to operate with Base64 strings. + */ +library Base64 { + /** + * @dev Base64 Encoding/Decoding Table + */ + string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + /** + * @dev Converts a `bytes` to its Bytes64 `string` representation. + */ + function encode(bytes memory data) internal pure returns (string memory) { + /** + * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence + * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol + */ + if (data.length == 0) return ""; + + // Loads the table into memory + string memory table = _TABLE; + + // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter + // and split into 4 numbers of 6 bits. + // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up + // - `data.length + 2` -> Round up + // - `/ 3` -> Number of 3-bytes chunks + // - `4 *` -> 4 characters for each chunk + string memory result = new string(4 * ((data.length + 2) / 3)); + + /// @solidity memory-safe-assembly + assembly { + // Prepare the lookup table (skip the first "length" byte) + let tablePtr := add(table, 1) + + // Prepare result pointer, jump over length + let resultPtr := add(result, 0x20) + let dataPtr := data + let endPtr := add(data, mload(data)) + + // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and + // set it to zero to make sure no dirty bytes are read in that section. + let afterPtr := add(endPtr, 0x20) + let afterCache := mload(afterPtr) + mstore(afterPtr, 0x00) + + // Run over the input, 3 bytes at a time + for { + + } lt(dataPtr, endPtr) { + + } { + // Advance 3 bytes + dataPtr := add(dataPtr, 3) + let input := mload(dataPtr) + + // To write each character, shift the 3 byte (24 bits) chunk + // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) + // and apply logical AND with 0x3F to bitmask the least significant 6 bits. + // Use this as an index into the lookup table, mload an entire word + // so the desired character is in the least significant byte, and + // mstore8 this least significant byte into the result and continue. + + mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) + resultPtr := add(resultPtr, 1) // Advance + + mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) + resultPtr := add(resultPtr, 1) // Advance + + mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) + resultPtr := add(resultPtr, 1) // Advance + + mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) + resultPtr := add(resultPtr, 1) // Advance + } + + // Reset the value that was cached + mstore(afterPtr, afterCache) + + // When data `bytes` is not exactly 3 bytes long + // it is padded with `=` characters at the end + switch mod(mload(data), 3) + case 1 { + mstore8(sub(resultPtr, 1), 0x3d) + mstore8(sub(resultPtr, 2), 0x3d) + } + case 2 { + mstore8(sub(resultPtr, 1), 0x3d) + } + } + + return result; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Context.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Context.sol new file mode 100644 index 0000000..4e535fe --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Context.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address) { + return msg.sender; + } + + function _msgData() internal view virtual returns (bytes calldata) { + return msg.data; + } + + function _contextSuffixLength() internal view virtual returns (uint256) { + return 0; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Pausable.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Pausable.sol new file mode 100644 index 0000000..312f1cb --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Pausable.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) + +pragma solidity ^0.8.20; + +import {Context} from "../utils/Context.sol"; + +/** + * @dev Contract module which allows children to implement an emergency stop + * mechanism that can be triggered by an authorized account. + * + * This module is used through inheritance. It will make available the + * modifiers `whenNotPaused` and `whenPaused`, which can be applied to + * the functions of your contract. Note that they will not be pausable by + * simply including this module, only once the modifiers are put in place. + */ +abstract contract Pausable is Context { + bool private _paused; + + /** + * @dev Emitted when the pause is triggered by `account`. + */ + event Paused(address account); + + /** + * @dev Emitted when the pause is lifted by `account`. + */ + event Unpaused(address account); + + /** + * @dev The operation failed because the contract is paused. + */ + error EnforcedPause(); + + /** + * @dev The operation failed because the contract is not paused. + */ + error ExpectedPause(); + + /** + * @dev Initializes the contract in unpaused state. + */ + constructor() { + _paused = false; + } + + /** + * @dev Modifier to make a function callable only when the contract is not paused. + * + * Requirements: + * + * - The contract must not be paused. + */ + modifier whenNotPaused() { + _requireNotPaused(); + _; + } + + /** + * @dev Modifier to make a function callable only when the contract is paused. + * + * Requirements: + * + * - The contract must be paused. + */ + modifier whenPaused() { + _requirePaused(); + _; + } + + /** + * @dev Returns true if the contract is paused, and false otherwise. + */ + function paused() public view virtual returns (bool) { + return _paused; + } + + /** + * @dev Throws if the contract is paused. + */ + function _requireNotPaused() internal view virtual { + if (paused()) { + revert EnforcedPause(); + } + } + + /** + * @dev Throws if the contract is not paused. + */ + function _requirePaused() internal view virtual { + if (!paused()) { + revert ExpectedPause(); + } + } + + /** + * @dev Triggers stopped state. + * + * Requirements: + * + * - The contract must not be paused. + */ + function _pause() internal virtual whenNotPaused { + _paused = true; + emit Paused(_msgSender()); + } + + /** + * @dev Returns to normal state. + * + * Requirements: + * + * - The contract must be paused. + */ + function _unpause() internal virtual whenPaused { + _paused = false; + emit Unpaused(_msgSender()); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/ReentrancyGuard.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/ReentrancyGuard.sol new file mode 100644 index 0000000..291d92f --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/ReentrancyGuard.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuard { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant NOT_ENTERED = 1; + uint256 private constant ENTERED = 2; + + uint256 private _status; + + /** + * @dev Unauthorized reentrant call. + */ + error ReentrancyGuardReentrantCall(); + + constructor() { + _status = NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and making it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + _nonReentrantBefore(); + _; + _nonReentrantAfter(); + } + + function _nonReentrantBefore() private { + // On the first call to nonReentrant, _status will be NOT_ENTERED + if (_status == ENTERED) { + revert ReentrancyGuardReentrantCall(); + } + + // Any calls to nonReentrant after this point will fail + _status = ENTERED; + } + + function _nonReentrantAfter() private { + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + _status = NOT_ENTERED; + } + + /** + * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a + * `nonReentrant` function in the call stack. + */ + function _reentrancyGuardEntered() internal view returns (bool) { + return _status == ENTERED; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/ShortStrings.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/ShortStrings.sol new file mode 100644 index 0000000..fdfe774 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/ShortStrings.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/ShortStrings.sol) + +pragma solidity ^0.8.20; + +import {StorageSlot} from "./StorageSlot.sol"; + +// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | +// | length | 0x BB | +type ShortString is bytes32; + +/** + * @dev This library provides functions to convert short memory strings + * into a `ShortString` type that can be used as an immutable variable. + * + * Strings of arbitrary length can be optimized using this library if + * they are short enough (up to 31 bytes) by packing them with their + * length (1 byte) in a single EVM word (32 bytes). Additionally, a + * fallback mechanism can be used for every other case. + * + * Usage example: + * + * ```solidity + * contract Named { + * using ShortStrings for *; + * + * ShortString private immutable _name; + * string private _nameFallback; + * + * constructor(string memory contractName) { + * _name = contractName.toShortStringWithFallback(_nameFallback); + * } + * + * function name() external view returns (string memory) { + * return _name.toStringWithFallback(_nameFallback); + * } + * } + * ``` + */ +library ShortStrings { + // Used as an identifier for strings longer than 31 bytes. + bytes32 private constant FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF; + + error StringTooLong(string str); + error InvalidShortString(); + + /** + * @dev Encode a string of at most 31 chars into a `ShortString`. + * + * This will trigger a `StringTooLong` error is the input string is too long. + */ + function toShortString(string memory str) internal pure returns (ShortString) { + bytes memory bstr = bytes(str); + if (bstr.length > 31) { + revert StringTooLong(str); + } + return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length)); + } + + /** + * @dev Decode a `ShortString` back to a "normal" string. + */ + function toString(ShortString sstr) internal pure returns (string memory) { + uint256 len = byteLength(sstr); + // using `new string(len)` would work locally but is not memory safe. + string memory str = new string(32); + /// @solidity memory-safe-assembly + assembly { + mstore(str, len) + mstore(add(str, 0x20), sstr) + } + return str; + } + + /** + * @dev Return the length of a `ShortString`. + */ + function byteLength(ShortString sstr) internal pure returns (uint256) { + uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF; + if (result > 31) { + revert InvalidShortString(); + } + return result; + } + + /** + * @dev Encode a string into a `ShortString`, or write it to storage if it is too long. + */ + function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) { + if (bytes(value).length < 32) { + return toShortString(value); + } else { + StorageSlot.getStringSlot(store).value = value; + return ShortString.wrap(FALLBACK_SENTINEL); + } + } + + /** + * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}. + */ + function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) { + if (ShortString.unwrap(value) != FALLBACK_SENTINEL) { + return toString(value); + } else { + return store; + } + } + + /** + * @dev Return the length of a string that was encoded to `ShortString` or written to storage using + * {setWithFallback}. + * + * WARNING: This will return the "byte length" of the string. This may not reflect the actual length in terms of + * actual characters as the UTF-8 encoding of a single character can span over multiple bytes. + */ + function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) { + if (ShortString.unwrap(value) != FALLBACK_SENTINEL) { + return byteLength(value); + } else { + return bytes(store).length; + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/StorageSlot.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/StorageSlot.sol new file mode 100644 index 0000000..0841832 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/StorageSlot.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol) +// This file was procedurally generated from scripts/generate/templates/StorageSlot.js. + +pragma solidity ^0.8.20; + +/** + * @dev Library for reading and writing primitive types to specific storage slots. + * + * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. + * This library helps with reading and writing to such slots without the need for inline assembly. + * + * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. + * + * Example usage to set ERC1967 implementation slot: + * ```solidity + * contract ERC1967 { + * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + * + * function _getImplementation() internal view returns (address) { + * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; + * } + * + * function _setImplementation(address newImplementation) internal { + * require(newImplementation.code.length > 0); + * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; + * } + * } + * ``` + */ +library StorageSlot { + struct AddressSlot { + address value; + } + + struct BooleanSlot { + bool value; + } + + struct Bytes32Slot { + bytes32 value; + } + + struct Uint256Slot { + uint256 value; + } + + struct StringSlot { + string value; + } + + struct BytesSlot { + bytes value; + } + + /** + * @dev Returns an `AddressSlot` with member `value` located at `slot`. + */ + function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `BooleanSlot` with member `value` located at `slot`. + */ + function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. + */ + function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `Uint256Slot` with member `value` located at `slot`. + */ + function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `StringSlot` with member `value` located at `slot`. + */ + function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `StringSlot` representation of the string storage pointer `store`. + */ + function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := store.slot + } + } + + /** + * @dev Returns an `BytesSlot` with member `value` located at `slot`. + */ + function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. + */ + function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := store.slot + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Strings.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Strings.sol new file mode 100644 index 0000000..b2c0a40 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/Strings.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) + +pragma solidity ^0.8.20; + +import {Math} from "./math/Math.sol"; +import {SignedMath} from "./math/SignedMath.sol"; + +/** + * @dev String operations. + */ +library Strings { + bytes16 private constant HEX_DIGITS = "0123456789abcdef"; + uint8 private constant ADDRESS_LENGTH = 20; + + /** + * @dev The `value` string doesn't fit in the specified `length`. + */ + error StringsInsufficientHexLength(uint256 value, uint256 length); + + /** + * @dev Converts a `uint256` to its ASCII `string` decimal representation. + */ + function toString(uint256 value) internal pure returns (string memory) { + unchecked { + uint256 length = Math.log10(value) + 1; + string memory buffer = new string(length); + uint256 ptr; + /// @solidity memory-safe-assembly + assembly { + ptr := add(buffer, add(32, length)) + } + while (true) { + ptr--; + /// @solidity memory-safe-assembly + assembly { + mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) + } + value /= 10; + if (value == 0) break; + } + return buffer; + } + } + + /** + * @dev Converts a `int256` to its ASCII `string` decimal representation. + */ + function toStringSigned(int256 value) internal pure returns (string memory) { + return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. + */ + function toHexString(uint256 value) internal pure returns (string memory) { + unchecked { + return toHexString(value, Math.log256(value) + 1); + } + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. + */ + function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { + uint256 localValue = value; + bytes memory buffer = new bytes(2 * length + 2); + buffer[0] = "0"; + buffer[1] = "x"; + for (uint256 i = 2 * length + 1; i > 1; --i) { + buffer[i] = HEX_DIGITS[localValue & 0xf]; + localValue >>= 4; + } + if (localValue != 0) { + revert StringsInsufficientHexLength(value, length); + } + return string(buffer); + } + + /** + * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal + * representation. + */ + function toHexString(address addr) internal pure returns (string memory) { + return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); + } + + /** + * @dev Returns true if the two strings are equal. + */ + function equal(string memory a, string memory b) internal pure returns (bool) { + return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/cryptography/ECDSA.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/cryptography/ECDSA.sol new file mode 100644 index 0000000..04b3e5e --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/cryptography/ECDSA.sol @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. + * + * These functions can be used to verify that a message was signed by the holder + * of the private keys of a given address. + */ +library ECDSA { + enum RecoverError { + NoError, + InvalidSignature, + InvalidSignatureLength, + InvalidSignatureS + } + + /** + * @dev The signature derives the `address(0)`. + */ + error ECDSAInvalidSignature(); + + /** + * @dev The signature has an invalid length. + */ + error ECDSAInvalidSignatureLength(uint256 length); + + /** + * @dev The signature has an S value that is in the upper half order. + */ + error ECDSAInvalidSignatureS(bytes32 s); + + /** + * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not + * return address(0) without also returning an error description. Errors are documented using an enum (error type) + * and a bytes32 providing additional information about the error. + * + * If no error is returned, then the address can be used for verification purposes. + * + * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: + * this function rejects them by requiring the `s` value to be in the lower + * half order, and the `v` value to be either 27 or 28. + * + * IMPORTANT: `hash` _must_ be the result of a hash operation for the + * verification to be secure: it is possible to craft signatures that + * recover to arbitrary addresses for non-hashed data. A safe way to ensure + * this is by receiving a hash of the original message (which may otherwise + * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. + * + * Documentation for signature generation: + * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] + * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] + */ + function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) { + if (signature.length == 65) { + bytes32 r; + bytes32 s; + uint8 v; + // ecrecover takes the signature parameters, and the only way to get them + // currently is to use assembly. + /// @solidity memory-safe-assembly + assembly { + r := mload(add(signature, 0x20)) + s := mload(add(signature, 0x40)) + v := byte(0, mload(add(signature, 0x60))) + } + return tryRecover(hash, v, r, s); + } else { + return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length)); + } + } + + /** + * @dev Returns the address that signed a hashed message (`hash`) with + * `signature`. This address can then be used for verification purposes. + * + * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: + * this function rejects them by requiring the `s` value to be in the lower + * half order, and the `v` value to be either 27 or 28. + * + * IMPORTANT: `hash` _must_ be the result of a hash operation for the + * verification to be secure: it is possible to craft signatures that + * recover to arbitrary addresses for non-hashed data. A safe way to ensure + * this is by receiving a hash of the original message (which may otherwise + * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. + */ + function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { + (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature); + _throwError(error, errorArg); + return recovered; + } + + /** + * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. + * + * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] + */ + function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) { + unchecked { + bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); + // We do not check for an overflow here since the shift operation results in 0 or 1. + uint8 v = uint8((uint256(vs) >> 255) + 27); + return tryRecover(hash, v, r, s); + } + } + + /** + * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. + */ + function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { + (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs); + _throwError(error, errorArg); + return recovered; + } + + /** + * @dev Overload of {ECDSA-tryRecover} that receives the `v`, + * `r` and `s` signature fields separately. + */ + function tryRecover( + bytes32 hash, + uint8 v, + bytes32 r, + bytes32 s + ) internal pure returns (address, RecoverError, bytes32) { + // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature + // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines + // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most + // signatures from current libraries generate a unique signature with an s-value in the lower half order. + // + // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value + // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or + // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept + // these malleable signatures as well. + if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { + return (address(0), RecoverError.InvalidSignatureS, s); + } + + // If the signature is valid (and not malleable), return the signer address + address signer = ecrecover(hash, v, r, s); + if (signer == address(0)) { + return (address(0), RecoverError.InvalidSignature, bytes32(0)); + } + + return (signer, RecoverError.NoError, bytes32(0)); + } + + /** + * @dev Overload of {ECDSA-recover} that receives the `v`, + * `r` and `s` signature fields separately. + */ + function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { + (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s); + _throwError(error, errorArg); + return recovered; + } + + /** + * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided. + */ + function _throwError(RecoverError error, bytes32 errorArg) private pure { + if (error == RecoverError.NoError) { + return; // no error: do nothing + } else if (error == RecoverError.InvalidSignature) { + revert ECDSAInvalidSignature(); + } else if (error == RecoverError.InvalidSignatureLength) { + revert ECDSAInvalidSignatureLength(uint256(errorArg)); + } else if (error == RecoverError.InvalidSignatureS) { + revert ECDSAInvalidSignatureS(errorArg); + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/cryptography/EIP712.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/cryptography/EIP712.sol new file mode 100644 index 0000000..8e548cd --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/cryptography/EIP712.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/EIP712.sol) + +pragma solidity ^0.8.20; + +import {MessageHashUtils} from "./MessageHashUtils.sol"; +import {ShortStrings, ShortString} from "../ShortStrings.sol"; +import {IERC5267} from "../../interfaces/IERC5267.sol"; + +/** + * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. + * + * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose + * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract + * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to + * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`. + * + * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding + * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA + * ({_hashTypedDataV4}). + * + * The implementation of the domain separator was designed to be as efficient as possible while still properly updating + * the chain id to protect against replay attacks on an eventual fork of the chain. + * + * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method + * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. + * + * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain + * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the + * separator from the immutable values, which is cheaper than accessing a cached version in cold storage. + * + * @custom:oz-upgrades-unsafe-allow state-variable-immutable + */ +abstract contract EIP712 is IERC5267 { + using ShortStrings for *; + + bytes32 private constant TYPE_HASH = + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); + + // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to + // invalidate the cached domain separator if the chain id changes. + bytes32 private immutable _cachedDomainSeparator; + uint256 private immutable _cachedChainId; + address private immutable _cachedThis; + + bytes32 private immutable _hashedName; + bytes32 private immutable _hashedVersion; + + ShortString private immutable _name; + ShortString private immutable _version; + string private _nameFallback; + string private _versionFallback; + + /** + * @dev Initializes the domain separator and parameter caches. + * + * The meaning of `name` and `version` is specified in + * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: + * + * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. + * - `version`: the current major version of the signing domain. + * + * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart + * contract upgrade]. + */ + constructor(string memory name, string memory version) { + _name = name.toShortStringWithFallback(_nameFallback); + _version = version.toShortStringWithFallback(_versionFallback); + _hashedName = keccak256(bytes(name)); + _hashedVersion = keccak256(bytes(version)); + + _cachedChainId = block.chainid; + _cachedDomainSeparator = _buildDomainSeparator(); + _cachedThis = address(this); + } + + /** + * @dev Returns the domain separator for the current chain. + */ + function _domainSeparatorV4() internal view returns (bytes32) { + if (address(this) == _cachedThis && block.chainid == _cachedChainId) { + return _cachedDomainSeparator; + } else { + return _buildDomainSeparator(); + } + } + + function _buildDomainSeparator() private view returns (bytes32) { + return keccak256(abi.encode(TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this))); + } + + /** + * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this + * function returns the hash of the fully encoded EIP712 message for this domain. + * + * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: + * + * ```solidity + * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( + * keccak256("Mail(address to,string contents)"), + * mailTo, + * keccak256(bytes(mailContents)) + * ))); + * address signer = ECDSA.recover(digest, signature); + * ``` + */ + function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { + return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash); + } + + /** + * @dev See {IERC-5267}. + */ + function eip712Domain() + public + view + virtual + returns ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 salt, + uint256[] memory extensions + ) + { + return ( + hex"0f", // 01111 + _EIP712Name(), + _EIP712Version(), + block.chainid, + address(this), + bytes32(0), + new uint256[](0) + ); + } + + /** + * @dev The name parameter for the EIP712 domain. + * + * NOTE: By default this function reads _name which is an immutable value. + * It only reads from storage if necessary (in case the value is too large to fit in a ShortString). + */ + // solhint-disable-next-line func-name-mixedcase + function _EIP712Name() internal view returns (string memory) { + return _name.toStringWithFallback(_nameFallback); + } + + /** + * @dev The version parameter for the EIP712 domain. + * + * NOTE: By default this function reads _version which is an immutable value. + * It only reads from storage if necessary (in case the value is too large to fit in a ShortString). + */ + // solhint-disable-next-line func-name-mixedcase + function _EIP712Version() internal view returns (string memory) { + return _version.toStringWithFallback(_versionFallback); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol new file mode 100644 index 0000000..8836693 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MessageHashUtils.sol) + +pragma solidity ^0.8.20; + +import {Strings} from "../Strings.sol"; + +/** + * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing. + * + * The library provides methods for generating a hash of a message that conforms to the + * https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712] + * specifications. + */ +library MessageHashUtils { + /** + * @dev Returns the keccak256 digest of an EIP-191 signed data with version + * `0x45` (`personal_sign` messages). + * + * The digest is calculated by prefixing a bytes32 `messageHash` with + * `"\x19Ethereum Signed Message:\n32"` and hashing the result. It corresponds with the + * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method. + * + * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with + * keccak256, although any bytes32 value can be safely used because the final digest will + * be re-hashed. + * + * See {ECDSA-recover}. + */ + function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) { + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, "\x19Ethereum Signed Message:\n32") // 32 is the bytes-length of messageHash + mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix + digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20) + } + } + + /** + * @dev Returns the keccak256 digest of an EIP-191 signed data with version + * `0x45` (`personal_sign` messages). + * + * The digest is calculated by prefixing an arbitrary `message` with + * `"\x19Ethereum Signed Message:\n" + len(message)` and hashing the result. It corresponds with the + * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method. + * + * See {ECDSA-recover}. + */ + function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) { + return + keccak256(bytes.concat("\x19Ethereum Signed Message:\n", bytes(Strings.toString(message.length)), message)); + } + + /** + * @dev Returns the keccak256 digest of an EIP-191 signed data with version + * `0x00` (data with intended validator). + * + * The digest is calculated by prefixing an arbitrary `data` with `"\x19\x00"` and the intended + * `validator` address. Then hashing the result. + * + * See {ECDSA-recover}. + */ + function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(hex"19_00", validator, data)); + } + + /** + * @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`). + * + * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with + * `\x19\x01` and hashing the result. It corresponds to the hash signed by the + * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712. + * + * See {ECDSA-recover}. + */ + function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) { + /// @solidity memory-safe-assembly + assembly { + let ptr := mload(0x40) + mstore(ptr, hex"19_01") + mstore(add(ptr, 0x02), domainSeparator) + mstore(add(ptr, 0x22), structHash) + digest := keccak256(ptr, 0x42) + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/introspection/ERC165.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/introspection/ERC165.sol new file mode 100644 index 0000000..1e77b60 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/introspection/ERC165.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "./IERC165.sol"; + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + */ +abstract contract ERC165 is IERC165 { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/introspection/IERC165.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/introspection/IERC165.sol new file mode 100644 index 0000000..c09f31f --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/introspection/IERC165.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[EIP]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/math/Math.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/math/Math.sol new file mode 100644 index 0000000..9681524 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/math/Math.sol @@ -0,0 +1,415 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Standard math utilities missing in the Solidity language. + */ +library Math { + /** + * @dev Muldiv operation overflow. + */ + error MathOverflowedMulDiv(); + + enum Rounding { + Floor, // Toward negative infinity + Ceil, // Toward positive infinity + Trunc, // Toward zero + Expand // Away from zero + } + + /** + * @dev Returns the addition of two unsigned integers, with an overflow flag. + */ + function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + uint256 c = a + b; + if (c < a) return (false, 0); + return (true, c); + } + } + + /** + * @dev Returns the subtraction of two unsigned integers, with an overflow flag. + */ + function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + if (b > a) return (false, 0); + return (true, a - b); + } + } + + /** + * @dev Returns the multiplication of two unsigned integers, with an overflow flag. + */ + function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) return (true, 0); + uint256 c = a * b; + if (c / a != b) return (false, 0); + return (true, c); + } + } + + /** + * @dev Returns the division of two unsigned integers, with a division by zero flag. + */ + function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + if (b == 0) return (false, 0); + return (true, a / b); + } + } + + /** + * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. + */ + function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + if (b == 0) return (false, 0); + return (true, a % b); + } + } + + /** + * @dev Returns the largest of two numbers. + */ + function max(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a : b; + } + + /** + * @dev Returns the smallest of two numbers. + */ + function min(uint256 a, uint256 b) internal pure returns (uint256) { + return a < b ? a : b; + } + + /** + * @dev Returns the average of two numbers. The result is rounded towards + * zero. + */ + function average(uint256 a, uint256 b) internal pure returns (uint256) { + // (a + b) / 2 can overflow. + return (a & b) + (a ^ b) / 2; + } + + /** + * @dev Returns the ceiling of the division of two numbers. + * + * This differs from standard division with `/` in that it rounds towards infinity instead + * of rounding towards zero. + */ + function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { + if (b == 0) { + // Guarantee the same behavior as in a regular Solidity division. + return a / b; + } + + // (a + b - 1) / b can overflow on addition, so we distribute. + return a == 0 ? 0 : (a - 1) / b + 1; + } + + /** + * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or + * denominator == 0. + * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by + * Uniswap Labs also under MIT license. + */ + function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { + unchecked { + // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use + // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 + // variables such that product = prod1 * 2^256 + prod0. + uint256 prod0 = x * y; // Least significant 256 bits of the product + uint256 prod1; // Most significant 256 bits of the product + assembly { + let mm := mulmod(x, y, not(0)) + prod1 := sub(sub(mm, prod0), lt(mm, prod0)) + } + + // Handle non-overflow cases, 256 by 256 division. + if (prod1 == 0) { + // Solidity will revert if denominator == 0, unlike the div opcode on its own. + // The surrounding unchecked block does not change this fact. + // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. + return prod0 / denominator; + } + + // Make sure the result is less than 2^256. Also prevents denominator == 0. + if (denominator <= prod1) { + revert MathOverflowedMulDiv(); + } + + /////////////////////////////////////////////// + // 512 by 256 division. + /////////////////////////////////////////////// + + // Make division exact by subtracting the remainder from [prod1 prod0]. + uint256 remainder; + assembly { + // Compute remainder using mulmod. + remainder := mulmod(x, y, denominator) + + // Subtract 256 bit number from 512 bit number. + prod1 := sub(prod1, gt(remainder, prod0)) + prod0 := sub(prod0, remainder) + } + + // Factor powers of two out of denominator and compute largest power of two divisor of denominator. + // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. + + uint256 twos = denominator & (0 - denominator); + assembly { + // Divide denominator by twos. + denominator := div(denominator, twos) + + // Divide [prod1 prod0] by twos. + prod0 := div(prod0, twos) + + // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. + twos := add(div(sub(0, twos), twos), 1) + } + + // Shift in bits from prod1 into prod0. + prod0 |= prod1 * twos; + + // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such + // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for + // four bits. That is, denominator * inv = 1 mod 2^4. + uint256 inverse = (3 * denominator) ^ 2; + + // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also + // works in modular arithmetic, doubling the correct bits in each step. + inverse *= 2 - denominator * inverse; // inverse mod 2^8 + inverse *= 2 - denominator * inverse; // inverse mod 2^16 + inverse *= 2 - denominator * inverse; // inverse mod 2^32 + inverse *= 2 - denominator * inverse; // inverse mod 2^64 + inverse *= 2 - denominator * inverse; // inverse mod 2^128 + inverse *= 2 - denominator * inverse; // inverse mod 2^256 + + // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. + // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is + // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 + // is no longer required. + result = prod0 * inverse; + return result; + } + } + + /** + * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. + */ + function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { + uint256 result = mulDiv(x, y, denominator); + if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { + result += 1; + } + return result; + } + + /** + * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded + * towards zero. + * + * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). + */ + function sqrt(uint256 a) internal pure returns (uint256) { + if (a == 0) { + return 0; + } + + // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. + // + // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have + // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. + // + // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` + // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` + // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` + // + // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. + uint256 result = 1 << (log2(a) >> 1); + + // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, + // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at + // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision + // into the expected uint128 result. + unchecked { + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + return min(result, a / result); + } + } + + /** + * @notice Calculates sqrt(a), following the selected rounding direction. + */ + function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = sqrt(a); + return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); + } + } + + /** + * @dev Return the log in base 2 of a positive value rounded towards zero. + * Returns 0 if given 0. + */ + function log2(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >> 128 > 0) { + value >>= 128; + result += 128; + } + if (value >> 64 > 0) { + value >>= 64; + result += 64; + } + if (value >> 32 > 0) { + value >>= 32; + result += 32; + } + if (value >> 16 > 0) { + value >>= 16; + result += 16; + } + if (value >> 8 > 0) { + value >>= 8; + result += 8; + } + if (value >> 4 > 0) { + value >>= 4; + result += 4; + } + if (value >> 2 > 0) { + value >>= 2; + result += 2; + } + if (value >> 1 > 0) { + result += 1; + } + } + return result; + } + + /** + * @dev Return the log in base 2, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log2(value); + return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); + } + } + + /** + * @dev Return the log in base 10 of a positive value rounded towards zero. + * Returns 0 if given 0. + */ + function log10(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >= 10 ** 64) { + value /= 10 ** 64; + result += 64; + } + if (value >= 10 ** 32) { + value /= 10 ** 32; + result += 32; + } + if (value >= 10 ** 16) { + value /= 10 ** 16; + result += 16; + } + if (value >= 10 ** 8) { + value /= 10 ** 8; + result += 8; + } + if (value >= 10 ** 4) { + value /= 10 ** 4; + result += 4; + } + if (value >= 10 ** 2) { + value /= 10 ** 2; + result += 2; + } + if (value >= 10 ** 1) { + result += 1; + } + } + return result; + } + + /** + * @dev Return the log in base 10, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log10(value); + return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); + } + } + + /** + * @dev Return the log in base 256 of a positive value rounded towards zero. + * Returns 0 if given 0. + * + * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. + */ + function log256(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >> 128 > 0) { + value >>= 128; + result += 16; + } + if (value >> 64 > 0) { + value >>= 64; + result += 8; + } + if (value >> 32 > 0) { + value >>= 32; + result += 4; + } + if (value >> 16 > 0) { + value >>= 16; + result += 2; + } + if (value >> 8 > 0) { + result += 1; + } + } + return result; + } + + /** + * @dev Return the log in base 256, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log256(value); + return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); + } + } + + /** + * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. + */ + function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { + return uint8(rounding) % 2 == 1; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/math/SignedMath.sol b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/math/SignedMath.sol new file mode 100644 index 0000000..66a6151 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/@openzeppelin/contracts/utils/math/SignedMath.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Standard signed math utilities missing in the Solidity language. + */ +library SignedMath { + /** + * @dev Returns the largest of two signed numbers. + */ + function max(int256 a, int256 b) internal pure returns (int256) { + return a > b ? a : b; + } + + /** + * @dev Returns the smallest of two signed numbers. + */ + function min(int256 a, int256 b) internal pure returns (int256) { + return a < b ? a : b; + } + + /** + * @dev Returns the average of two signed numbers without overflow. + * The result is rounded towards zero. + */ + function average(int256 a, int256 b) internal pure returns (int256) { + // Formula from the book "Hacker's Delight" + int256 x = (a & b) + ((a ^ b) >> 1); + return x + (int256(uint256(x) >> 255) & (a ^ b)); + } + + /** + * @dev Returns the absolute unsigned value of a signed value. + */ + function abs(int256 n) internal pure returns (uint256) { + unchecked { + // must be unchecked in order to support `n = type(int256).min` + return uint256(n >= 0 ? n : -n); + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/AlltraCustomBridge.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/AlltraCustomBridge.sol new file mode 100644 index 0000000..6a1aca6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/AlltraCustomBridge.sol @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./interfaces/IAlltraTransport.sol"; + +/** + * @title AlltraCustomBridge + * @notice Custom transport for 138 <-> ALL Mainnet (651940). Locks tokens and emits event; no CCIP. + * @dev Deploy at same address on 138 and 651940 via CREATE2. On 138: lock + emit LockForAlltra. + * Off-chain relayer or contract on 651940 completes mint/unlock. On 651940: implement + * unlockOrMint (called by relayer or same contract) to complete the flow. + */ +contract AlltraCustomBridge is IAlltraTransport, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE"); + uint256 public constant ALL_MAINNET_CHAIN_ID = 651940; + + mapping(bytes32 => LockRecord) public locks; + mapping(bytes32 => bool) public releasedOnAlltra; // on 651940: prevent double release + mapping(address => uint256) public nonces; + bool private _hasRelayer; + + struct LockRecord { + address sender; + address token; + uint256 amount; + address recipient; + uint256 createdAt; + bool released; + } + + event LockForAlltra( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + address recipient, + uint256 sourceChainId + ); + + event UnlockOnAlltra( + bytes32 indexed requestId, + address indexed recipient, + address indexed token, + uint256 amount + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(RELAYER_ROLE, admin); + _hasRelayer = true; + } + + /** + * @notice Lock tokens and emit event for relay to ALL Mainnet. Does not use CCIP. + */ + function lockAndRelay( + address token, + uint256 amount, + address recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(recipient != address(0), "zero recipient"); + require(amount > 0, "zero amount"); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + recipient, + nonces[msg.sender]++, + block.chainid, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "insufficient value"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + locks[requestId] = LockRecord({ + sender: msg.sender, + token: token, + amount: amount, + recipient: recipient, + createdAt: block.timestamp, + released: false + }); + + emit LockForAlltra(requestId, msg.sender, token, amount, recipient, block.chainid); + return requestId; + } + + function isConfigured() external view override returns (bool) { + return _hasRelayer; + } + + /** + * @notice On ALL Mainnet (651940): release tokens to recipient after relay proof. + * @dev Only RELAYER_ROLE; in production, verify merkle proof or signature from source chain. + * Uses releasedOnAlltra[requestId] to prevent double release on this chain. + */ + function releaseOnAlltra( + bytes32 requestId, + address token, + uint256 amount, + address recipient + ) external onlyRole(RELAYER_ROLE) nonReentrant { + require(!releasedOnAlltra[requestId], "already released"); + releasedOnAlltra[requestId] = true; + + if (token == address(0)) { + (bool sent,) = payable(recipient).call{value: amount}(""); + require(sent, "transfer failed"); + } else { + IERC20(token).safeTransfer(recipient, amount); + } + + emit UnlockOnAlltra(requestId, recipient, token, amount); + } + + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/BridgeOrchestrator.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/BridgeOrchestrator.sol new file mode 100644 index 0000000..327ec2b --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/BridgeOrchestrator.sol @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../registry/UniversalAssetRegistry.sol"; +import "./UniversalCCIPBridge.sol"; + +/** + * @title BridgeOrchestrator + * @notice Routes bridge requests to appropriate asset-specific bridges + * @dev Central routing layer for multi-asset bridge system + */ +contract BridgeOrchestrator is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant ROUTER_ADMIN_ROLE = keccak256("ROUTER_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + // Core dependencies + UniversalAssetRegistry public assetRegistry; + UniversalCCIPBridge public defaultBridge; + + // Asset type to bridge mapping + mapping(bytes32 => address) public assetTypeToBridge; + mapping(address => bool) public isRegisteredBridge; + + // Routing statistics + struct RoutingStats { + uint256 totalBridges; + uint256 successfulBridges; + uint256 failedBridges; + uint256 lastBridgeTime; + } + + mapping(address => RoutingStats) public bridgeStats; + mapping(UniversalAssetRegistry.AssetType => RoutingStats) public assetTypeStats; + + event BridgeRouted( + address indexed token, + UniversalAssetRegistry.AssetType assetType, + address indexed bridgeContract, + bytes32 indexed messageId + ); + + event AssetTypeBridgeRegistered( + bytes32 indexed assetTypeHash, + UniversalAssetRegistry.AssetType assetType, + address bridgeContract + ); + + event BridgeUnregistered( + bytes32 indexed assetTypeHash, + address bridgeContract + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + address _assetRegistry, + address _defaultBridge, + address admin + ) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + require(_assetRegistry != address(0), "Zero registry"); + require(_defaultBridge != address(0), "Zero bridge"); + + assetRegistry = UniversalAssetRegistry(_assetRegistry); + defaultBridge = UniversalCCIPBridge(payable(_defaultBridge)); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ROUTER_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Route bridge request to appropriate bridge + */ + function bridge( + UniversalCCIPBridge.BridgeOperation calldata op + ) external payable returns (bytes32 messageId) { + // Get asset information + UniversalAssetRegistry.UniversalAsset memory asset = assetRegistry.getAsset(op.token); + require(asset.isActive, "Asset not active"); + + // Get bridge contract for this asset type + bytes32 assetTypeHash = bytes32(uint256(asset.assetType)); + address bridgeContract = assetTypeToBridge[assetTypeHash]; + + // Use default bridge if no specialized bridge + if (bridgeContract == address(0)) { + bridgeContract = address(defaultBridge); + } + + require(isRegisteredBridge[bridgeContract], "Bridge not registered"); + + // Forward call to specialized bridge + (bool success, bytes memory data) = bridgeContract.call{value: msg.value}( + abi.encodeWithSelector( + UniversalCCIPBridge.bridge.selector, + op + ) + ); + + require(success, "Bridge call failed"); + messageId = abi.decode(data, (bytes32)); + + // Update statistics + _updateStats(bridgeContract, asset.assetType, true); + + emit BridgeRouted(op.token, asset.assetType, bridgeContract, messageId); + + return messageId; + } + + /** + * @notice Register asset type bridge + */ + function registerAssetTypeBridge( + UniversalAssetRegistry.AssetType assetType, + address bridgeContract + ) external onlyRole(ROUTER_ADMIN_ROLE) { + require(bridgeContract != address(0), "Zero address"); + require(bridgeContract.code.length > 0, "Not a contract"); + + bytes32 assetTypeHash = bytes32(uint256(assetType)); + assetTypeToBridge[assetTypeHash] = bridgeContract; + isRegisteredBridge[bridgeContract] = true; + + emit AssetTypeBridgeRegistered(assetTypeHash, assetType, bridgeContract); + } + + /** + * @notice Unregister bridge + */ + function unregisterBridge( + UniversalAssetRegistry.AssetType assetType + ) external onlyRole(ROUTER_ADMIN_ROLE) { + bytes32 assetTypeHash = bytes32(uint256(assetType)); + address bridgeContract = assetTypeToBridge[assetTypeHash]; + + delete assetTypeToBridge[assetTypeHash]; + // Note: We don't remove from isRegisteredBridge in case it's used elsewhere + + emit BridgeUnregistered(assetTypeHash, bridgeContract); + } + + /** + * @notice Update routing statistics + */ + function _updateStats( + address bridgeContract, + UniversalAssetRegistry.AssetType assetType, + bool success + ) internal { + RoutingStats storage bridgeStat = bridgeStats[bridgeContract]; + RoutingStats storage typeStat = assetTypeStats[assetType]; + + bridgeStat.totalBridges++; + typeStat.totalBridges++; + + if (success) { + bridgeStat.successfulBridges++; + typeStat.successfulBridges++; + } else { + bridgeStat.failedBridges++; + typeStat.failedBridges++; + } + + bridgeStat.lastBridgeTime = block.timestamp; + typeStat.lastBridgeTime = block.timestamp; + } + + /** + * @notice Set default bridge + */ + function setDefaultBridge(address _defaultBridge) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(_defaultBridge != address(0), "Zero address"); + defaultBridge = UniversalCCIPBridge(payable(_defaultBridge)); + isRegisteredBridge[_defaultBridge] = true; + } + + // View functions + + function getBridgeForAssetType(UniversalAssetRegistry.AssetType assetType) + external view returns (address) { + bytes32 assetTypeHash = bytes32(uint256(assetType)); + address bridge = assetTypeToBridge[assetTypeHash]; + return bridge != address(0) ? bridge : address(defaultBridge); + } + + function getBridgeStats(address bridgeContract) + external view returns (RoutingStats memory) { + return bridgeStats[bridgeContract]; + } + + function getAssetTypeStats(UniversalAssetRegistry.AssetType assetType) + external view returns (RoutingStats memory) { + return assetTypeStats[assetType]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/CommodityCCIPBridge.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/CommodityCCIPBridge.sol new file mode 100644 index 0000000..3565c92 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/CommodityCCIPBridge.sol @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "./UniversalCCIPBridge.sol"; + +/** + * @title CommodityCCIPBridge + * @notice Specialized bridge for commodity-backed tokens (gold, oil, etc.) + * @dev Includes certificate validation and physical delivery coordination + */ +contract CommodityCCIPBridge is UniversalCCIPBridge { + + // Certificate registry (authenticity verification) + mapping(address => mapping(bytes32 => bool)) public validCertificates; + mapping(address => mapping(bytes32 => CertificateInfo)) public certificates; + + struct CertificateInfo { + bytes32 certificateHash; + address custodian; + uint256 quantity; + string commodityType; + uint256 issuedAt; + uint256 expiresAt; + bool isValid; + } + + // Custodian registry + mapping(address => address) public tokenCustodians; + mapping(address => bool) public approvedCustodians; + + // Physical delivery tracking + struct DeliveryRequest { + bytes32 messageId; + address token; + uint256 amount; + address requester; + string deliveryAddress; + uint256 requestedAt; + DeliveryStatus status; + } + + enum DeliveryStatus { + Requested, + Confirmed, + InTransit, + Delivered, + Cancelled + } + + mapping(bytes32 => DeliveryRequest) public deliveryRequests; + bytes32[] public deliveryIds; + + event CertificateRegistered( + address indexed token, + bytes32 indexed certificateHash, + address custodian + ); + + event PhysicalDeliveryRequested( + bytes32 indexed deliveryId, + bytes32 indexed messageId, + address token, + uint256 amount + ); + + event DeliveryStatusUpdated( + bytes32 indexed deliveryId, + DeliveryStatus status + ); + + /** + * @notice Bridge commodity token with certificate validation + */ + function bridgeCommodity( + address token, + uint256 amount, + uint64 destinationChain, + address recipient, + bytes32 certificateHash, + bytes calldata custodianSignature + ) external nonReentrant returns (bytes32 messageId) { + // Verify asset is Commodity type + UniversalAssetRegistry.UniversalAsset memory asset = assetRegistry.getAsset(token); + require(asset.assetType == UniversalAssetRegistry.AssetType.Commodity, "Not commodity"); + require(asset.isActive, "Asset not active"); + + // Verify certificate + require(validCertificates[token][certificateHash], "Invalid certificate"); + + CertificateInfo memory cert = certificates[token][certificateHash]; + require(cert.isValid, "Certificate not valid"); + require(block.timestamp < cert.expiresAt, "Certificate expired"); + require(cert.quantity >= amount, "Certificate insufficient"); + + // Verify custodian + require(approvedCustodians[cert.custodian], "Custodian not approved"); + + // Verify custodian signature + _verifyCustodianSignature(token, amount, certificateHash, custodianSignature, cert.custodian); + + // Execute bridge + BridgeOperation memory op = BridgeOperation({ + token: token, + amount: amount, + destinationChain: destinationChain, + recipient: recipient, + assetType: bytes32(uint256(UniversalAssetRegistry.AssetType.Commodity)), + usePMM: true, // Commodities can use PMM + useVault: false, + complianceProof: abi.encode(certificateHash), + vaultInstructions: "" + }); + + messageId = this.bridge(op); + + return messageId; + } + + /** + * @notice Initiate physical delivery of commodity + */ + function initiatePhysicalDelivery( + bytes32 messageId, + string calldata deliveryAddress + ) external returns (bytes32 deliveryId) { + require(messageId != bytes32(0), "Invalid message ID"); + + deliveryId = keccak256(abi.encode(messageId, msg.sender, block.timestamp)); + + // This would integrate with off-chain logistics systems + deliveryRequests[deliveryId] = DeliveryRequest({ + messageId: messageId, + token: address(0), // Would be fetched from bridge record + amount: 0, // Would be fetched from bridge record + requester: msg.sender, + deliveryAddress: deliveryAddress, + requestedAt: block.timestamp, + status: DeliveryStatus.Requested + }); + + deliveryIds.push(deliveryId); + + emit PhysicalDeliveryRequested(deliveryId, messageId, address(0), 0); + + return deliveryId; + } + + /** + * @notice Update physical delivery status + */ + function updateDeliveryStatus( + bytes32 deliveryId, + DeliveryStatus status + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + require(deliveryRequests[deliveryId].requestedAt > 0, "Delivery not found"); + + deliveryRequests[deliveryId].status = status; + + emit DeliveryStatusUpdated(deliveryId, status); + } + + /** + * @notice Verify custodian signature + */ + function _verifyCustodianSignature( + address token, + uint256 amount, + bytes32 certificateHash, + bytes memory signature, + address custodian + ) internal view { + // In production, this would use EIP-712 signature verification + // For now, simplified check + require(signature.length > 0, "Missing signature"); + require(custodian != address(0), "Invalid custodian"); + } + + // Admin functions + + function registerCertificate( + address token, + bytes32 certificateHash, + address custodian, + uint256 quantity, + string calldata commodityType, + uint256 expiresAt + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + validCertificates[token][certificateHash] = true; + + certificates[token][certificateHash] = CertificateInfo({ + certificateHash: certificateHash, + custodian: custodian, + quantity: quantity, + commodityType: commodityType, + issuedAt: block.timestamp, + expiresAt: expiresAt, + isValid: true + }); + + emit CertificateRegistered(token, certificateHash, custodian); + } + + function approveCustodian(address custodian, bool approved) external onlyRole(DEFAULT_ADMIN_ROLE) { + approvedCustodians[custodian] = approved; + } + + function revokeCertificate(address token, bytes32 certificateHash) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + validCertificates[token][certificateHash] = false; + certificates[token][certificateHash].isValid = false; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/EtherlinkRelayReceiver.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/EtherlinkRelayReceiver.sol new file mode 100644 index 0000000..778abea --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/EtherlinkRelayReceiver.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title EtherlinkRelayReceiver + * @notice Relay-compatible receiver on Etherlink (chain 42793). Accepts relayMintOrUnlock from off-chain relay. + * @dev When CCIP does not support Etherlink, custom relay monitors source and calls this contract. + * Idempotency via messageId; only RELAYER_ROLE can call. + */ +contract EtherlinkRelayReceiver is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE"); + + mapping(bytes32 => bool) public processed; + + event RelayMintOrUnlock( + bytes32 indexed messageId, + address indexed token, + address indexed recipient, + uint256 amount + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(RELAYER_ROLE, admin); + } + + /** + * @notice Mint or unlock tokens to recipient. Only relayer; idempotent per messageId. + * @param messageId Source chain message id (for idempotency). + * @param token Token address (address(0) for native). + * @param recipient Recipient on Etherlink. + * @param amount Amount to transfer. + */ + function relayMintOrUnlock( + bytes32 messageId, + address token, + address recipient, + uint256 amount + ) external onlyRole(RELAYER_ROLE) nonReentrant { + require(!processed[messageId], "already processed"); + require(recipient != address(0), "zero recipient"); + require(amount > 0, "zero amount"); + processed[messageId] = true; + + if (token == address(0)) { + (bool sent,) = payable(recipient).call{value: amount}(""); + require(sent, "transfer failed"); + } else { + IERC20(token).safeTransfer(recipient, amount); + } + + emit RelayMintOrUnlock(messageId, token, recipient, amount); + } + + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/GRUCCIPBridge.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/GRUCCIPBridge.sol new file mode 100644 index 0000000..13d9eda --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/GRUCCIPBridge.sol @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "./UniversalCCIPBridge.sol"; +import "../vault/libraries/GRUConstants.sol"; + +/** + * @title GRUCCIPBridge + * @notice Specialized bridge for Global Reserve Unit (GRU) tokens + * @dev Supports layer conversions (M00/M0/M1) and XAU triangulation + */ +contract GRUCCIPBridge is UniversalCCIPBridge { + using GRUConstants for *; + + struct GRUBridgeOperation { + address token; + uint256 amount; + uint64 destinationChain; + address recipient; + string sourceLayer; + string targetLayer; + bool useXAUTriangulation; + } + + event GRULayerConversion( + bytes32 indexed messageId, + string sourceLayer, + string targetLayer, + uint256 sourceAmount, + uint256 targetAmount + ); + + event GRUCrossCurrencyBridge( + bytes32 indexed messageId, + address sourceToken, + address destToken, + uint256 amount + ); + + /** + * @notice Bridge GRU with layer conversion + */ + function bridgeGRUWithConversion( + address token, + string calldata sourceLayer, + uint256 amount, + uint64 destinationChain, + string calldata targetLayer, + address recipient + ) external nonReentrant returns (bytes32 messageId) { + require(GRUConstants.isValidGRULayer(sourceLayer), "Invalid source layer"); + require(GRUConstants.isValidGRULayer(targetLayer), "Invalid target layer"); + + UniversalAssetRegistry.UniversalAsset memory asset = assetRegistry.getAsset(token); + require(asset.assetType == UniversalAssetRegistry.AssetType.GRU, "Not GRU asset"); + require(asset.isActive, "Asset not active"); + + uint256 targetAmount = _convertGRULayers(sourceLayer, targetLayer, amount); + + BridgeOperation memory op = BridgeOperation({ + token: token, + amount: amount, + destinationChain: destinationChain, + recipient: recipient, + assetType: bytes32(uint256(UniversalAssetRegistry.AssetType.GRU)), + usePMM: false, + useVault: false, + complianceProof: "", + vaultInstructions: "" + }); + + messageId = this.bridge(op); + + emit GRULayerConversion(messageId, sourceLayer, targetLayer, amount, targetAmount); + + return messageId; + } + + /** + * @notice Convert between GRU layers + */ + function _convertGRULayers( + string memory sourceLayer, + string memory targetLayer, + uint256 amount + ) internal pure returns (uint256) { + bytes32 sourceHash = keccak256(bytes(sourceLayer)); + bytes32 targetHash = keccak256(bytes(targetLayer)); + bytes32 m00Hash = keccak256(bytes(GRUConstants.GRU_M00)); + bytes32 m0Hash = keccak256(bytes(GRUConstants.GRU_M0)); + bytes32 m1Hash = keccak256(bytes(GRUConstants.GRU_M1)); + + if (sourceHash == m00Hash && targetHash == m0Hash) { + return GRUConstants.m00ToM0(amount); + } + if (sourceHash == m00Hash && targetHash == m1Hash) { + return GRUConstants.m00ToM1(amount); + } + if (sourceHash == m0Hash && targetHash == m00Hash) { + return GRUConstants.m0ToM00(amount); + } + if (sourceHash == m0Hash && targetHash == m1Hash) { + return GRUConstants.m0ToM1(amount); + } + if (sourceHash == m1Hash && targetHash == m00Hash) { + return GRUConstants.m1ToM00(amount); + } + if (sourceHash == m1Hash && targetHash == m0Hash) { + return GRUConstants.m1ToM0(amount); + } + + return amount; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/ISO4217WCCIPBridge.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/ISO4217WCCIPBridge.sol new file mode 100644 index 0000000..8c624d8 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/ISO4217WCCIPBridge.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "./UniversalCCIPBridge.sol"; +import "../iso4217w/interfaces/IISO4217WToken.sol"; + +/** + * @title ISO4217WCCIPBridge + * @notice Specialized bridge for ISO-4217W eMoney/CBDC tokens + * @dev Enforces KYC compliance and reserve backing verification + */ +contract ISO4217WCCIPBridge is UniversalCCIPBridge { + + mapping(address => bool) public kycVerified; + mapping(address => uint256) public kycExpiration; + mapping(string => bool) public allowedJurisdictions; + mapping(address => string) public userJurisdictions; + mapping(address => uint256) public verifiedReserves; + + event KYCVerified(address indexed user, uint256 expirationTime); + event KYCRevoked(address indexed user); + event JurisdictionEnabled(string indexed jurisdiction); + event ReserveVerified(address indexed token, uint256 amount); + + function bridgeISO4217W( + address token, + uint256 amount, + uint64 destinationChain, + address recipient, + bytes calldata complianceProof + ) external nonReentrant returns (bytes32 messageId) { + UniversalAssetRegistry.UniversalAsset memory asset = assetRegistry.getAsset(token); + require(asset.assetType == UniversalAssetRegistry.AssetType.ISO4217W, "Not ISO-4217W"); + require(asset.isActive, "Asset not active"); + + require(_checkKYC(msg.sender), "KYC required"); + require(_checkKYC(recipient), "Recipient KYC required"); + + string memory senderJurisdiction = userJurisdictions[msg.sender]; + string memory recipientJurisdiction = userJurisdictions[recipient]; + require( + allowedJurisdictions[senderJurisdiction] && + allowedJurisdictions[recipientJurisdiction], + "Jurisdiction not allowed" + ); + + require(_verifyReserveBacking(token, amount), "Insufficient reserves"); + + BridgeOperation memory op = BridgeOperation({ + token: token, + amount: amount, + destinationChain: destinationChain, + recipient: recipient, + assetType: bytes32(uint256(UniversalAssetRegistry.AssetType.ISO4217W)), + usePMM: false, + useVault: false, + complianceProof: complianceProof, + vaultInstructions: "" + }); + + messageId = this.bridge(op); + + return messageId; + } + + function _verifyReserveBacking(address token, uint256 amount) internal view returns (bool) { + try IISO4217WToken(token).verifiedReserve() returns (uint256 reserve) { + return reserve >= amount; + } catch { + return verifiedReserves[token] >= amount; + } + } + + function _checkKYC(address user) internal view returns (bool) { + return kycVerified[user] && block.timestamp < kycExpiration[user]; + } + + function setKYCStatus(address user, bool status, uint256 expirationTime) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + kycVerified[user] = status; + kycExpiration[user] = expirationTime; + + if (status) { + emit KYCVerified(user, expirationTime); + } else { + emit KYCRevoked(user); + } + } + + function enableJurisdiction(string calldata jurisdiction) external onlyRole(DEFAULT_ADMIN_ROLE) { + allowedJurisdictions[jurisdiction] = true; + emit JurisdictionEnabled(jurisdiction); + } + + function setUserJurisdiction(address user, string calldata jurisdiction) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + userJurisdictions[user] = jurisdiction; + } + + function updateVerifiedReserve(address token, uint256 reserve) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + verifiedReserves[token] = reserve; + emit ReserveVerified(token, reserve); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/TwoWayTokenBridgeL1.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/TwoWayTokenBridgeL1.sol new file mode 100644 index 0000000..71ad72c --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/TwoWayTokenBridgeL1.sol @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "../ccip/IRouterClient.sol"; + +interface IERC20 { + function transferFrom(address from, address to, uint256 amount) external returns (bool); + function transfer(address to, uint256 amount) external returns (bool); + function approve(address spender, uint256 amount) external returns (bool); + function balanceOf(address account) external view returns (uint256); +} + +/** + * @title TwoWayTokenBridgeL1 + * @notice L1/LMain chain side: locks canonical tokens and triggers CCIP message to mint on L2 + * @dev Uses escrow for locked tokens; release on inbound messages + */ +contract TwoWayTokenBridgeL1 { + IRouterClient public immutable ccipRouter; + address public immutable canonicalToken; + address public feeToken; // LINK + address public admin; + + struct DestinationConfig { + uint64 chainSelector; + address l2Bridge; + bool enabled; + } + + mapping(uint64 => DestinationConfig) public destinations; + uint64[] public destinationChains; + + mapping(bytes32 => bool) public processed; // replay protection + + event Locked(address indexed user, uint256 amount); + event Released(address indexed recipient, uint256 amount); + event CcipSend(bytes32 indexed messageId, uint64 destChain, address recipient, uint256 amount); + event DestinationAdded(uint64 chainSelector, address l2Bridge); + event DestinationUpdated(uint64 chainSelector, address l2Bridge); + event DestinationRemoved(uint64 chainSelector); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(ccipRouter), "only router"); + _; + } + + constructor(address _router, address _token, address _feeToken) { + require(_router != address(0) && _token != address(0) && _feeToken != address(0), "zero addr"); + ccipRouter = IRouterClient(_router); + canonicalToken = _token; + feeToken = _feeToken; + admin = msg.sender; + } + + function addDestination(uint64 chainSelector, address l2Bridge) external onlyAdmin { + require(l2Bridge != address(0), "zero l2"); + require(!destinations[chainSelector].enabled, "exists"); + destinations[chainSelector] = DestinationConfig(chainSelector, l2Bridge, true); + destinationChains.push(chainSelector); + emit DestinationAdded(chainSelector, l2Bridge); + } + + function updateDestination(uint64 chainSelector, address l2Bridge) external onlyAdmin { + require(destinations[chainSelector].enabled, "missing"); + require(l2Bridge != address(0), "zero l2"); + destinations[chainSelector].l2Bridge = l2Bridge; + emit DestinationUpdated(chainSelector, l2Bridge); + } + + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "missing"); + destinations[chainSelector].enabled = false; + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + emit DestinationRemoved(chainSelector); + } + + function updateFeeToken(address newFee) external onlyAdmin { + require(newFee != address(0), "zero"); + feeToken = newFee; + } + + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero"); + admin = newAdmin; + } + + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } + + // User-facing: lock canonical tokens and send CCIP to mint on L2 + function lockAndSend(uint64 destSelector, address recipient, uint256 amount) external returns (bytes32 messageId) { + require(amount > 0 && recipient != address(0), "bad args"); + DestinationConfig memory dest = destinations[destSelector]; + require(dest.enabled, "dest disabled"); + + // Pull tokens into escrow + require(IERC20(canonicalToken).transferFrom(msg.sender, address(this), amount), "pull fail"); + emit Locked(msg.sender, amount); + + // Encode payload + bytes memory data = abi.encode(recipient, amount); + + // Build message + IRouterClient.EVM2AnyMessage memory m = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.l2Bridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: feeToken, + extraArgs: "" + }); + + // Get fee and pay in LINK held by user: bridge expects to have LINK pre-funded by admin or via separate topup + uint256 fee = ccipRouter.getFee(destSelector, m); + if (fee > 0) { + // Expect admin has prefunded LINK to this contract; otherwise approvals/pull pattern can be added + require(IERC20(feeToken).approve(address(ccipRouter), fee), "fee approve"); + } + + (messageId, ) = ccipRouter.ccipSend(destSelector, m); + emit CcipSend(messageId, destSelector, recipient, amount); + return messageId; + } + + // Inbound from L2: release canonical tokens to recipient + function ccipReceive(IRouterClient.Any2EVMMessage calldata message) external onlyRouter { + require(!processed[message.messageId], "replayed"); + processed[message.messageId] = true; + (address recipient, uint256 amount) = abi.decode(message.data, (address, uint256)); + require(recipient != address(0) && amount > 0, "bad msg"); + require(IERC20(canonicalToken).transfer(recipient, amount), "release fail"); + emit Released(recipient, amount); + } +} + + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/TwoWayTokenBridgeL2.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/TwoWayTokenBridgeL2.sol new file mode 100644 index 0000000..d676520 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/TwoWayTokenBridgeL2.sol @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import "../ccip/IRouterClient.sol"; + +interface IMintableERC20 { + function mint(address to, uint256 amount) external; + function burnFrom(address from, uint256 amount) external; + function balanceOf(address account) external view returns (uint256); +} + +/** + * @title TwoWayTokenBridgeL2 + * @notice L2/secondary chain side: mints mirrored tokens on inbound and burns on outbound + */ +contract TwoWayTokenBridgeL2 { + IRouterClient public immutable ccipRouter; + address public immutable mirroredToken; + address public feeToken; // LINK + address public admin; + + struct DestinationConfig { + uint64 chainSelector; + address l1Bridge; + bool enabled; + } + + mapping(uint64 => DestinationConfig) public destinations; + uint64[] public destinationChains; + mapping(bytes32 => bool) public processed; + + event Minted(address indexed recipient, uint256 amount); + event Burned(address indexed user, uint256 amount); + event CcipSend(bytes32 indexed messageId, uint64 destChain, address recipient, uint256 amount); + event DestinationAdded(uint64 chainSelector, address l1Bridge); + event DestinationUpdated(uint64 chainSelector, address l1Bridge); + event DestinationRemoved(uint64 chainSelector); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(ccipRouter), "only router"); + _; + } + + constructor(address _router, address _token, address _feeToken) { + require(_router != address(0) && _token != address(0) && _feeToken != address(0), "zero addr"); + ccipRouter = IRouterClient(_router); + mirroredToken = _token; + feeToken = _feeToken; + admin = msg.sender; + } + + function addDestination(uint64 chainSelector, address l1Bridge) external onlyAdmin { + require(l1Bridge != address(0), "zero l1"); + require(!destinations[chainSelector].enabled, "exists"); + destinations[chainSelector] = DestinationConfig(chainSelector, l1Bridge, true); + destinationChains.push(chainSelector); + emit DestinationAdded(chainSelector, l1Bridge); + } + + function updateDestination(uint64 chainSelector, address l1Bridge) external onlyAdmin { + require(destinations[chainSelector].enabled, "missing"); + require(l1Bridge != address(0), "zero l1"); + destinations[chainSelector].l1Bridge = l1Bridge; + emit DestinationUpdated(chainSelector, l1Bridge); + } + + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "missing"); + destinations[chainSelector].enabled = false; + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + emit DestinationRemoved(chainSelector); + } + + function updateFeeToken(address newFee) external onlyAdmin { + require(newFee != address(0), "zero"); + feeToken = newFee; + } + + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero"); + admin = newAdmin; + } + + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } + + // Inbound from L1: mint mirrored tokens to recipient + function ccipReceive(IRouterClient.Any2EVMMessage calldata message) external onlyRouter { + require(!processed[message.messageId], "replayed"); + processed[message.messageId] = true; + (address recipient, uint256 amount) = abi.decode(message.data, (address, uint256)); + require(recipient != address(0) && amount > 0, "bad msg"); + IMintableERC20(mirroredToken).mint(recipient, amount); + emit Minted(recipient, amount); + } + + // Outbound to L1: burn mirrored tokens and signal release on L1 + function burnAndSend(uint64 destSelector, address recipient, uint256 amount) external returns (bytes32 messageId) { + require(amount > 0 && recipient != address(0), "bad args"); + DestinationConfig memory dest = destinations[destSelector]; + require(dest.enabled, "dest disabled"); + + IMintableERC20(mirroredToken).burnFrom(msg.sender, amount); + emit Burned(msg.sender, amount); + + bytes memory data = abi.encode(recipient, amount); + IRouterClient.EVM2AnyMessage memory m = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.l1Bridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: feeToken, + extraArgs: "" + }); + uint256 fee = ccipRouter.getFee(destSelector, m); + if (fee > 0) { + require(IERC20(feeToken).approve(address(ccipRouter), fee), "fee approve"); + } + (messageId, ) = ccipRouter.ccipSend(destSelector, m); + emit CcipSend(messageId, destSelector, recipient, amount); + return messageId; + } +} + + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/UniversalCCIPBridge.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/UniversalCCIPBridge.sol new file mode 100644 index 0000000..3d31274 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/UniversalCCIPBridge.sol @@ -0,0 +1,350 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "../registry/UniversalAssetRegistry.sol"; +import "../ccip/IRouterClient.sol"; + +/** + * @title UniversalCCIPBridge + * @notice Main bridge contract supporting all asset types via CCIP + * @dev Extends CCIP infrastructure with dynamic asset routing and PMM integration + */ +contract UniversalCCIPBridge is + Initializable, + AccessControlUpgradeable, + ReentrancyGuardUpgradeable, + UUPSUpgradeable +{ + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + struct BridgeOperation { + address token; + uint256 amount; + uint64 destinationChain; + address recipient; + bytes32 assetType; + bool usePMM; + bool useVault; + bytes complianceProof; + bytes vaultInstructions; + } + + struct Destination { + address receiverBridge; + bool enabled; + uint256 addedAt; + } + + // Core dependencies + UniversalAssetRegistry public assetRegistry; + IRouterClient public ccipRouter; + address public liquidityManager; + address public vaultFactory; + + // State + mapping(address => mapping(uint64 => Destination)) public destinations; + mapping(address => address) public userVaults; + mapping(bytes32 => bool) public processedMessages; + mapping(address => uint256) public nonces; + + // Events + event BridgeExecuted( + bytes32 indexed messageId, + address indexed token, + address indexed sender, + uint256 amount, + uint64 destinationChain, + address recipient, + bool usedPMM + ); + + event DestinationAdded( + address indexed token, + uint64 indexed chainSelector, + address receiverBridge + ); + + event DestinationRemoved( + address indexed token, + uint64 indexed chainSelector + ); + + event MessageReceived( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + address token, + uint256 amount + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + address _assetRegistry, + address _ccipRouter, + address admin + ) external initializer { + __AccessControl_init(); + __ReentrancyGuard_init(); + __UUPSUpgradeable_init(); + + require(_assetRegistry != address(0), "Zero registry"); + + assetRegistry = UniversalAssetRegistry(_assetRegistry); + if (_ccipRouter != address(0)) { + ccipRouter = IRouterClient(_ccipRouter); + } + // If _ccipRouter is zero, set via setCCIPRouter() after deployment (enables same initData for deterministic proxy address) + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Set CCIP router (for deterministic deployment: initialize with router=0, then set per chain) + */ + function setCCIPRouter(address _ccipRouter) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(_ccipRouter != address(0), "Zero router"); + ccipRouter = IRouterClient(_ccipRouter); + } + + /** + * @notice Main bridge function with asset type routing + */ + function bridge( + BridgeOperation calldata op + ) external payable nonReentrant returns (bytes32 messageId) { + // Validate asset is registered and active + UniversalAssetRegistry.UniversalAsset memory asset = assetRegistry.getAsset(op.token); + require(asset.isActive, "Asset not active"); + require(asset.tokenAddress != address(0), "Asset not registered"); + + // Verify destination is enabled + Destination memory dest = destinations[op.token][op.destinationChain]; + require(dest.enabled, "Destination not enabled"); + require(dest.receiverBridge != address(0), "Invalid receiver"); + + // Validate amounts + require(op.amount > 0, "Invalid amount"); + require(op.amount >= asset.minBridgeAmount, "Below minimum"); + require(op.amount <= asset.maxBridgeAmount, "Above maximum"); + + // Transfer tokens from user + IERC20(op.token).safeTransferFrom(msg.sender, address(this), op.amount); + + // Execute bridge with optional PMM + if (op.usePMM && liquidityManager != address(0)) { + _executeBridgeWithPMM(op); + } + + // Execute bridge with optional vault + if (op.useVault && vaultFactory != address(0)) { + _executeBridgeWithVault(op); + } + + // Send CCIP message + messageId = _sendCCIPMessage(op, dest); + + // Increment nonce + nonces[msg.sender]++; + + emit BridgeExecuted( + messageId, + op.token, + msg.sender, + op.amount, + op.destinationChain, + op.recipient, + op.usePMM + ); + + return messageId; + } + + /** + * @notice Execute bridge with PMM liquidity + */ + function _executeBridgeWithPMM(BridgeOperation calldata op) internal { + if (liquidityManager == address(0)) return; + + // Call liquidity manager to provide liquidity + (bool success, ) = liquidityManager.call( + abi.encodeWithSignature( + "provideLiquidity(address,uint256,bytes)", + op.token, + op.amount, + "" + ) + ); + + // PMM is optional, don't revert if it fails + if (!success) { + // Log or handle PMM failure gracefully + } + } + + /** + * @notice Execute bridge with vault + */ + function _executeBridgeWithVault(BridgeOperation calldata op) internal { + if (vaultFactory == address(0)) return; + + // Get or create vault for user + address vault = userVaults[msg.sender]; + if (vault == address(0)) { + // Call vault factory to create vault + (bool success, bytes memory data) = vaultFactory.call( + abi.encodeWithSignature("createVault(address)", msg.sender) + ); + if (success) { + vault = abi.decode(data, (address)); + userVaults[msg.sender] = vault; + } + } + + // If vault exists, record operation + if (vault != address(0)) { + // Call vault to record bridge operation + (bool success, ) = vault.call( + abi.encodeWithSignature( + "recordBridgeOperation(bytes32,address,uint256,uint64)", + bytes32(0), // messageId will be set after CCIP send + op.token, + op.amount, + op.destinationChain + ) + ); + // Vault recording is optional + } + } + + /** + * @notice Send CCIP message + */ + function _sendCCIPMessage( + BridgeOperation calldata op, + Destination memory dest + ) internal returns (bytes32 messageId) { + // Encode message data + bytes memory data = abi.encode( + op.recipient, + op.amount, + msg.sender, + nonces[msg.sender] + ); + + // Prepare CCIP message + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: address(0), // Pay in native + extraArgs: "" + }); + + // Set token amount + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: op.token, + amount: op.amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + // Calculate fee + uint256 fee = ccipRouter.getFee(op.destinationChain, message); + require(address(this).balance >= fee, "Insufficient fee"); + + // Send via CCIP + (messageId, ) = ccipRouter.ccipSend{value: fee}(op.destinationChain, message); + + return messageId; + } + + /** + * @notice Add destination for token + */ + function addDestination( + address token, + uint64 chainSelector, + address receiverBridge + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + require(token != address(0), "Zero token"); + require(receiverBridge != address(0), "Zero receiver"); + + destinations[token][chainSelector] = Destination({ + receiverBridge: receiverBridge, + enabled: true, + addedAt: block.timestamp + }); + + emit DestinationAdded(token, chainSelector, receiverBridge); + } + + /** + * @notice Remove destination + */ + function removeDestination( + address token, + uint64 chainSelector + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + destinations[token][chainSelector].enabled = false; + + emit DestinationRemoved(token, chainSelector); + } + + /** + * @notice Set liquidity manager + */ + function setLiquidityManager(address _liquidityManager) external onlyRole(DEFAULT_ADMIN_ROLE) { + liquidityManager = _liquidityManager; + } + + /** + * @notice Set vault factory + */ + function setVaultFactory(address _vaultFactory) external onlyRole(DEFAULT_ADMIN_ROLE) { + vaultFactory = _vaultFactory; + } + + /** + * @notice Receive native tokens + */ + receive() external payable {} + + /** + * @notice Withdraw native tokens + */ + function withdraw() external onlyRole(DEFAULT_ADMIN_ROLE) { + payable(msg.sender).transfer(address(this).balance); + } + + // View functions + + function getDestination(address token, uint64 chainSelector) + external view returns (Destination memory) { + return destinations[token][chainSelector]; + } + + function getUserVault(address user) external view returns (address) { + return userVaults[user]; + } + + function getUserNonce(address user) external view returns (uint256) { + return nonces[user]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/VaultBridgeAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/VaultBridgeAdapter.sol new file mode 100644 index 0000000..9ecd12d --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/VaultBridgeAdapter.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./UniversalCCIPBridge.sol"; + +contract VaultBridgeAdapter is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant ADAPTER_ADMIN_ROLE = keccak256("ADAPTER_ADMIN_ROLE"); + + address public vaultFactory; + UniversalCCIPBridge public bridge; + + mapping(address => address) public userVaults; + + event VaultCreated(address indexed user, address indexed vault); + + constructor(address _vaultFactory, address _bridge, address admin) { + require(_vaultFactory != address(0), "Zero factory"); + require(_bridge != address(0), "Zero bridge"); + + vaultFactory = _vaultFactory; + bridge = UniversalCCIPBridge(payable(_bridge)); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ADAPTER_ADMIN_ROLE, admin); + } + + function getOrCreateVault(address user) public returns (address vault) { + vault = userVaults[user]; + if (vault == address(0)) { + (bool success, bytes memory data) = vaultFactory.call( + abi.encodeWithSignature("createVault(address)", user) + ); + if (success) { + vault = abi.decode(data, (address)); + userVaults[user] = vault; + emit VaultCreated(user, vault); + } + } + return vault; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/evm/AlltraAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/evm/AlltraAdapter.sol new file mode 100644 index 0000000..9828c87 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/evm/AlltraAdapter.sol @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; +import "../../interfaces/IAlltraTransport.sol"; +import "../../UniversalCCIPBridge.sol"; + +/** + * @title AlltraAdapter + * @notice Bridge adapter for ALL Mainnet (EVM-compatible) + * @dev ALL Mainnet (651940) is not supported by CCIP. Use setAlltraTransport() to set + * AlltraCustomBridge (or other IAlltraTransport) for 138 <-> 651940 flows. + * @dev Chain ID: 651940 (0x9f2a4) - https://chainlist.org/chain/651940 + */ +contract AlltraAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + + // ALL Mainnet Chain ID - confirmed from ChainList + uint256 public constant ALLTRA_MAINNET = 651940; + + UniversalCCIPBridge public universalBridge; + IAlltraTransport public alltraTransport; // When set, used for 651940 instead of CCIP + bool public isActive; + /// @notice Configurable bridge fee (default 0.001 ALL). Set via setBridgeFee() after deployment. + uint256 public bridgeFee; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(address => uint256) public nonces; + + event AlltraBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + address recipient + ); + + event AlltraBridgeConfirmed( + bytes32 indexed requestId, + bytes32 indexed alltraTxHash + ); + + constructor(address admin, address _bridge) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + universalBridge = UniversalCCIPBridge(payable(_bridge)); + isActive = true; + bridgeFee = 1000000000000000; // 0.001 ALL default; update via setBridgeFee() per ALL Mainnet fee structure + } + + /** + * @notice Set custom transport for 138 <-> 651940 (no CCIP). When set, bridge() uses this instead of UniversalCCIPBridge. + */ + function setAlltraTransport(address _transport) external onlyRole(DEFAULT_ADMIN_ROLE) { + alltraTransport = IAlltraTransport(_transport); + } + + function getChainType() external pure override returns (string memory) { + return "EVM"; // Generic chain type to distinguish from ALLTRA (orchestration layer) + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (ALLTRA_MAINNET, "ALL-Mainnet"); // Updated identifier + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + // Standard EVM address validation + if (destination.length != 20) return false; + address dest = address(bytes20(destination)); + return dest != address(0); + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + require(this.validateDestination(destination), "Invalid destination"); + + address recipientAddr = address(bytes20(destination)); + + // Generate request ID + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + recipientAddr, + nonces[msg.sender]++, + block.timestamp + )); + + // Lock tokens + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + // Create bridge request + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + // ALL Mainnet (651940) is not supported by CCIP. Use custom transport when set. + if (address(alltraTransport) != address(0) && alltraTransport.isConfigured()) { + alltraTransport.lockAndRelay{value: msg.value}(token, amount, recipientAddr); + } else { + // Fallback to UniversalCCIPBridge only if destination were CCIP-supported; 651940 is not. + revert("AlltraAdapter: set AlltraCustomBridge via setAlltraTransport for 651940"); + } + + emit AlltraBridgeInitiated(requestId, msg.sender, token, amount, recipientAddr); + + return requestId; + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + // Refund tokens + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + /// @notice Returns the current bridge fee (configurable via setBridgeFee). + /// @param token Unused; fee is global per adapter. + /// @param amount Unused. + /// @param destination Unused. + /// @return fee Current bridgeFee in wei. + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return bridgeFee; + } + + /// @notice Update bridge fee. Call after deployment when ALL Mainnet fee structure is known. + function setBridgeFee(uint256 _fee) external onlyRole(DEFAULT_ADMIN_ROLE) { + bridgeFee = _fee; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } + + function confirmBridge(bytes32 requestId, bytes32 alltraTxHash) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + + emit AlltraBridgeConfirmed(requestId, alltraTxHash); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/evm/EVMAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/evm/EVMAdapter.sol new file mode 100644 index 0000000..8a29eea --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/evm/EVMAdapter.sol @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; +import "../../UniversalCCIPBridge.sol"; + +/** + * @title EVMAdapter + * @notice Standard bridge adapter for EVM-compatible chains + * @dev Template adapter for Polygon, Arbitrum, Optimism, Base, Avalanche, BSC, Ethereum + */ +contract EVMAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + + uint256 public immutable chainId; + string public chainName; + UniversalCCIPBridge public universalBridge; + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(address => uint256) public nonces; + + event EVMBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + uint256 destinationChainId, + address recipient + ); + + event EVMBridgeConfirmed( + bytes32 indexed requestId, + bytes32 indexed txHash + ); + + constructor( + address admin, + address _bridge, + uint256 _chainId, + string memory _chainName + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + universalBridge = UniversalCCIPBridge(payable(_bridge)); + chainId = _chainId; + chainName = _chainName; + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "EVM"; + } + + function getChainIdentifier() external view override returns (uint256, string memory) { + return (chainId, chainName); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + if (destination.length != 20) return false; + address dest = address(bytes20(destination)); + return dest != address(0); + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + require(this.validateDestination(destination), "Invalid destination"); + + address recipientAddr = address(bytes20(destination)); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + recipientAddr, + chainId, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + IERC20(token).forceApprove(address(universalBridge), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + UniversalCCIPBridge.BridgeOperation memory op = UniversalCCIPBridge.BridgeOperation({ + token: token, + amount: amount, + destinationChain: uint64(chainId), + recipient: recipientAddr, + assetType: bytes32(0), + usePMM: false, + useVault: false, + complianceProof: "", + vaultInstructions: "" + }); + + bytes32 messageId = universalBridge.bridge{value: msg.value}(op); + + emit EVMBridgeInitiated(requestId, msg.sender, token, amount, chainId, recipientAddr); + + return requestId; + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } + + function confirmBridge(bytes32 requestId, bytes32 txHash) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + + emit EVMBridgeConfirmed(requestId, txHash); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/evm/XDCAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/evm/XDCAdapter.sol new file mode 100644 index 0000000..5d51776 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/evm/XDCAdapter.sol @@ -0,0 +1,213 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; +import "../../UniversalCCIPBridge.sol"; + +/** + * @title XDCAdapter + * @notice Bridge adapter for XDC Network (EVM-compatible with xdc address prefix) + * @dev XDC uses xdc prefix instead of 0x for addresses + */ +contract XDCAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + + uint256 public constant XDC_MAINNET = 50; + uint256 public constant XDC_APOTHEM_TESTNET = 51; + + UniversalCCIPBridge public universalBridge; + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(address => uint256) public nonces; + + event XDCBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string xdcDestination + ); + + event XDCBridgeConfirmed( + bytes32 indexed requestId, + bytes32 indexed xdcTxHash + ); + + constructor(address admin, address _bridge) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + universalBridge = UniversalCCIPBridge(payable(_bridge)); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "XDC"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (XDC_MAINNET, "XDC-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + string memory addr = string(destination); + bytes memory addrBytes = bytes(addr); + + if (addrBytes.length != 43) return false; + if (addrBytes[0] != 'x' || addrBytes[1] != 'd' || addrBytes[2] != 'c') return false; + + for (uint256 i = 3; i < 43; i++) { + bytes1 char = addrBytes[i]; + if (!((char >= 0x30 && char <= 0x39) || (char >= 0x61 && char <= 0x66))) { + return false; + } + } + return true; + } + + function convertXdcToEth(string memory xdcAddr) public pure returns (address) { + bytes memory xdcBytes = bytes(xdcAddr); + require(xdcBytes.length == 43, "Invalid XDC address length"); + require(xdcBytes[0] == 'x' && xdcBytes[1] == 'd' && xdcBytes[2] == 'c', "Invalid XDC prefix"); + // Parse 40 hex chars (20 bytes) to address; do not use bytes32(hexBytes) which truncates 42 bytes + uint160 result = 0; + for (uint256 i = 0; i < 40; i++) { + result = result * 16 + _hexCharToNibble(xdcBytes[i + 3]); + } + return address(result); + } + + function _hexCharToNibble(bytes1 c) internal pure returns (uint8) { + if (c >= 0x30 && c <= 0x39) return uint8(c) - 0x30; // '0'-'9' + if (c >= 0x61 && c <= 0x66) return uint8(c) - 0x61 + 10; // 'a'-'f' + if (c >= 0x41 && c <= 0x46) return uint8(c) - 0x41 + 10; // 'A'-'F' + revert("Invalid hex character"); + } + + function convertEthToXdc(address ethAddr) public pure returns (string memory) { + bytes20 addr = bytes20(ethAddr); + bytes memory hexString = new bytes(43); + hexString[0] = 'x'; + hexString[1] = 'd'; + hexString[2] = 'c'; + + for (uint256 i = 0; i < 20; i++) { + uint8 byteValue = uint8(addr[i]); + uint8 high = byteValue >> 4; + uint8 low = byteValue & 0x0f; + + hexString[3 + i * 2] = bytes1(high < 10 ? 48 + high : 87 + high); + hexString[4 + i * 2] = bytes1(low < 10 ? 48 + low : 87 + low); + } + + return string(hexString); + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory xdcDestination = string(destination); + require(this.validateDestination(destination), "Invalid XDC address"); + + address evmRecipient = convertXdcToEth(xdcDestination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + xdcDestination, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + UniversalCCIPBridge.BridgeOperation memory op = UniversalCCIPBridge.BridgeOperation({ + token: token, + amount: amount, + destinationChain: uint64(XDC_MAINNET), + recipient: evmRecipient, + assetType: bytes32(0), + usePMM: false, + useVault: false, + complianceProof: "", + vaultInstructions: "" + }); + + bytes32 messageId = universalBridge.bridge{value: msg.value}(op); + + emit XDCBridgeInitiated(requestId, msg.sender, token, amount, xdcDestination); + + return requestId; + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } + + function confirmBridge(bytes32 requestId, bytes32 xdcTxHash) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + + emit XDCBridgeConfirmed(requestId, xdcTxHash); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/hyperledger/CactiAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/hyperledger/CactiAdapter.sol new file mode 100644 index 0000000..2c34ea0 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/hyperledger/CactiAdapter.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract CactiAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant CACTI_OPERATOR_ROLE = keccak256("CACTI_OPERATOR_ROLE"); + + bool public isActive; + string public cactiApiUrl; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public cactiTxIds; + mapping(address => uint256) public nonces; + + event CactiBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string sourceLedger, + string destLedger, + string cactiTxId + ); + + event CactiBridgeConfirmed( + bytes32 indexed requestId, + string indexed cactiTxId, + string sourceLedger, + string destLedger + ); + + constructor(address admin, string memory _cactiApiUrl) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(CACTI_OPERATOR_ROLE, admin); + cactiApiUrl = _cactiApiUrl; + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Cacti"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Cacti-Interoperability"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + (string memory sourceLedger, string memory destLedger) = abi.decode(destination, (string, string)); + require(bytes(sourceLedger).length > 0 && bytes(destLedger).length > 0, "Invalid ledgers"); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + sourceLedger, + destLedger, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit CactiBridgeInitiated(requestId, msg.sender, token, amount, sourceLedger, destLedger, ""); + return requestId; + } + + function confirmCactiOperation( + bytes32 requestId, + string calldata cactiTxId, + string calldata sourceLedger, + string calldata destLedger + ) external onlyRole(CACTI_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + cactiTxIds[requestId] = cactiTxId; + + emit CactiBridgeConfirmed(requestId, cactiTxId, sourceLedger, destLedger); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/hyperledger/FabricAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/hyperledger/FabricAdapter.sol new file mode 100644 index 0000000..4eb9f98 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/hyperledger/FabricAdapter.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract FabricAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant FABRIC_OPERATOR_ROLE = keccak256("FABRIC_OPERATOR_ROLE"); + + bool public isActive; + string public fabricChannel; + string public fabricChaincode; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public fabricTxIds; + mapping(address => uint256) public nonces; + + event FabricBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string fabricChannel, + string fabricChaincode + ); + + event FabricBridgeConfirmed( + bytes32 indexed requestId, + string indexed fabricTxId, + string fabricChannel + ); + + constructor( + address admin, + string memory _fabricChannel, + string memory _fabricChaincode + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(FABRIC_OPERATOR_ROLE, admin); + fabricChannel = _fabricChannel; + fabricChaincode = _fabricChaincode; + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Fabric"; + } + + function getChainIdentifier() external view override returns (uint256 chainId, string memory identifier) { + return (0, string(abi.encodePacked("Fabric-", fabricChannel))); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + destination, + fabricChannel, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit FabricBridgeInitiated(requestId, msg.sender, token, amount, fabricChannel, fabricChaincode); + return requestId; + } + + function confirmFabricOperation( + bytes32 requestId, + string calldata fabricTxId + ) external onlyRole(FABRIC_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + fabricTxIds[requestId] = fabricTxId; + + emit FabricBridgeConfirmed(requestId, fabricTxId, fabricChannel); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 0; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/hyperledger/FireflyAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/hyperledger/FireflyAdapter.sol new file mode 100644 index 0000000..7c03fda --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/hyperledger/FireflyAdapter.sol @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +/** + * @title FireflyAdapter + * @notice Bridge adapter for Hyperledger Firefly orchestration layer + * @dev Firefly coordinates multi-chain operations - this adapter interfaces with Firefly API + */ +contract FireflyAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant FIREFLY_OPERATOR_ROLE = keccak256("FIREFLY_OPERATOR_ROLE"); + + bool public isActive; + string public fireflyNamespace; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public fireflyTxIds; + mapping(address => uint256) public nonces; + + event FireflyBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string fireflyTxId, + string namespace + ); + + event FireflyBridgeConfirmed( + bytes32 indexed requestId, + string indexed fireflyTxId, + string sourceChain + ); + + constructor(address admin, string memory _namespace) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(FIREFLY_OPERATOR_ROLE, admin); + fireflyNamespace = _namespace; + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Firefly"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Firefly-Orchestration"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + destination, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit FireflyBridgeInitiated(requestId, msg.sender, token, amount, "", fireflyNamespace); + return requestId; + } + + function confirmFireflyOperation( + bytes32 requestId, + string calldata fireflyTxId, + string calldata sourceChain + ) external onlyRole(FIREFLY_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + fireflyTxIds[requestId] = fireflyTxId; + + emit FireflyBridgeConfirmed(requestId, fireflyTxId, sourceChain); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/AlgorandAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/AlgorandAdapter.sol new file mode 100644 index 0000000..3c5aea7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/AlgorandAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract AlgorandAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event AlgorandBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event AlgorandBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Algorand"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Algorand-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit AlgorandBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit AlgorandBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/CosmosAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/CosmosAdapter.sol new file mode 100644 index 0000000..2d02e13 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/CosmosAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract CosmosAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event CosmosBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event CosmosBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Cosmos"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Cosmos-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit CosmosBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit CosmosBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/HederaAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/HederaAdapter.sol new file mode 100644 index 0000000..5583327 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/HederaAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract HederaAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event HederaBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event HederaBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Hedera"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Hedera-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit HederaBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit HederaBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/SolanaAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/SolanaAdapter.sol new file mode 100644 index 0000000..189cdf7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/SolanaAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract SolanaAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event SolanaBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event SolanaBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Solana"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Solana-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit SolanaBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit SolanaBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/StellarAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/StellarAdapter.sol new file mode 100644 index 0000000..2302430 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/StellarAdapter.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract StellarAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public stellarTxHashes; + mapping(address => uint256) public nonces; + + event StellarBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string stellarAccount + ); + + event StellarBridgeConfirmed( + bytes32 indexed requestId, + string indexed stellarTxHash, + uint256 ledgerSequence + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Stellar"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Stellar-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + string memory addr = string(destination); + bytes memory addrBytes = bytes(addr); + + // Stellar addresses: G + 55 base32 chars = 56 chars + if (addrBytes.length != 56) return false; + if (addrBytes[0] != 'G') return false; + + return true; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + require(this.validateDestination(destination), "Invalid Stellar address"); + + string memory stellarAccount = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + stellarAccount, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit StellarBridgeInitiated(requestId, msg.sender, token, amount, stellarAccount); + return requestId; + } + + function confirmStellarTransaction( + bytes32 requestId, + string calldata stellarTxHash, + uint256 ledgerSequence + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + stellarTxHashes[requestId] = stellarTxHash; + + emit StellarBridgeConfirmed(requestId, stellarTxHash, ledgerSequence); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external pure override returns (uint256 fee) { + return 100; // 0.00001 XLM (Stellar fees are very low) + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/TONAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/TONAdapter.sol new file mode 100644 index 0000000..aeed7ef --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/TONAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract TONAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event TONBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event TONBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "TON"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "TON-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit TONBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit TONBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/TezosAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/TezosAdapter.sol new file mode 100644 index 0000000..bfb657f --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/TezosAdapter.sol @@ -0,0 +1,158 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +/** + * @title TezosAdapter + * @notice Bridge adapter for Tezos L1 (native Michelson) + * @dev Lock tokens on this chain; off-chain relayer watches events and performs Tezos-side mint/transfer. + * Oracle calls confirmTransaction when Tezos tx is confirmed. + */ +contract TezosAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event TezosBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event TezosBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Tezos"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Tezos-Mainnet"); + } + + /** + * @notice Validate Tezos destination (tz1/tz2/tz3/KT1 address format; length 35-64 bytes when UTF-8) + */ + function validateDestination(bytes calldata destination) external pure override returns (bool) { + if (destination.length == 0 || destination.length > 64) return false; + // Tezos addresses: tz1, tz2, tz3 (implicit), KT1 (contract) + return destination.length >= 35 && destination.length <= 64; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + require(this.validateDestination(destination), "Invalid Tezos destination"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit TezosBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + /** + * @notice Called by oracle/relayer when Tezos tx is confirmed + */ + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit TezosBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require( + request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, + "Cannot cancel" + ); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/TronAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/TronAdapter.sol new file mode 100644 index 0000000..1a3bd35 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/TronAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract TronAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event TronBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event TronBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Tron"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Tron-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit TronBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit TronBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/XRPLAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/XRPLAdapter.sol new file mode 100644 index 0000000..c7e4082 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/adapters/non-evm/XRPLAdapter.sol @@ -0,0 +1,188 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +/** + * @title XRPLAdapter + * @notice Bridge adapter for XRP Ledger (XRPL) + * @dev Uses oracle/relayer pattern for non-EVM chain integration + */ +contract XRPLAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => bytes32) public xrplTxHashes; // requestId => xrplTxHash + mapping(address => uint256) public nonces; + + // XRPL address validation: starts with 'r', 25-35 chars + mapping(string => bool) public validatedXRPLAddresses; + + event XRPLBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string xrplDestination, + uint32 destinationTag + ); + + event XRPLBridgeConfirmed( + bytes32 indexed requestId, + bytes32 indexed xrplTxHash, + uint256 ledgerIndex + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "XRPL"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "XRPL-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + string memory addr = string(destination); + bytes memory addrBytes = bytes(addr); + + // XRPL addresses: r + 25-34 base58 chars + if (addrBytes.length < 26 || addrBytes.length > 35) return false; + if (addrBytes[0] != 'r') return false; + + // Basic validation - full validation requires base58 decoding + return true; + } + + /** + * @notice Convert XRP drops to wei (1 XRP = 1,000,000 drops) + */ + function dropsToWei(uint64 drops) public pure returns (uint256) { + return uint256(drops) * 1e12; // 1 drop = 0.000001 XRP, 1 XRP = 1e18 wei + } + + /** + * @notice Convert wei to XRP drops + */ + function weiToDrops(uint256 weiAmount) public pure returns (uint64) { + return uint64(weiAmount / 1e12); + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + require(this.validateDestination(destination), "Invalid XRPL address"); + + string memory xrplDestination = string(destination); + uint32 destinationTag = 0; + + // Parse destination tag if provided in recipient bytes + if (recipient.length >= 4) { + destinationTag = abi.decode(recipient, (uint32)); + } + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + xrplDestination, + destinationTag, + nonces[msg.sender]++, + block.timestamp + )); + + // Lock tokens on EVM side + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit XRPLBridgeInitiated(requestId, msg.sender, token, amount, xrplDestination, destinationTag); + + return requestId; + } + + /** + * @notice Oracle confirms XRPL transaction + */ + function confirmXRPLTransaction( + bytes32 requestId, + bytes32 xrplTxHash, + uint256 ledgerIndex + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + xrplTxHashes[requestId] = xrplTxHash; + + emit XRPLBridgeConfirmed(requestId, xrplTxHash, ledgerIndex); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + // Refund tokens + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external pure override returns (uint256 fee) { + // XRPL fees are very low (~0.000012 XRP per transaction) + return 12000; // 0.000012 XRP in drops + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/VaultBridgeIntegration.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/VaultBridgeIntegration.sol new file mode 100644 index 0000000..e5b9bb6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/VaultBridgeIntegration.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeRegistry.sol"; +import "../../vault/VaultFactory.sol"; +import "../../vault/tokens/DepositToken.sol"; + +/** + * @title VaultBridgeIntegration + * @notice Automatically registers vault deposit tokens with BridgeRegistry + * @dev Extends VaultFactory to auto-register deposit tokens on creation + */ +contract VaultBridgeIntegration is AccessControl { + bytes32 public constant INTEGRATOR_ROLE = keccak256("INTEGRATOR_ROLE"); + + VaultFactory public vaultFactory; + BridgeRegistry public bridgeRegistry; + + // Default bridge configuration for vault tokens + uint256 public defaultMinBridgeAmount = 1e18; // 1 token minimum + uint256 public defaultMaxBridgeAmount = 1_000_000e18; // 1M tokens maximum + uint8 public defaultRiskLevel = 50; // Medium risk + uint256 public defaultBridgeFeeBps = 10; // 0.1% default fee + + // Destination chain IDs allowed by default (Polygon, Optimism, Base, Arbitrum, Avalanche, BNB Chain, Monad) + uint256[] public defaultDestinations; + + event DepositTokenRegistered( + address indexed depositToken, + address indexed vault, + uint256[] destinationChainIds + ); + + constructor( + address admin, + address vaultFactory_, + address bridgeRegistry_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(INTEGRATOR_ROLE, admin); + + require(vaultFactory_ != address(0), "VaultBridgeIntegration: zero vault factory"); + require(bridgeRegistry_ != address(0), "VaultBridgeIntegration: zero bridge registry"); + + vaultFactory = VaultFactory(vaultFactory_); + bridgeRegistry = BridgeRegistry(bridgeRegistry_); + + // Set default destinations (EVM chains only for now) + defaultDestinations.push(137); // Polygon + defaultDestinations.push(10); // Optimism + defaultDestinations.push(8453); // Base + defaultDestinations.push(42161); // Arbitrum + defaultDestinations.push(43114); // Avalanche + defaultDestinations.push(56); // BNB Chain + defaultDestinations.push(10143); // Monad (example chain ID) + defaultDestinations.push(42793); // Etherlink (Tezos EVM L2) + } + + /** + * @notice Register a deposit token with bridge registry + * @param depositToken Deposit token address + * @param destinationChainIds Array of allowed destination chain IDs + * @param minAmount Minimum bridge amount + * @param maxAmount Maximum bridge amount + * @param riskLevel Risk level (0-255) + * @param bridgeFeeBps Bridge fee in basis points + */ + function registerDepositToken( + address depositToken, + uint256[] memory destinationChainIds, + uint256 minAmount, + uint256 maxAmount, + uint8 riskLevel, + uint256 bridgeFeeBps + ) public onlyRole(INTEGRATOR_ROLE) { + require(depositToken != address(0), "VaultBridgeIntegration: zero deposit token"); + require(destinationChainIds.length > 0, "VaultBridgeIntegration: no destinations"); + + bridgeRegistry.registerToken( + depositToken, + minAmount, + maxAmount, + destinationChainIds, + riskLevel, + bridgeFeeBps + ); + + // Find associated vault (would need to track this in VaultFactory) + // For now, emit event with deposit token only + emit DepositTokenRegistered(depositToken, address(0), destinationChainIds); + } + + /** + * @notice Register a deposit token with default configuration + * @param depositToken Deposit token address + */ + function registerDepositTokenDefault(address depositToken) external onlyRole(INTEGRATOR_ROLE) { + registerDepositToken( + depositToken, + defaultDestinations, + defaultMinBridgeAmount, + defaultMaxBridgeAmount, + defaultRiskLevel, + defaultBridgeFeeBps + ); + } + + /** + * @notice Set default bridge configuration + */ + function setDefaultMinBridgeAmount(uint256 minAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + defaultMinBridgeAmount = minAmount; + } + + function setDefaultMaxBridgeAmount(uint256 maxAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + defaultMaxBridgeAmount = maxAmount; + } + + function setDefaultRiskLevel(uint8 riskLevel) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(riskLevel <= 255, "VaultBridgeIntegration: invalid risk level"); + defaultRiskLevel = riskLevel; + } + + function setDefaultBridgeFeeBps(uint256 feeBps) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(feeBps <= 10000, "VaultBridgeIntegration: fee > 100%"); + defaultBridgeFeeBps = feeBps; + } + + function setDefaultDestinations(uint256[] memory chainIds) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(chainIds.length > 0, "VaultBridgeIntegration: no destinations"); + defaultDestinations = chainIds; + } + + /** + * @notice Get default destinations + */ + function getDefaultDestinations() external view returns (uint256[] memory) { + return defaultDestinations; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/WTokenBridgeIntegration.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/WTokenBridgeIntegration.sol new file mode 100644 index 0000000..f98df6a --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/WTokenBridgeIntegration.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeRegistry.sol"; +import "../../iso4217w/TokenFactory.sol"; +import "../../iso4217w/registry/TokenRegistry.sol"; + +/** + * @title WTokenBridgeIntegration + * @notice Automatically registers ISO-4217 W tokens with BridgeRegistry + * @dev Extends TokenFactory to auto-register W tokens on creation + */ +contract WTokenBridgeIntegration is AccessControl { + bytes32 public constant INTEGRATOR_ROLE = keccak256("INTEGRATOR_ROLE"); + + TokenFactory public tokenFactory; + BridgeRegistry public bridgeRegistry; + ITokenRegistry public wTokenRegistry; + + // Default bridge configuration for W tokens (more conservative due to compliance) + uint256 public defaultMinBridgeAmount = 100e2; // 100 USD minimum + uint256 public defaultMaxBridgeAmount = 10_000_000e2; // 10M USD maximum + uint8 public defaultRiskLevel = 20; // Low risk (fiat-backed) + uint256 public defaultBridgeFeeBps = 5; // 0.05% default fee (lower due to compliance) + + // Destination chain IDs (includes XRPL and Fabric in addition to EVM) + uint256[] public defaultEvmDestinations; + uint256[] public defaultNonEvmDestinations; // 0 for XRPL, 1 for Fabric (example) + + event WTokenRegistered( + address indexed token, + string indexed currencyCode, + uint256[] destinationChainIds + ); + + constructor( + address admin, + address tokenFactory_, + address bridgeRegistry_, + address wTokenRegistry_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(INTEGRATOR_ROLE, admin); + + require(tokenFactory_ != address(0), "WTokenBridgeIntegration: zero token factory"); + require(bridgeRegistry_ != address(0), "WTokenBridgeIntegration: zero bridge registry"); + require(wTokenRegistry_ != address(0), "WTokenBridgeIntegration: zero W token registry"); + + tokenFactory = TokenFactory(tokenFactory_); + bridgeRegistry = BridgeRegistry(bridgeRegistry_); + wTokenRegistry = ITokenRegistry(wTokenRegistry_); + + // Set default EVM destinations + defaultEvmDestinations.push(137); // Polygon + defaultEvmDestinations.push(10); // Optimism + defaultEvmDestinations.push(8453); // Base + defaultEvmDestinations.push(42161); // Arbitrum + defaultEvmDestinations.push(43114); // Avalanche + defaultEvmDestinations.push(56); // BNB Chain + defaultEvmDestinations.push(10143); // Monad + defaultEvmDestinations.push(42793); // Etherlink (Tezos EVM L2) + + // Set default non-EVM destinations + defaultNonEvmDestinations.push(0); // XRPL (0 = non-EVM identifier) + defaultNonEvmDestinations.push(1); // Fabric (1 = non-EVM identifier) + } + + /** + * @notice Register a W token with bridge registry + * @param currencyCode ISO-4217 currency code (e.g., "USD") + * @param destinationChainIds Array of allowed destination chain IDs + * @param minAmount Minimum bridge amount (in token decimals) + * @param maxAmount Maximum bridge amount (in token decimals) + * @param riskLevel Risk level (0-255) + * @param bridgeFeeBps Bridge fee in basis points + */ + function registerWToken( + string memory currencyCode, + uint256[] memory destinationChainIds, + uint256 minAmount, + uint256 maxAmount, + uint8 riskLevel, + uint256 bridgeFeeBps + ) public onlyRole(INTEGRATOR_ROLE) { + address token = wTokenRegistry.getTokenAddress(currencyCode); + require(token != address(0), "WTokenBridgeIntegration: token not found"); + + require(destinationChainIds.length > 0, "WTokenBridgeIntegration: no destinations"); + require(minAmount > 0, "WTokenBridgeIntegration: zero min amount"); + require(maxAmount >= minAmount, "WTokenBridgeIntegration: max < min"); + require(bridgeFeeBps <= 10000, "WTokenBridgeIntegration: fee > 100%"); + + bridgeRegistry.registerToken( + token, + minAmount, + maxAmount, + destinationChainIds, + riskLevel, + bridgeFeeBps + ); + + emit WTokenRegistered(token, currencyCode, destinationChainIds); + } + + /** + * @notice Register a W token with default configuration + * @param currencyCode ISO-4217 currency code + */ + function registerWTokenDefault(string memory currencyCode) public onlyRole(INTEGRATOR_ROLE) { + // Combine EVM and non-EVM destinations + uint256[] memory allDestinations = new uint256[]( + defaultEvmDestinations.length + defaultNonEvmDestinations.length + ); + + uint256 i = 0; + for (uint256 j = 0; j < defaultEvmDestinations.length; j++) { + allDestinations[i++] = defaultEvmDestinations[j]; + } + for (uint256 j = 0; j < defaultNonEvmDestinations.length; j++) { + allDestinations[i++] = defaultNonEvmDestinations[j]; + } + + registerWToken( + currencyCode, + allDestinations, + defaultMinBridgeAmount, + defaultMaxBridgeAmount, + defaultRiskLevel, + defaultBridgeFeeBps + ); + } + + /** + * @notice Register multiple W tokens with default configuration + * @param currencyCodes Array of ISO-4217 currency codes + */ + function registerMultipleWTokensDefault(string[] memory currencyCodes) external onlyRole(INTEGRATOR_ROLE) { + for (uint256 i = 0; i < currencyCodes.length; i++) { + registerWTokenDefault(currencyCodes[i]); + } + } + + /** + * @notice Set default bridge configuration + */ + function setDefaultMinBridgeAmount(uint256 minAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(minAmount > 0, "WTokenBridgeIntegration: zero min amount"); + defaultMinBridgeAmount = minAmount; + } + + function setDefaultMaxBridgeAmount(uint256 maxAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(maxAmount >= defaultMinBridgeAmount, "WTokenBridgeIntegration: max < min"); + defaultMaxBridgeAmount = maxAmount; + } + + function setDefaultRiskLevel(uint8 riskLevel) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(riskLevel <= 255, "WTokenBridgeIntegration: invalid risk level"); + defaultRiskLevel = riskLevel; + } + + function setDefaultBridgeFeeBps(uint256 feeBps) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(feeBps <= 10000, "WTokenBridgeIntegration: fee > 100%"); + defaultBridgeFeeBps = feeBps; + } + + function setDefaultEvmDestinations(uint256[] memory chainIds) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(chainIds.length > 0, "WTokenBridgeIntegration: no destinations"); + defaultEvmDestinations = chainIds; + } + + function setDefaultNonEvmDestinations(uint256[] memory chainIds) external onlyRole(DEFAULT_ADMIN_ROLE) { + defaultNonEvmDestinations = chainIds; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/WTokenComplianceEnforcer.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/WTokenComplianceEnforcer.sol new file mode 100644 index 0000000..7c41e1a --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/WTokenComplianceEnforcer.sol @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeEscrowVault.sol"; +import "../../iso4217w/interfaces/IISO4217WToken.sol"; +import "../../iso4217w/ComplianceGuard.sol"; + +/** + * @title WTokenComplianceEnforcer + * @notice Enforces W token compliance rules on bridge operations + * @dev Ensures money multiplier = 1.0 and GRU isolation on bridge + */ +contract WTokenComplianceEnforcer is AccessControl { + bytes32 public constant ENFORCER_ROLE = keccak256("ENFORCER_ROLE"); + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + BridgeEscrowVault public bridgeEscrowVault; + ComplianceGuard public complianceGuard; + mapping(address => bool) public enabledTokens; // W token => enabled + + event TokenEnabled(address indexed token, bool enabled); + event ComplianceChecked( + address indexed token, + bytes32 reasonCode, + bool compliant + ); + + error ComplianceViolation(bytes32 reasonCode); + error TokenNotEnabled(); + error InvalidToken(); + + constructor( + address admin, + address bridgeEscrowVault_, + address complianceGuard_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ENFORCER_ROLE, admin); + _grantRole(OPERATOR_ROLE, admin); + + require(bridgeEscrowVault_ != address(0), "WTokenComplianceEnforcer: zero bridge"); + require(complianceGuard_ != address(0), "WTokenComplianceEnforcer: zero guard"); + + bridgeEscrowVault = BridgeEscrowVault(bridgeEscrowVault_); + complianceGuard = ComplianceGuard(complianceGuard_); + } + + /** + * @notice Check compliance before bridge operation + * @param token W token address + * @param bridgeAmount Amount to bridge + * @return compliant True if compliant + */ + function checkComplianceBeforeBridge( + address token, + uint256 bridgeAmount + ) external returns (bool compliant) { + if (!enabledTokens[token]) revert TokenNotEnabled(); + + IISO4217WToken wToken = IISO4217WToken(token); + string memory currencyCode = wToken.currencyCode(); + uint256 verifiedReserve = wToken.verifiedReserve(); + uint256 currentSupply = wToken.totalSupply(); + uint256 newSupply = currentSupply - bridgeAmount; // Supply after bridge + + // Validate mint operation (simulating future state) + (bool isValid, bytes32 reasonCode) = complianceGuard.validateMint( + currencyCode, + bridgeAmount, + newSupply, + verifiedReserve + ); + + if (!isValid) { + emit ComplianceChecked(token, reasonCode, false); + revert ComplianceViolation(reasonCode); + } + + // Validate money multiplier = 1.0 + if (!complianceGuard.validateMoneyMultiplier(verifiedReserve, newSupply)) { + bytes32 multiplierReason = keccak256("MONEY_MULTIPLIER_VIOLATION"); + emit ComplianceChecked(token, multiplierReason, false); + revert ComplianceViolation(multiplierReason); + } + + // Validate GRU isolation + if (complianceGuard.violatesGRUIsolation(currencyCode)) { + bytes32 gruReason = keccak256("GRU_ISOLATION_VIOLATION"); + emit ComplianceChecked(token, gruReason, false); + revert ComplianceViolation(gruReason); + } + + emit ComplianceChecked(token, bytes32(0), true); + compliant = true; + } + + /** + * @notice Check compliance on destination chain (before minting bridged amount) + * @param currencyCode ISO-4217 currency code + * @param bridgeAmount Amount to mint on destination + * @param destinationReserve Reserve on destination chain + * @param destinationSupply Supply on destination chain (before mint) + * @return compliant True if compliant + */ + function checkDestinationCompliance( + string memory currencyCode, + uint256 bridgeAmount, + uint256 destinationReserve, + uint256 destinationSupply + ) external returns (bool compliant) { + uint256 newSupply = destinationSupply + bridgeAmount; + + // Validate mint operation + (bool isValid, bytes32 reasonCode) = complianceGuard.validateMint( + currencyCode, + bridgeAmount, + destinationSupply, // Current supply + destinationReserve + ); + + if (!isValid) { + emit ComplianceChecked(address(0), reasonCode, false); + revert ComplianceViolation(reasonCode); + } + + // Validate money multiplier = 1.0 after mint + if (!complianceGuard.validateMoneyMultiplier(destinationReserve, newSupply)) { + bytes32 multiplierReason = keccak256("MONEY_MULTIPLIER_VIOLATION"); + emit ComplianceChecked(address(0), multiplierReason, false); + revert ComplianceViolation(multiplierReason); + } + + // Validate GRU isolation + if (complianceGuard.violatesGRUIsolation(currencyCode)) { + bytes32 gruReason = keccak256("GRU_ISOLATION_VIOLATION"); + emit ComplianceChecked(address(0), gruReason, false); + revert ComplianceViolation(gruReason); + } + + emit ComplianceChecked(address(0), bytes32(0), true); + compliant = true; + } + + /** + * @notice Enable a W token for compliance checking + * @param token W token address + */ + function enableToken(address token) external onlyRole(OPERATOR_ROLE) { + require(token != address(0), "WTokenComplianceEnforcer: zero token"); + + // Verify it's a valid W token + try IISO4217WToken(token).currencyCode() returns (string memory) { + enabledTokens[token] = true; + emit TokenEnabled(token, true); + } catch { + revert InvalidToken(); + } + } + + /** + * @notice Disable a W token + * @param token W token address + */ + function disableToken(address token) external onlyRole(OPERATOR_ROLE) { + enabledTokens[token] = false; + emit TokenEnabled(token, false); + } + + /** + * @notice Check if token is enabled + */ + function isTokenEnabled(address token) external view returns (bool) { + return enabledTokens[token]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/WTokenReserveVerifier.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/WTokenReserveVerifier.sol new file mode 100644 index 0000000..eeff586 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/WTokenReserveVerifier.sol @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeEscrowVault.sol"; +import "../../iso4217w/interfaces/IISO4217WToken.sol"; +import "../../iso4217w/oracle/ReserveOracle.sol"; + +/** + * @title WTokenReserveVerifier + * @notice Verifies W token reserves before allowing bridge operations + * @dev Ensures 1:1 backing maintained across bridge operations + */ +contract WTokenReserveVerifier is AccessControl { + bytes32 public constant VERIFIER_ROLE = keccak256("VERIFIER_ROLE"); + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + BridgeEscrowVault public bridgeEscrowVault; + ReserveOracle public reserveOracle; + mapping(address => bool) public verifiedTokens; // W token => verified + + // Reserve verification threshold (10000 = 100%) + uint256 public reserveThreshold = 10000; // 100% (must be fully backed) + + event TokenVerified(address indexed token, bool verified); + event ReserveVerified( + address indexed token, + uint256 reserve, + uint256 supply, + uint256 bridgeAmount, + bool sufficient + ); + + error InsufficientReserve(); + error TokenNotVerified(); + error InvalidToken(); + + constructor( + address admin, + address bridgeEscrowVault_, + address reserveOracle_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(VERIFIER_ROLE, admin); + _grantRole(OPERATOR_ROLE, admin); + + require(bridgeEscrowVault_ != address(0), "WTokenReserveVerifier: zero bridge"); + require(reserveOracle_ != address(0), "WTokenReserveVerifier: zero oracle"); + + bridgeEscrowVault = BridgeEscrowVault(bridgeEscrowVault_); + reserveOracle = ReserveOracle(reserveOracle_); + } + + /** + * @notice Verify reserve before bridge operation + * @param token W token address + * @param bridgeAmount Amount to bridge + * @return verified True if reserve is sufficient + */ + function verifyReserveBeforeBridge( + address token, + uint256 bridgeAmount + ) external returns (bool verified) { + if (!verifiedTokens[token]) revert TokenNotVerified(); + + IISO4217WToken wToken = IISO4217WToken(token); + + uint256 verifiedReserve = wToken.verifiedReserve(); + uint256 currentSupply = wToken.totalSupply(); + + // After bridge, supply on this chain decreases, but reserve must still cover remaining supply + // Reserve must be >= (currentSupply - bridgeAmount) * reserveThreshold / 10000 + uint256 requiredReserve = ((currentSupply - bridgeAmount) * reserveThreshold) / 10000; + + verified = verifiedReserve >= requiredReserve; + + if (!verified) revert InsufficientReserve(); + + emit ReserveVerified(token, verifiedReserve, currentSupply, bridgeAmount, verified); + } + + /** + * @notice Verify reserve on destination chain (after bridge) + * @param token W token address on destination chain + * @param bridgeAmount Amount bridged + * @param destinationReserve Reserve on destination chain + * @param destinationSupply Supply on destination chain (before minting bridged amount) + * @return verified True if destination reserve is sufficient + */ + function verifyDestinationReserve( + address token, + uint256 bridgeAmount, + uint256 destinationReserve, + uint256 destinationSupply + ) external returns (bool verified) { + // After minting bridged amount on destination: newSupply = destinationSupply + bridgeAmount + // Required reserve: (newSupply * reserveThreshold) / 10000 + uint256 newSupply = destinationSupply + bridgeAmount; + uint256 requiredReserve = (newSupply * reserveThreshold) / 10000; + + verified = destinationReserve >= requiredReserve; + + if (!verified) revert InsufficientReserve(); + + emit ReserveVerified(token, destinationReserve, newSupply, bridgeAmount, verified); + } + + /** + * @notice Verify reserve sufficiency using oracle + * @param token W token address + * @param bridgeAmount Amount to bridge + * @return verified True if reserve is sufficient according to oracle + */ + function verifyReserveWithOracle( + address token, + uint256 bridgeAmount + ) external returns (bool verified) { + if (!verifiedTokens[token]) revert TokenNotVerified(); + + IISO4217WToken wToken = IISO4217WToken(token); + + // Get currency code from token + string memory currencyCode = wToken.currencyCode(); + + // Get verified reserve from oracle (consensus) + (uint256 verifiedReserve, ) = reserveOracle.getVerifiedReserve(currencyCode); + + uint256 currentSupply = wToken.totalSupply(); + + // Required reserve after bridge + uint256 requiredReserve = ((currentSupply - bridgeAmount) * reserveThreshold) / 10000; + + verified = verifiedReserve >= requiredReserve; + + if (!verified) revert InsufficientReserve(); + + emit ReserveVerified(token, verifiedReserve, currentSupply, bridgeAmount, verified); + } + + /** + * @notice Register a W token for reserve verification + * @param token W token address + */ + function registerToken(address token) external onlyRole(OPERATOR_ROLE) { + require(token != address(0), "WTokenReserveVerifier: zero token"); + + // Verify it's a valid W token (implements IISO4217WToken) + try IISO4217WToken(token).currencyCode() returns (string memory) { + verifiedTokens[token] = true; + emit TokenVerified(token, true); + } catch { + revert InvalidToken(); + } + } + + /** + * @notice Unregister a W token + * @param token W token address + */ + function unregisterToken(address token) external onlyRole(OPERATOR_ROLE) { + verifiedTokens[token] = false; + emit TokenVerified(token, false); + } + + /** + * @notice Set reserve verification threshold + * @param threshold Threshold in basis points (10000 = 100%) + */ + function setReserveThreshold(uint256 threshold) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(threshold <= 10000, "WTokenReserveVerifier: threshold > 100%"); + require(threshold >= 10000, "WTokenReserveVerifier: threshold must be 100%"); // Hard requirement + reserveThreshold = threshold; + } + + /** + * @notice Check if token is verified + */ + function isTokenVerified(address token) external view returns (bool) { + return verifiedTokens[token]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/eMoneyBridgeIntegration.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/eMoneyBridgeIntegration.sol new file mode 100644 index 0000000..d72b7e7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/eMoneyBridgeIntegration.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeRegistry.sol"; +import "../../emoney/TokenFactory138.sol"; + +/** + * @title eMoneyBridgeIntegration + * @notice Automatically registers eMoney tokens with BridgeRegistry + * @dev Extends eMoney token system to auto-register tokens with bridge + */ +contract eMoneyBridgeIntegration is AccessControl { + bytes32 public constant INTEGRATOR_ROLE = keccak256("INTEGRATOR_ROLE"); + + BridgeRegistry public bridgeRegistry; + + // Default bridge configuration for eMoney tokens + uint256 public defaultMinBridgeAmount = 100e18; // 100 tokens minimum + uint256 public defaultMaxBridgeAmount = 1_000_000e18; // 1M tokens maximum + uint8 public defaultRiskLevel = 60; // Medium-high risk (credit instrument) + uint256 public defaultBridgeFeeBps = 15; // 0.15% default fee + + // Destination chain IDs (regulated entities only - EVM chains) + uint256[] public defaultDestinations; + + event eMoneyTokenRegistered( + address indexed token, + string indexed currencyCode, + uint256[] destinationChainIds + ); + + constructor( + address admin, + address bridgeRegistry_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(INTEGRATOR_ROLE, admin); + + require(bridgeRegistry_ != address(0), "eMoneyBridgeIntegration: zero bridge registry"); + + bridgeRegistry = BridgeRegistry(bridgeRegistry_); + + // Set default destinations (EVM chains only - regulated entities) + defaultDestinations.push(137); // Polygon + defaultDestinations.push(10); // Optimism + defaultDestinations.push(8453); // Base + defaultDestinations.push(42161); // Arbitrum + defaultDestinations.push(43114); // Avalanche + defaultDestinations.push(56); // BNB Chain + defaultDestinations.push(42793); // Etherlink (Tezos EVM L2) + } + + /** + * @notice Register an eMoney token with bridge registry + * @param token eMoney token address + * @param currencyCode Currency code (for tracking) + * @param destinationChainIds Array of allowed destination chain IDs + * @param minAmount Minimum bridge amount + * @param maxAmount Maximum bridge amount + * @param riskLevel Risk level (0-255) + * @param bridgeFeeBps Bridge fee in basis points + */ + function registereMoneyToken( + address token, + string memory currencyCode, + uint256[] memory destinationChainIds, + uint256 minAmount, + uint256 maxAmount, + uint8 riskLevel, + uint256 bridgeFeeBps + ) public onlyRole(INTEGRATOR_ROLE) { + require(token != address(0), "eMoneyBridgeIntegration: zero token"); + require(destinationChainIds.length > 0, "eMoneyBridgeIntegration: no destinations"); + require(minAmount > 0, "eMoneyBridgeIntegration: zero min amount"); + require(maxAmount >= minAmount, "eMoneyBridgeIntegration: max < min"); + require(bridgeFeeBps <= 10000, "eMoneyBridgeIntegration: fee > 100%"); + + bridgeRegistry.registerToken( + token, + minAmount, + maxAmount, + destinationChainIds, + riskLevel, + bridgeFeeBps + ); + + emit eMoneyTokenRegistered(token, currencyCode, destinationChainIds); + } + + /** + * @notice Register an eMoney token with default configuration + * @param token eMoney token address + * @param currencyCode Currency code + */ + function registereMoneyTokenDefault( + address token, + string memory currencyCode + ) external onlyRole(INTEGRATOR_ROLE) { + registereMoneyToken( + token, + currencyCode, + defaultDestinations, + defaultMinBridgeAmount, + defaultMaxBridgeAmount, + defaultRiskLevel, + defaultBridgeFeeBps + ); + } + + /** + * @notice Set default bridge configuration + */ + function setDefaultMinBridgeAmount(uint256 minAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(minAmount > 0, "eMoneyBridgeIntegration: zero min amount"); + defaultMinBridgeAmount = minAmount; + } + + function setDefaultMaxBridgeAmount(uint256 maxAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(maxAmount >= defaultMinBridgeAmount, "eMoneyBridgeIntegration: max < min"); + defaultMaxBridgeAmount = maxAmount; + } + + function setDefaultRiskLevel(uint8 riskLevel) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(riskLevel <= 255, "eMoneyBridgeIntegration: invalid risk level"); + defaultRiskLevel = riskLevel; + } + + function setDefaultBridgeFeeBps(uint256 feeBps) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(feeBps <= 10000, "eMoneyBridgeIntegration: fee > 100%"); + defaultBridgeFeeBps = feeBps; + } + + function setDefaultDestinations(uint256[] memory chainIds) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(chainIds.length > 0, "eMoneyBridgeIntegration: no destinations"); + defaultDestinations = chainIds; + } + + /** + * @notice Get default destinations + */ + function getDefaultDestinations() external view returns (uint256[] memory) { + return defaultDestinations; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/eMoneyPolicyEnforcer.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/eMoneyPolicyEnforcer.sol new file mode 100644 index 0000000..94ccfaf --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/integration/eMoneyPolicyEnforcer.sol @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeEscrowVault.sol"; +import "../../emoney/PolicyManager.sol"; +import "../../emoney/ComplianceRegistry.sol"; + +/** + * @title eMoneyPolicyEnforcer + * @notice Enforces eMoney transfer restrictions on bridge operations + * @dev Integrates PolicyManager and ComplianceRegistry with bridge + */ +contract eMoneyPolicyEnforcer is AccessControl { + bytes32 public constant ENFORCER_ROLE = keccak256("ENFORCER_ROLE"); + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + BridgeEscrowVault public bridgeEscrowVault; + PolicyManager public policyManager; + ComplianceRegistry public complianceRegistry; + mapping(address => bool) public enabledTokens; // eMoney token => enabled + + event TokenEnabled(address indexed token, bool enabled); + event TransferAuthorized( + address indexed token, + address indexed from, + address indexed to, + uint256 amount, + bool authorized + ); + + error TransferNotAuthorized(); + error TokenNotEnabled(); + error InvalidToken(); + + constructor( + address admin, + address bridgeEscrowVault_, + address policyManager_, + address complianceRegistry_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ENFORCER_ROLE, admin); + _grantRole(OPERATOR_ROLE, admin); + + require(bridgeEscrowVault_ != address(0), "eMoneyPolicyEnforcer: zero bridge"); + require(policyManager_ != address(0), "eMoneyPolicyEnforcer: zero policy manager"); + require(complianceRegistry_ != address(0), "eMoneyPolicyEnforcer: zero compliance registry"); + + bridgeEscrowVault = BridgeEscrowVault(bridgeEscrowVault_); + policyManager = PolicyManager(policyManager_); + complianceRegistry = ComplianceRegistry(complianceRegistry_); + } + + /** + * @notice Check if transfer is authorized before bridge operation + * @param token eMoney token address + * @param from Source address + * @param to Destination address (bridge escrow) + * @param amount Amount to bridge + * @return authorized True if transfer is authorized + */ + function checkTransferAuthorization( + address token, + address from, + address to, + uint256 amount + ) external returns (bool authorized) { + if (!enabledTokens[token]) revert TokenNotEnabled(); + + // Check PolicyManager authorization + (bool isAuthorized, bytes32 reasonCode) = policyManager.canTransfer( + token, + from, + to, + amount + ); + + if (!isAuthorized) { + emit TransferAuthorized(token, from, to, amount, false); + revert TransferNotAuthorized(); + } + + // Check ComplianceRegistry restrictions + bool complianceAllowed = complianceRegistry.canTransfer(token, from, to, amount); + + if (!complianceAllowed) { + emit TransferAuthorized(token, from, to, amount, false); + revert TransferNotAuthorized(); + } + + emit TransferAuthorized(token, from, to, amount, true); + authorized = true; + } + + /** + * @notice Check transfer authorization with additional context + * @param token eMoney token address + * @param from Source address + * @param to Destination address + * @param amount Amount to transfer + * @param context Additional context data + * @return authorized True if transfer is authorized + */ + function checkTransferAuthorizationWithContext( + address token, + address from, + address to, + uint256 amount, + bytes memory context + ) external returns (bool authorized) { + if (!enabledTokens[token]) revert TokenNotEnabled(); + + // Check PolicyManager with context + (bool isAuthorized, bytes32 reasonCode) = policyManager.canTransferWithContext( + token, + from, + to, + amount, + context + ); + + if (!isAuthorized) { + emit TransferAuthorized(token, from, to, amount, false); + revert TransferNotAuthorized(); + } + + // Check ComplianceRegistry + bool complianceAllowed = complianceRegistry.canTransfer(token, from, to, amount); + + if (!complianceAllowed) { + emit TransferAuthorized(token, from, to, amount, false); + revert TransferNotAuthorized(); + } + + emit TransferAuthorized(token, from, to, amount, true); + authorized = true; + } + + /** + * @notice Enable an eMoney token for policy enforcement + * @param token eMoney token address + */ + function enableToken(address token) external onlyRole(OPERATOR_ROLE) { + require(token != address(0), "eMoneyPolicyEnforcer: zero token"); + enabledTokens[token] = true; + emit TokenEnabled(token, true); + } + + /** + * @notice Disable an eMoney token + * @param token eMoney token address + */ + function disableToken(address token) external onlyRole(OPERATOR_ROLE) { + enabledTokens[token] = false; + emit TokenEnabled(token, false); + } + + /** + * @notice Check if token is enabled + */ + function isTokenEnabled(address token) external view returns (bool) { + return enabledTokens[token]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interfaces/IAlltraTransport.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interfaces/IAlltraTransport.sol new file mode 100644 index 0000000..d0e005d --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interfaces/IAlltraTransport.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IAlltraTransport + * @notice Transport for 138 <-> ALL Mainnet (651940); does not use CCIP. + * @dev ALL Mainnet is not supported by CCIP. This interface is used by AlltraAdapter + * to delegate the actual lock/relay/mint flow to a custom bridge or relay. + */ +interface IAlltraTransport { + /** + * @notice Lock tokens and initiate transfer to ALL Mainnet (651940). + * @param token Token address (address(0) for native). + * @param amount Amount to bridge. + * @param recipient Recipient on ALL Mainnet. + * @return requestId Unique request id for status/confirmation. + */ + function lockAndRelay( + address token, + uint256 amount, + address recipient + ) external payable returns (bytes32 requestId); + + /** + * @notice Check if this transport is configured (e.g. relayer set). + */ + function isConfigured() external view returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interfaces/IChainAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interfaces/IChainAdapter.sol new file mode 100644 index 0000000..bdfc4ba --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interfaces/IChainAdapter.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IChainAdapter + * @notice Interface for chain-specific bridge adapters + * @dev All chain adapters must implement this interface + */ +interface IChainAdapter { + enum BridgeStatus { + Pending, + Locked, + Confirmed, + Completed, + Failed, + Cancelled + } + + struct BridgeRequest { + address sender; + address token; + uint256 amount; + bytes destinationData; // Chain-specific destination (address, account, etc.) + bytes32 requestId; + BridgeStatus status; + uint256 createdAt; + uint256 completedAt; + } + + /** + * @notice Get chain type identifier + */ + function getChainType() external pure returns (string memory); + + /** + * @notice Get chain identifier (chainId for EVM, string for non-EVM) + */ + function getChainIdentifier() external view returns (uint256 chainId, string memory identifier); + + /** + * @notice Validate destination address/identifier for this chain + */ + function validateDestination(bytes calldata destination) external pure returns (bool); + + /** + * @notice Initiate bridge operation + * @param token Token address (address(0) for native) + * @param amount Amount to bridge + * @param destination Chain-specific destination data + * @param recipient Recipient address/identifier + * @return requestId Unique request identifier + */ + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable returns (bytes32 requestId); + + /** + * @notice Get bridge request status + */ + function getBridgeStatus(bytes32 requestId) + external view returns (BridgeRequest memory); + + /** + * @notice Cancel pending bridge (if supported) + */ + function cancelBridge(bytes32 requestId) external returns (bool); + + /** + * @notice Estimate bridge fee + */ + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view returns (uint256 fee); + + /** + * @notice Check if adapter is active + */ + function isActive() external view returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/BridgeEscrowVault.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/BridgeEscrowVault.sol new file mode 100644 index 0000000..5cf44ce --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/BridgeEscrowVault.sol @@ -0,0 +1,375 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/** + * @title BridgeEscrowVault + * @notice Enhanced escrow vault for multi-rail bridging (EVM, XRPL, Fabric) + * @dev Supports HSM-backed admin functions via EIP-712 signatures + */ +contract BridgeEscrowVault is ReentrancyGuard, Pausable, AccessControl, EIP712 { + using SafeERC20 for IERC20; + + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + bytes32 public constant REFUND_ROLE = keccak256("REFUND_ROLE"); + + enum DestinationType { + EVM, + XRPL, + FABRIC + } + + enum TransferStatus { + INITIATED, + DEPOSIT_CONFIRMED, + ROUTE_SELECTED, + EXECUTING, + DESTINATION_SENT, + FINALITY_CONFIRMED, + COMPLETED, + FAILED, + REFUND_PENDING, + REFUNDED + } + + struct Transfer { + bytes32 transferId; + address depositor; + address asset; // address(0) for native ETH + uint256 amount; + DestinationType destinationType; + bytes destinationData; // Encoded destination address/identifier + uint256 timestamp; + uint256 timeout; + TransferStatus status; + bool refunded; + } + + struct RefundRequest { + bytes32 transferId; + uint256 deadline; + bytes hsmSignature; + } + + // EIP-712 type hashes + bytes32 private constant REFUND_TYPEHASH = + keccak256("RefundRequest(bytes32 transferId,uint256 deadline)"); + + mapping(bytes32 => Transfer) public transfers; + mapping(bytes32 => bool) public processedTransferIds; + mapping(address => uint256) public nonces; + + event Deposit( + bytes32 indexed transferId, + address indexed depositor, + address indexed asset, + uint256 amount, + DestinationType destinationType, + bytes destinationData, + uint256 timestamp + ); + + event TransferStatusUpdated( + bytes32 indexed transferId, + TransferStatus oldStatus, + TransferStatus newStatus + ); + + event RefundInitiated( + bytes32 indexed transferId, + address indexed depositor, + uint256 amount + ); + + event RefundExecuted( + bytes32 indexed transferId, + address indexed depositor, + uint256 amount + ); + + error ZeroAmount(); + error ZeroRecipient(); + error ZeroAsset(); + error TransferAlreadyProcessed(); + error TransferNotFound(); + error TransferNotRefundable(); + error InvalidTimeout(); + error InvalidSignature(); + error TransferNotTimedOut(); + error InvalidStatus(); + + constructor(address admin) EIP712("BridgeEscrowVault", "1") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(PAUSER_ROLE, admin); + _grantRole(OPERATOR_ROLE, admin); + _grantRole(REFUND_ROLE, admin); + } + + /** + * @notice Deposit native ETH for cross-chain transfer + * @param destinationType Type of destination (EVM, XRPL, Fabric) + * @param destinationData Encoded destination address/identifier + * @param timeout Timeout in seconds for refund eligibility + * @param nonce User-provided nonce for replay protection + * @return transferId Unique transfer identifier + */ + function depositNative( + DestinationType destinationType, + bytes calldata destinationData, + uint256 timeout, + bytes32 nonce + ) external payable nonReentrant whenNotPaused returns (bytes32 transferId) { + if (msg.value == 0) revert ZeroAmount(); + if (destinationData.length == 0) revert ZeroRecipient(); + if (timeout == 0) revert InvalidTimeout(); + + nonces[msg.sender]++; + + transferId = _generateTransferId( + address(0), + msg.value, + destinationType, + destinationData, + nonce + ); + + if (processedTransferIds[transferId]) revert TransferAlreadyProcessed(); + processedTransferIds[transferId] = true; + + transfers[transferId] = Transfer({ + transferId: transferId, + depositor: msg.sender, + asset: address(0), + amount: msg.value, + destinationType: destinationType, + destinationData: destinationData, + timestamp: block.timestamp, + timeout: timeout, + status: TransferStatus.INITIATED, + refunded: false + }); + + emit Deposit( + transferId, + msg.sender, + address(0), + msg.value, + destinationType, + destinationData, + block.timestamp + ); + + return transferId; + } + + /** + * @notice Deposit ERC-20 tokens for cross-chain transfer + * @param token ERC-20 token address + * @param amount Amount to deposit + * @param destinationType Type of destination (EVM, XRPL, Fabric) + * @param destinationData Encoded destination address/identifier + * @param timeout Timeout in seconds for refund eligibility + * @param nonce User-provided nonce for replay protection + * @return transferId Unique transfer identifier + */ + function depositERC20( + address token, + uint256 amount, + DestinationType destinationType, + bytes calldata destinationData, + uint256 timeout, + bytes32 nonce + ) external nonReentrant whenNotPaused returns (bytes32 transferId) { + if (token == address(0)) revert ZeroAsset(); + if (amount == 0) revert ZeroAmount(); + if (destinationData.length == 0) revert ZeroRecipient(); + if (timeout == 0) revert InvalidTimeout(); + + nonces[msg.sender]++; + + transferId = _generateTransferId( + token, + amount, + destinationType, + destinationData, + nonce + ); + + if (processedTransferIds[transferId]) revert TransferAlreadyProcessed(); + processedTransferIds[transferId] = true; + + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + + transfers[transferId] = Transfer({ + transferId: transferId, + depositor: msg.sender, + asset: token, + amount: amount, + destinationType: destinationType, + destinationData: destinationData, + timestamp: block.timestamp, + timeout: timeout, + status: TransferStatus.INITIATED, + refunded: false + }); + + emit Deposit( + transferId, + msg.sender, + token, + amount, + destinationType, + destinationData, + block.timestamp + ); + + return transferId; + } + + /** + * @notice Update transfer status (operator only) + * @param transferId Transfer identifier + * @param newStatus New status + */ + function updateTransferStatus( + bytes32 transferId, + TransferStatus newStatus + ) external onlyRole(OPERATOR_ROLE) { + Transfer storage transfer = transfers[transferId]; + if (transfer.transferId == bytes32(0)) revert TransferNotFound(); + + TransferStatus oldStatus = transfer.status; + transfer.status = newStatus; + + emit TransferStatusUpdated(transferId, oldStatus, newStatus); + } + + /** + * @notice Initiate refund (requires HSM signature) + * @param request Refund request with HSM signature + * @param hsmSigner HSM signer address + */ + function initiateRefund( + RefundRequest calldata request, + address hsmSigner + ) external onlyRole(REFUND_ROLE) { + Transfer storage transfer = transfers[request.transferId]; + if (transfer.transferId == bytes32(0)) revert TransferNotFound(); + if (transfer.refunded) revert TransferNotRefundable(); + if (block.timestamp < transfer.timestamp + transfer.timeout) { + revert TransferNotTimedOut(); + } + + // Verify HSM signature + bytes32 structHash = keccak256( + abi.encode(REFUND_TYPEHASH, request.transferId, request.deadline) + ); + bytes32 hash = _hashTypedDataV4(structHash); + + if (ECDSA.recover(hash, request.hsmSignature) != hsmSigner) { + revert InvalidSignature(); + } + + if (block.timestamp > request.deadline) revert InvalidSignature(); + + transfer.status = TransferStatus.REFUND_PENDING; + emit RefundInitiated(request.transferId, transfer.depositor, transfer.amount); + } + + /** + * @notice Execute refund after initiation + * @param transferId Transfer identifier + */ + function executeRefund(bytes32 transferId) external nonReentrant onlyRole(REFUND_ROLE) { + Transfer storage transfer = transfers[transferId]; + if (transfer.transferId == bytes32(0)) revert TransferNotFound(); + if (transfer.refunded) revert TransferNotRefundable(); + if (transfer.status != TransferStatus.REFUND_PENDING) revert InvalidStatus(); + + transfer.refunded = true; + transfer.status = TransferStatus.REFUNDED; + + if (transfer.asset == address(0)) { + (bool success, ) = transfer.depositor.call{value: transfer.amount}(""); + require(success, "Refund failed"); + } else { + IERC20(transfer.asset).safeTransfer(transfer.depositor, transfer.amount); + } + + emit RefundExecuted(transferId, transfer.depositor, transfer.amount); + } + + /** + * @notice Get transfer details + * @param transferId Transfer identifier + * @return Transfer struct + */ + function getTransfer(bytes32 transferId) external view returns (Transfer memory) { + return transfers[transferId]; + } + + /** + * @notice Check if transfer is refundable + * @param transferId Transfer identifier + * @return True if refundable + */ + function isRefundable(bytes32 transferId) external view returns (bool) { + Transfer storage transfer = transfers[transferId]; + if (transfer.transferId == bytes32(0)) return false; + if (transfer.refunded) return false; + return block.timestamp >= transfer.timestamp + transfer.timeout; + } + + /** + * @notice Generate unique transfer ID + * @param asset Asset address + * @param amount Amount + * @param destinationType Destination type + * @param destinationData Destination data + * @param nonce User nonce + * @return transferId Unique identifier + */ + function _generateTransferId( + address asset, + uint256 amount, + DestinationType destinationType, + bytes calldata destinationData, + bytes32 nonce + ) internal view returns (bytes32) { + return + keccak256( + abi.encodePacked( + asset, + amount, + uint8(destinationType), + destinationData, + nonce, + msg.sender, + block.timestamp, + block.number + ) + ); + } + + /** + * @notice Pause contract + */ + function pause() external onlyRole(PAUSER_ROLE) { + _pause(); + } + + /** + * @notice Unpause contract + */ + function unpause() external onlyRole(PAUSER_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/BridgeRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/BridgeRegistry.sol new file mode 100644 index 0000000..408e4ed --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/BridgeRegistry.sol @@ -0,0 +1,341 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; + +/** + * @title BridgeRegistry + * @notice Registry for bridge configuration: destinations, tokens, fees, and routing + */ +contract BridgeRegistry is AccessControl, Pausable { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + + struct Destination { + uint256 chainId; // 0 for non-EVM + string chainName; + bool enabled; + uint256 minFinalityBlocks; + uint256 timeoutSeconds; + uint256 baseFee; // Base fee in basis points (10000 = 100%) + address feeRecipient; + } + + struct TokenConfig { + address tokenAddress; + bool allowed; + uint256 minAmount; + uint256 maxAmount; + uint256[] allowedDestinations; // Chain IDs or 0 for non-EVM + uint8 riskLevel; // 0-255, higher = riskier + uint256 bridgeFeeBps; // Bridge fee in basis points + } + + struct RouteHealth { + uint256 successCount; + uint256 failureCount; + uint256 lastUpdate; + uint256 avgSettlementTime; // In seconds + } + + mapping(uint256 => Destination) public destinations; // chainId -> Destination + mapping(address => TokenConfig) public tokenConfigs; + mapping(uint256 => mapping(address => RouteHealth)) public routeHealth; // chainId -> token -> health + mapping(address => bool) public allowedTokens; + + uint256[] public destinationChainIds; + address[] public registeredTokens; + + event DestinationRegistered( + uint256 indexed chainId, + string chainName, + uint256 minFinalityBlocks, + uint256 timeoutSeconds + ); + + event DestinationUpdated(uint256 indexed chainId, bool enabled); + + event TokenRegistered( + address indexed token, + uint256 minAmount, + uint256 maxAmount, + uint8 riskLevel + ); + + event TokenUpdated(address indexed token, bool allowed); + + event RouteHealthUpdated( + uint256 indexed chainId, + address indexed token, + bool success, + uint256 settlementTime + ); + + error DestinationNotFound(); + error TokenNotAllowed(); + error InvalidAmount(); + error InvalidDestination(); + error InvalidFee(); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a new destination chain + * @param chainId Chain ID (0 for non-EVM like XRPL) + * @param chainName Human-readable chain name + * @param minFinalityBlocks Minimum blocks/ledgers for finality + * @param timeoutSeconds Timeout for refund eligibility + * @param baseFee Base fee in basis points + * @param feeRecipient Address to receive fees + */ + function registerDestination( + uint256 chainId, + string calldata chainName, + uint256 minFinalityBlocks, + uint256 timeoutSeconds, + uint256 baseFee, + address feeRecipient + ) external onlyRole(REGISTRAR_ROLE) { + if (baseFee > 10000) revert InvalidFee(); // Max 100% + + destinations[chainId] = Destination({ + chainId: chainId, + chainName: chainName, + enabled: true, + minFinalityBlocks: minFinalityBlocks, + timeoutSeconds: timeoutSeconds, + baseFee: baseFee, + feeRecipient: feeRecipient + }); + + // Add to list if not already present + bool exists = false; + for (uint256 i = 0; i < destinationChainIds.length; i++) { + if (destinationChainIds[i] == chainId) { + exists = true; + break; + } + } + if (!exists) { + destinationChainIds.push(chainId); + } + + emit DestinationRegistered(chainId, chainName, minFinalityBlocks, timeoutSeconds); + } + + /** + * @notice Update destination enabled status + * @param chainId Chain ID + * @param enabled Enabled status + */ + function updateDestination( + uint256 chainId, + bool enabled + ) external onlyRole(REGISTRAR_ROLE) { + if (destinations[chainId].chainId == 0 && chainId != 0) revert DestinationNotFound(); + destinations[chainId].enabled = enabled; + emit DestinationUpdated(chainId, enabled); + } + + /** + * @notice Register a token for bridging + * @param token Token address + * @param minAmount Minimum bridge amount + * @param maxAmount Maximum bridge amount + * @param allowedDestinations Array of allowed destination chain IDs + * @param riskLevel Risk level (0-255) + * @param bridgeFeeBps Bridge fee in basis points + */ + function registerToken( + address token, + uint256 minAmount, + uint256 maxAmount, + uint256[] calldata allowedDestinations, + uint8 riskLevel, + uint256 bridgeFeeBps + ) external onlyRole(REGISTRAR_ROLE) { + if (bridgeFeeBps > 10000) revert InvalidFee(); + + tokenConfigs[token] = TokenConfig({ + tokenAddress: token, + allowed: true, + minAmount: minAmount, + maxAmount: maxAmount, + allowedDestinations: allowedDestinations, + riskLevel: riskLevel, + bridgeFeeBps: bridgeFeeBps + }); + + allowedTokens[token] = true; + + // Add to list if not already present + bool exists = false; + for (uint256 i = 0; i < registeredTokens.length; i++) { + if (registeredTokens[i] == token) { + exists = true; + break; + } + } + if (!exists) { + registeredTokens.push(token); + } + + emit TokenRegistered(token, minAmount, maxAmount, riskLevel); + } + + /** + * @notice Update token allowed status + * @param token Token address + * @param allowed Allowed status + */ + function updateToken(address token, bool allowed) external onlyRole(REGISTRAR_ROLE) { + if (tokenConfigs[token].tokenAddress == address(0)) revert TokenNotAllowed(); + tokenConfigs[token].allowed = allowed; + allowedTokens[token] = allowed; + emit TokenUpdated(token, allowed); + } + + /** + * @notice Update route health metrics + * @param chainId Destination chain ID + * @param token Token address + * @param success Whether the route succeeded + * @param settlementTime Settlement time in seconds + */ + function updateRouteHealth( + uint256 chainId, + address token, + bool success, + uint256 settlementTime + ) external onlyRole(REGISTRAR_ROLE) { + RouteHealth storage health = routeHealth[chainId][token]; + + if (success) { + health.successCount++; + // Update average settlement time (simple moving average) + if (health.successCount == 1) { + health.avgSettlementTime = settlementTime; + } else { + health.avgSettlementTime = + (health.avgSettlementTime * (health.successCount - 1) + settlementTime) / + health.successCount; + } + } else { + health.failureCount++; + } + + health.lastUpdate = block.timestamp; + + emit RouteHealthUpdated(chainId, token, success, settlementTime); + } + + /** + * @notice Validate bridge request + * @param token Token address (address(0) for native) + * @param amount Amount to bridge + * @param destinationChainId Destination chain ID + * @return isValid Whether request is valid + * @return fee Fee amount + */ + function validateBridgeRequest( + address token, + uint256 amount, + uint256 destinationChainId + ) external view returns (bool isValid, uint256 fee) { + // Check destination exists and is enabled + Destination memory dest = destinations[destinationChainId]; + if (dest.chainId == 0 && destinationChainId != 0) { + return (false, 0); + } + if (!dest.enabled) { + return (false, 0); + } + + // For native ETH, allow if destination is enabled + if (token == address(0)) { + fee = (amount * dest.baseFee) / 10000; + return (true, fee); + } + + // Check token is registered and allowed + TokenConfig memory config = tokenConfigs[token]; + if (!config.allowed || config.tokenAddress == address(0)) { + return (false, 0); + } + + // Check amount limits + if (amount < config.minAmount || amount > config.maxAmount) { + return (false, 0); + } + + // Check destination is allowed for this token + bool destAllowed = false; + for (uint256 i = 0; i < config.allowedDestinations.length; i++) { + if (config.allowedDestinations[i] == destinationChainId) { + destAllowed = true; + break; + } + } + if (!destAllowed) { + return (false, 0); + } + + // Calculate fee (base fee + token-specific fee) + uint256 baseFeeAmount = (amount * dest.baseFee) / 10000; + uint256 tokenFeeAmount = (amount * config.bridgeFeeBps) / 10000; + fee = baseFeeAmount + tokenFeeAmount; + + return (true, fee); + } + + /** + * @notice Get route health score (0-10000, higher is better) + * @param chainId Destination chain ID + * @param token Token address + * @return score Health score + */ + function getRouteHealthScore( + uint256 chainId, + address token + ) external view returns (uint256 score) { + RouteHealth memory health = routeHealth[chainId][token]; + uint256 total = health.successCount + health.failureCount; + if (total == 0) return 5000; // Default 50% if no data + + score = (health.successCount * 10000) / total; + return score; + } + + /** + * @notice Get all registered destinations + * @return chainIds Array of chain IDs + */ + function getAllDestinations() external view returns (uint256[] memory) { + return destinationChainIds; + } + + /** + * @notice Get all registered tokens + * @return tokens Array of token addresses + */ + function getAllTokens() external view returns (address[] memory) { + return registeredTokens; + } + + /** + * @notice Pause registry + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /** + * @notice Unpause registry + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/BridgeVerifier.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/BridgeVerifier.sol new file mode 100644 index 0000000..da186a7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/BridgeVerifier.sol @@ -0,0 +1,230 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/** + * @title BridgeVerifier + * @notice Verifies cross-chain proofs and attestor signatures for bridge operations + * @dev Supports multi-sig quorum for attestations + */ +contract BridgeVerifier is AccessControl, EIP712 { + using ECDSA for bytes32; + + bytes32 public constant ATTESTOR_ROLE = keccak256("ATTESTOR_ROLE"); + + bytes32 private constant ATTESTATION_TYPEHASH = + keccak256("Attestation(bytes32 transferId,bytes32 proofHash,uint256 nonce,uint256 deadline)"); + + struct Attestation { + bytes32 transferId; + bytes32 proofHash; + uint256 nonce; + uint256 deadline; + bytes signature; + } + + struct AttestorConfig { + address attestor; + bool enabled; + uint256 weight; // Weight for quorum calculation + } + + mapping(address => AttestorConfig) public attestors; + mapping(bytes32 => mapping(address => bool)) public attestations; // transferId -> attestor -> attested + mapping(bytes32 => uint256) public attestationWeights; // transferId -> total weight + mapping(uint256 => bool) public usedNonces; + + address[] public attestorList; + uint256 public totalAttestorWeight; + uint256 public quorumThreshold; // Minimum weight required (in basis points, 10000 = 100%) + + event AttestationSubmitted( + bytes32 indexed transferId, + address indexed attestor, + bytes32 proofHash + ); + + event AttestationVerified( + bytes32 indexed transferId, + uint256 totalWeight, + bool quorumMet + ); + + event AttestorAdded(address indexed attestor, uint256 weight); + event AttestorRemoved(address indexed attestor); + event AttestorUpdated(address indexed attestor, bool enabled, uint256 weight); + event QuorumThresholdUpdated(uint256 oldThreshold, uint256 newThreshold); + + error ZeroAddress(); + error AttestorNotFound(); + error InvalidSignature(); + error NonceAlreadyUsed(); + error DeadlineExpired(); + error InvalidQuorum(); + error AlreadyAttested(); + + constructor( + address admin, + uint256 _quorumThreshold + ) EIP712("BridgeVerifier", "1") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ATTESTOR_ROLE, admin); + if (_quorumThreshold > 10000) revert InvalidQuorum(); + quorumThreshold = _quorumThreshold; + } + + /** + * @notice Add an attestor + * @param attestor Attestor address + * @param weight Weight for quorum calculation + */ + function addAttestor( + address attestor, + uint256 weight + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + if (attestor == address(0)) revert ZeroAddress(); + if (attestors[attestor].attestor != address(0)) revert AttestorNotFound(); + + attestors[attestor] = AttestorConfig({ + attestor: attestor, + enabled: true, + weight: weight + }); + + attestorList.push(attestor); + totalAttestorWeight += weight; + + emit AttestorAdded(attestor, weight); + } + + /** + * @notice Remove an attestor + * @param attestor Attestor address + */ + function removeAttestor(address attestor) external onlyRole(DEFAULT_ADMIN_ROLE) { + AttestorConfig memory config = attestors[attestor]; + if (config.attestor == address(0)) revert AttestorNotFound(); + + totalAttestorWeight -= config.weight; + delete attestors[attestor]; + + // Remove from list + for (uint256 i = 0; i < attestorList.length; i++) { + if (attestorList[i] == attestor) { + attestorList[i] = attestorList[attestorList.length - 1]; + attestorList.pop(); + break; + } + } + + emit AttestorRemoved(attestor); + } + + /** + * @notice Update attestor configuration + * @param attestor Attestor address + * @param enabled Enabled status + * @param weight New weight + */ + function updateAttestor( + address attestor, + bool enabled, + uint256 weight + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + AttestorConfig storage config = attestors[attestor]; + if (config.attestor == address(0)) revert AttestorNotFound(); + + uint256 oldWeight = config.weight; + totalAttestorWeight = totalAttestorWeight - oldWeight + weight; + + config.enabled = enabled; + config.weight = weight; + + emit AttestorUpdated(attestor, enabled, weight); + } + + /** + * @notice Update quorum threshold + * @param newThreshold New threshold in basis points + */ + function setQuorumThreshold(uint256 newThreshold) external onlyRole(DEFAULT_ADMIN_ROLE) { + if (newThreshold > 10000) revert InvalidQuorum(); + uint256 oldThreshold = quorumThreshold; + quorumThreshold = newThreshold; + emit QuorumThresholdUpdated(oldThreshold, newThreshold); + } + + /** + * @notice Submit an attestation + * @param attestation Attestation with signature + */ + function submitAttestation(Attestation calldata attestation) external { + AttestorConfig memory config = attestors[msg.sender]; + if (config.attestor == address(0) || !config.enabled) revert AttestorNotFound(); + if (block.timestamp > attestation.deadline) revert DeadlineExpired(); + if (usedNonces[attestation.nonce]) revert NonceAlreadyUsed(); + if (attestations[attestation.transferId][msg.sender]) revert AlreadyAttested(); + + // Verify signature + bytes32 structHash = keccak256( + abi.encode( + ATTESTATION_TYPEHASH, + attestation.transferId, + attestation.proofHash, + attestation.nonce, + attestation.deadline + ) + ); + bytes32 hash = _hashTypedDataV4(structHash); + + if (hash.recover(attestation.signature) != msg.sender) { + revert InvalidSignature(); + } + + usedNonces[attestation.nonce] = true; + attestations[attestation.transferId][msg.sender] = true; + attestationWeights[attestation.transferId] += config.weight; + + emit AttestationSubmitted(attestation.transferId, msg.sender, attestation.proofHash); + } + + /** + * @notice Verify if quorum is met for a transfer + * @param transferId Transfer identifier + * @return quorumMet Whether quorum threshold is met + * @return totalWeight Total weight of attestations + * @return requiredWeight Required weight for quorum + */ + function verifyQuorum( + bytes32 transferId + ) external view returns (bool quorumMet, uint256 totalWeight, uint256 requiredWeight) { + totalWeight = attestationWeights[transferId]; + requiredWeight = (totalAttestorWeight * quorumThreshold) / 10000; + quorumMet = totalWeight >= requiredWeight; + return (quorumMet, totalWeight, requiredWeight); + } + + /** + * @notice Check if an attestor has attested to a transfer + * @param transferId Transfer identifier + * @param attestor Attestor address + * @return True if attested + */ + function hasAttested( + bytes32 transferId, + address attestor + ) external view returns (bool) { + return attestations[transferId][attestor]; + } + + /** + * @notice Get all attestors + * @return Array of attestor addresses + */ + function getAllAttestors() external view returns (address[] memory) { + return attestorList; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/MintBurnController.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/MintBurnController.sol new file mode 100644 index 0000000..c807ce3 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/MintBurnController.sol @@ -0,0 +1,170 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "./wXRP.sol"; + +/** + * @title MintBurnController + * @notice HSM-backed controller for wXRP mint/burn operations + * @dev Uses EIP-712 signatures for HSM authorization + */ +contract MintBurnController is AccessControl, Pausable, EIP712 { + using ECDSA for bytes32; + + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + bytes32 private constant MINT_TYPEHASH = + keccak256("MintRequest(address to,uint256 amount,bytes32 xrplTxHash,uint256 nonce,uint256 deadline)"); + bytes32 private constant BURN_TYPEHASH = + keccak256("BurnRequest(address from,uint256 amount,bytes32 xrplTxHash,uint256 nonce,uint256 deadline)"); + + wXRP public immutable wXRP_TOKEN; + + mapping(uint256 => bool) public usedNonces; + address public hsmSigner; + + event MintExecuted( + address indexed to, + uint256 amount, + bytes32 xrplTxHash, + address executor + ); + + event BurnExecuted( + address indexed from, + uint256 amount, + bytes32 xrplTxHash, + address executor + ); + + event HSMSignerUpdated(address oldSigner, address newSigner); + + struct MintRequest { + address to; + uint256 amount; + bytes32 xrplTxHash; + uint256 nonce; + uint256 deadline; + bytes hsmSignature; + } + + struct BurnRequest { + address from; + uint256 amount; + bytes32 xrplTxHash; + uint256 nonce; + uint256 deadline; + bytes hsmSignature; + } + + error ZeroAmount(); + error ZeroAddress(); + error InvalidSignature(); + error NonceAlreadyUsed(); + error DeadlineExpired(); + error InvalidNonce(); + + constructor(address admin, address _wXRP, address _hsmSigner) EIP712("MintBurnController", "1") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(OPERATOR_ROLE, admin); + wXRP_TOKEN = wXRP(_wXRP); + hsmSigner = _hsmSigner; + } + + /** + * @notice Update HSM signer address + * @param newSigner New HSM signer address + */ + function setHSMSigner(address newSigner) external onlyRole(DEFAULT_ADMIN_ROLE) { + if (newSigner == address(0)) revert ZeroAddress(); + address oldSigner = hsmSigner; + hsmSigner = newSigner; + emit HSMSignerUpdated(oldSigner, newSigner); + } + + /** + * @notice Execute mint with HSM signature + * @param request Mint request with HSM signature + */ + function executeMint(MintRequest calldata request) external onlyRole(OPERATOR_ROLE) whenNotPaused { + if (request.to == address(0)) revert ZeroAddress(); + if (request.amount == 0) revert ZeroAmount(); + if (block.timestamp > request.deadline) revert DeadlineExpired(); + if (usedNonces[request.nonce]) revert NonceAlreadyUsed(); + + // Verify HSM signature + bytes32 structHash = keccak256( + abi.encode( + MINT_TYPEHASH, + request.to, + request.amount, + request.xrplTxHash, + request.nonce, + request.deadline + ) + ); + bytes32 hash = _hashTypedDataV4(structHash); + + if (hash.recover(request.hsmSignature) != hsmSigner) { + revert InvalidSignature(); + } + + usedNonces[request.nonce] = true; + + wXRP_TOKEN.mint(request.to, request.amount, request.xrplTxHash); + + emit MintExecuted(request.to, request.amount, request.xrplTxHash, msg.sender); + } + + /** + * @notice Execute burn with HSM signature + * @param request Burn request with HSM signature + */ + function executeBurn(BurnRequest calldata request) external onlyRole(OPERATOR_ROLE) whenNotPaused { + if (request.from == address(0)) revert ZeroAddress(); + if (request.amount == 0) revert ZeroAmount(); + if (block.timestamp > request.deadline) revert DeadlineExpired(); + if (usedNonces[request.nonce]) revert NonceAlreadyUsed(); + + // Verify HSM signature + bytes32 structHash = keccak256( + abi.encode( + BURN_TYPEHASH, + request.from, + request.amount, + request.xrplTxHash, + request.nonce, + request.deadline + ) + ); + bytes32 hash = _hashTypedDataV4(structHash); + + if (hash.recover(request.hsmSignature) != hsmSigner) { + revert InvalidSignature(); + } + + usedNonces[request.nonce] = true; + + wXRP_TOKEN.burnFrom(request.from, request.amount, request.xrplTxHash); + + emit BurnExecuted(request.from, request.amount, request.xrplTxHash, msg.sender); + } + + /** + * @notice Pause controller + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /** + * @notice Unpause controller + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/wXRP.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/wXRP.sol new file mode 100644 index 0000000..dea7b1c --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/interop/wXRP.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; + +/** + * @title wXRP + * @notice Wrapped XRP token (ERC-20) representing XRP locked on XRPL + * @dev Mintable/burnable by authorized bridge controller only + */ +contract wXRP is ERC20, ERC20Burnable, AccessControl, Pausable { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + + uint8 private constant DECIMALS = 18; + + event Minted(address indexed to, uint256 amount, bytes32 xrplTxHash); + event Burned(address indexed from, uint256 amount, bytes32 xrplTxHash); + + error ZeroAmount(); + error ZeroAddress(); + + constructor(address admin) ERC20("Wrapped XRP", "wXRP") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MINTER_ROLE, admin); + _grantRole(BURNER_ROLE, admin); + } + + /** + * @notice Mint wXRP tokens (bridge controller only) + * @param to Recipient address + * @param amount Amount to mint + * @param xrplTxHash XRPL transaction hash that locked the XRP + */ + function mint( + address to, + uint256 amount, + bytes32 xrplTxHash + ) external onlyRole(MINTER_ROLE) whenNotPaused { + if (to == address(0)) revert ZeroAddress(); + if (amount == 0) revert ZeroAmount(); + + _mint(to, amount); + emit Minted(to, amount, xrplTxHash); + } + + /** + * @notice Burn wXRP tokens to unlock XRP on XRPL (bridge controller only) + * @param from Address to burn from + * @param amount Amount to burn + * @param xrplTxHash XRPL transaction hash for the unlock + */ + function burnFrom( + address from, + uint256 amount, + bytes32 xrplTxHash + ) external onlyRole(BURNER_ROLE) whenNotPaused { + if (from == address(0)) revert ZeroAddress(); + if (amount == 0) revert ZeroAmount(); + + _burn(from, amount); + emit Burned(from, amount, xrplTxHash); + } + + /** + * @notice Override decimals to return 18 + */ + function decimals() public pure override returns (uint8) { + return DECIMALS; + } + + /** + * @notice Pause token transfers + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /** + * @notice Unpause token transfers + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/modules/BridgeModuleRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/modules/BridgeModuleRegistry.sol new file mode 100644 index 0000000..b009115 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/modules/BridgeModuleRegistry.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title BridgeModuleRegistry + * @notice Registry for bridge modules (hooks, validators, fee calculators) + * @dev Enables extending bridge functionality without modifying core contracts + */ +contract BridgeModuleRegistry is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant MODULE_ADMIN_ROLE = keccak256("MODULE_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + enum ModuleType { + PreBridgeHook, // Execute before bridge (e.g., compliance check) + PostBridgeHook, // Execute after bridge (e.g., notification) + FeeCalculator, // Custom fee calculation + RateLimiter, // Rate limiting logic + Validator // Custom validation + } + + struct Module { + address implementation; + bool active; + uint256 priority; + uint256 registeredAt; + } + + // Storage + mapping(ModuleType => address[]) public modules; + mapping(ModuleType => mapping(address => Module)) public moduleInfo; + mapping(ModuleType => uint256) public moduleCount; + + event ModuleRegistered( + ModuleType indexed moduleType, + address indexed module, + uint256 priority + ); + + event ModuleUnregistered( + ModuleType indexed moduleType, + address indexed module + ); + + event ModuleExecuted( + ModuleType indexed moduleType, + address indexed module, + bool success + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MODULE_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Register module + */ + function registerModule( + ModuleType moduleType, + address module, + uint256 priority + ) external onlyRole(MODULE_ADMIN_ROLE) { + require(module != address(0), "Zero address"); + require(module.code.length > 0, "Not a contract"); + require(moduleInfo[moduleType][module].implementation == address(0), "Already registered"); + + modules[moduleType].push(module); + moduleInfo[moduleType][module] = Module({ + implementation: module, + active: true, + priority: priority, + registeredAt: block.timestamp + }); + + moduleCount[moduleType]++; + + emit ModuleRegistered(moduleType, module, priority); + } + + /** + * @notice Unregister module + */ + function unregisterModule( + ModuleType moduleType, + address module + ) external onlyRole(MODULE_ADMIN_ROLE) { + require(moduleInfo[moduleType][module].implementation != address(0), "Not registered"); + + moduleInfo[moduleType][module].active = false; + moduleCount[moduleType]--; + + emit ModuleUnregistered(moduleType, module); + } + + /** + * @notice Execute all modules of a type + */ + function executeModules( + ModuleType moduleType, + bytes calldata data + ) external returns (bytes[] memory results) { + address[] memory activeModules = modules[moduleType]; + uint256 activeCount = 0; + + // Count active modules + for (uint256 i = 0; i < activeModules.length; i++) { + if (moduleInfo[moduleType][activeModules[i]].active) { + activeCount++; + } + } + + results = new bytes[](activeCount); + uint256 resultIndex = 0; + + // Execute each active module + for (uint256 i = 0; i < activeModules.length; i++) { + address module = activeModules[i]; + + if (!moduleInfo[moduleType][module].active) continue; + + (bool success, bytes memory result) = module.call(data); + + emit ModuleExecuted(moduleType, module, success); + + if (success) { + results[resultIndex] = result; + resultIndex++; + } + } + + return results; + } + + /** + * @notice Execute single module + */ + function executeModule( + ModuleType moduleType, + address module, + bytes calldata data + ) external returns (bytes memory result) { + require(moduleInfo[moduleType][module].active, "Module not active"); + + (bool success, bytes memory returnData) = module.call(data); + + emit ModuleExecuted(moduleType, module, success); + + require(success, "Module execution failed"); + + return returnData; + } + + /** + * @notice Set module priority + */ + function setModulePriority( + ModuleType moduleType, + address module, + uint256 priority + ) external onlyRole(MODULE_ADMIN_ROLE) { + require(moduleInfo[moduleType][module].implementation != address(0), "Not registered"); + + moduleInfo[moduleType][module].priority = priority; + } + + // View functions + + function getModules(ModuleType moduleType) external view returns (address[] memory) { + return modules[moduleType]; + } + + function getActiveModules(ModuleType moduleType) external view returns (address[] memory) { + address[] memory allModules = modules[moduleType]; + uint256 activeCount = 0; + + for (uint256 i = 0; i < allModules.length; i++) { + if (moduleInfo[moduleType][allModules[i]].active) { + activeCount++; + } + } + + address[] memory activeModules = new address[](activeCount); + uint256 index = 0; + + for (uint256 i = 0; i < allModules.length; i++) { + if (moduleInfo[moduleType][allModules[i]].active) { + activeModules[index] = allModules[i]; + index++; + } + } + + return activeModules; + } + + function getModuleInfo(ModuleType moduleType, address module) + external view returns (Module memory) { + return moduleInfo[moduleType][module]; + } + + function getModuleCount(ModuleType moduleType) external view returns (uint256) { + return moduleCount[moduleType]; + } + + function isModuleActive(ModuleType moduleType, address module) external view returns (bool) { + return moduleInfo[moduleType][module].active; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/BondManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/BondManager.sol new file mode 100644 index 0000000..0683ea9 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/BondManager.sol @@ -0,0 +1,267 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title BondManager + * @notice Manages bonds for trustless bridge claims with dynamic sizing and slashing + * @dev Bonds are posted in ETH. Slashed bonds split 50% to challenger, 50% burned (sent to address(0)). + */ +contract BondManager is ReentrancyGuard { + // Bond configuration + uint256 public immutable bondMultiplier; // Basis points (11000 = 110%) + uint256 public immutable minBond; // Minimum bond amount in wei + + // Bond tracking + struct Bond { + address relayer; // Slot 0 (20 bytes) + 12 bytes padding + uint256 amount; // Slot 1 + uint256 depositId; // Slot 2 + bool slashed; // Slot 3 (1 byte) + 31 bytes padding + bool released; // Slot 4 (1 byte) + 31 bytes padding + // Note: Could pack slashed and released in same slot, but keeping separate for clarity + } + + mapping(uint256 => Bond) public bonds; // depositId => Bond + mapping(address => uint256) public totalBonds; // relayer => total bonded amount + + event BondPosted( + uint256 indexed depositId, + address indexed relayer, + uint256 bondAmount + ); + + event BondSlashed( + uint256 indexed depositId, + address indexed relayer, + address indexed challenger, + uint256 bondAmount, + uint256 challengerReward, + uint256 burnedAmount + ); + + event BondReleased( + uint256 indexed depositId, + address indexed relayer, + uint256 bondAmount + ); + + error ZeroDepositId(); + error ZeroRelayer(); + error InsufficientBond(); + error BondNotFound(); + error BondAlreadySlashed(); + error BondAlreadyReleased(); + error BondNotReleased(); + + /** + * @notice Constructor sets bond parameters + * @param _bondMultiplier Bond multiplier in basis points (11000 = 110% = 1.1x) + * @param _minBond Minimum bond amount in wei + */ + constructor(uint256 _bondMultiplier, uint256 _minBond) { + require(_bondMultiplier >= 10000, "BondManager: multiplier must be >= 100%"); + require(_minBond > 0, "BondManager: minBond must be > 0"); + bondMultiplier = _bondMultiplier; + minBond = _minBond; + } + + /** + * @notice Post bond for a claim + * @param depositId Deposit ID from source chain + * @param depositAmount Amount of the deposit (used to calculate bond size) + * @param relayer Address of the relayer posting the bond (can be different from msg.sender if called by InboxETH) + * @return bondAmount The bond amount that was posted + */ + function postBond( + uint256 depositId, + uint256 depositAmount, + address relayer + ) external payable nonReentrant returns (uint256) { + if (depositId == 0) revert ZeroDepositId(); + if (relayer == address(0)) revert ZeroRelayer(); + + // Check if bond already exists + require(bonds[depositId].relayer == address(0), "BondManager: bond already posted"); + + // Calculate required bond amount + uint256 requiredBond = getRequiredBond(depositAmount); + if (msg.value < requiredBond) revert InsufficientBond(); + + // Store bond information + bonds[depositId] = Bond({ + relayer: relayer, + amount: msg.value, + depositId: depositId, + slashed: false, + released: false + }); + + totalBonds[relayer] += msg.value; + + emit BondPosted(depositId, msg.sender, msg.value); + + return msg.value; + } + + /** + * @notice Slash bond due to fraudulent claim + * @param depositId Deposit ID associated with the bond + * @param challenger Address of the challenger proving fraud + * @return challengerReward Amount sent to challenger + * @return burnedAmount Amount burned (sent to address(0)) + */ + function slashBond( + uint256 depositId, + address challenger + ) external nonReentrant returns (uint256 challengerReward, uint256 burnedAmount) { + Bond storage bond = bonds[depositId]; + + if (bond.relayer == address(0)) revert BondNotFound(); + if (bond.slashed) revert BondAlreadySlashed(); + if (challenger == address(0)) revert ZeroRelayer(); + + // Mark bond as slashed + bond.slashed = true; + + uint256 bondAmount = bond.amount; + + // Update relayer's total bonds + totalBonds[bond.relayer] -= bondAmount; + + // Split bond: 50% to challenger, 50% burned + challengerReward = bondAmount / 2; + burnedAmount = bondAmount - challengerReward; // Handle odd amounts + + // Transfer to challenger + (bool success1, ) = payable(challenger).call{value: challengerReward}(""); + require(success1, "BondManager: challenger transfer failed"); + + // Burn remaining amount (send to address(0)) + // Note: In practice, sending ETH to address(0) doesn't actually burn it, + // but it makes the funds inaccessible. For true burning, consider using a burn mechanism. + (bool success2, ) = payable(address(0)).call{value: burnedAmount}(""); + require(success2, "BondManager: burn transfer failed"); + + emit BondSlashed( + depositId, + bond.relayer, + challenger, + bondAmount, + challengerReward, + burnedAmount + ); + + return (challengerReward, burnedAmount); + } + + /** + * @notice Release bond after successful claim finalization + * @param depositId Deposit ID associated with the bond + * @return bondAmount Amount returned to relayer + */ + function releaseBond( + uint256 depositId + ) external nonReentrant returns (uint256) { + Bond storage bond = bonds[depositId]; + + if (bond.relayer == address(0)) revert BondNotFound(); + if (bond.slashed) revert BondAlreadySlashed(); + if (bond.released) revert BondAlreadyReleased(); + + // Mark bond as released + bond.released = true; + + uint256 bondAmount = bond.amount; + address relayer = bond.relayer; // Cache to save gas + + // Update relayer's total bonds + totalBonds[relayer] -= bondAmount; + + // Transfer bond back to relayer + (bool success, ) = payable(relayer).call{value: bondAmount}(""); + require(success, "BondManager: release transfer failed"); + + emit BondReleased(depositId, relayer, bondAmount); + + return bondAmount; + } + + /** + * @notice Release multiple bonds in batch (gas optimization) + * @param depositIds Array of deposit IDs to release bonds for + * @return totalReleased Total amount released + */ + function releaseBondsBatch(uint256[] calldata depositIds) external nonReentrant returns (uint256 totalReleased) { + uint256 length = depositIds.length; + require(length > 0, "BondManager: empty array"); + require(length <= 50, "BondManager: batch too large"); // Prevent gas limit issues + + for (uint256 i = 0; i < length; i++) { + uint256 depositId = depositIds[i]; + if (depositId == 0) continue; // Skip zero IDs + + Bond storage bond = bonds[depositId]; + if (bond.relayer == address(0)) continue; // Skip non-existent bonds + if (bond.slashed) continue; // Skip slashed bonds + if (bond.released) continue; // Skip already released + + bond.released = true; + uint256 bondAmount = bond.amount; + address relayer = bond.relayer; // Cache to save gas + + totalBonds[relayer] -= bondAmount; + totalReleased += bondAmount; + + (bool success, ) = payable(relayer).call{value: bondAmount}(""); + require(success, "BondManager: release transfer failed"); + + emit BondReleased(depositId, relayer, bondAmount); + } + + return totalReleased; + } + + /** + * @notice Calculate required bond amount for a deposit + * @param depositAmount Amount of the deposit + * @return requiredBond Minimum bond amount required + */ + function getRequiredBond(uint256 depositAmount) public view returns (uint256) { + uint256 calculatedBond = (depositAmount * bondMultiplier) / 10000; + return calculatedBond > minBond ? calculatedBond : minBond; + } + + /** + * @notice Get bond information for a deposit + * @param depositId Deposit ID to check + * @return relayer Address that posted the bond + * @return amount Bond amount + * @return slashed Whether bond has been slashed + * @return released Whether bond has been released + */ + function getBond( + uint256 depositId + ) external view returns ( + address relayer, + uint256 amount, + bool slashed, + bool released + ) { + Bond memory bond = bonds[depositId]; + return (bond.relayer, bond.amount, bond.slashed, bond.released); + } + + /** + * @notice Get total bonds posted by a relayer + * @param relayer Address to check + * @return Total amount of bonds posted + */ + function getTotalBonds(address relayer) external view returns (uint256) { + return totalBonds[relayer]; + } + + // Allow contract to receive ETH + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/BridgeSwapCoordinator.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/BridgeSwapCoordinator.sol new file mode 100644 index 0000000..85ec208 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/BridgeSwapCoordinator.sol @@ -0,0 +1,171 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./InboxETH.sol"; +import "./LiquidityPoolETH.sol"; +import "./SwapRouter.sol"; +import "./ChallengeManager.sol"; + +/** + * @title BridgeSwapCoordinator + * @notice Coordinates bridge release + swap in single transaction + * @dev Verifies claim finalization, releases from liquidity pool, executes swap, transfers stablecoin + */ +contract BridgeSwapCoordinator is ReentrancyGuard { + using SafeERC20 for IERC20; + + InboxETH public immutable inbox; + LiquidityPoolETH public immutable liquidityPool; + SwapRouter public immutable swapRouter; + ChallengeManager public immutable challengeManager; + + event BridgeSwapExecuted( + uint256 indexed depositId, + address indexed recipient, + LiquidityPoolETH.AssetType inputAsset, + uint256 bridgeAmount, + address stablecoinToken, + uint256 stablecoinAmount + ); + + error ZeroDepositId(); + error ZeroRecipient(); + error ClaimNotFinalized(); + error ClaimChallenged(); + error InsufficientOutput(); + + /** + * @notice Constructor + * @param _inbox InboxETH contract address + * @param _liquidityPool LiquidityPoolETH contract address + * @param _swapRouter SwapRouter contract address + * @param _challengeManager ChallengeManager contract address + */ + constructor( + address _inbox, + address _liquidityPool, + address _swapRouter, + address _challengeManager + ) { + require(_inbox != address(0), "BridgeSwapCoordinator: zero inbox"); + require(_liquidityPool != address(0), "BridgeSwapCoordinator: zero liquidity pool"); + require(_swapRouter != address(0), "BridgeSwapCoordinator: zero swap router"); + require(_challengeManager != address(0), "BridgeSwapCoordinator: zero challenge manager"); + + inbox = InboxETH(payable(_inbox)); + liquidityPool = LiquidityPoolETH(payable(_liquidityPool)); + swapRouter = SwapRouter(payable(_swapRouter)); + challengeManager = ChallengeManager(payable(_challengeManager)); + } + + /** + * @notice Execute bridge release + swap to stablecoin + * @param depositId Deposit ID + * @param recipient Recipient address (should match claim recipient) + * @param outputAsset Asset type from bridge (ETH or WETH) + * @param stablecoinToken Target stablecoin address (USDT, USDC, or DAI) + * @param amountOutMin Minimum stablecoin output (slippage protection) + * @param routeData Optional route data for swap (for 1inch) + * @return stablecoinAmount Amount of stablecoin received + */ + function bridgeAndSwap( + uint256 depositId, + address recipient, + LiquidityPoolETH.AssetType outputAsset, + address stablecoinToken, + uint256 amountOutMin, + bytes calldata routeData + ) external nonReentrant returns (uint256 stablecoinAmount) { + if (depositId == 0) revert ZeroDepositId(); + if (recipient == address(0)) revert ZeroRecipient(); + + // Verify claim is finalized + ChallengeManager.Claim memory claim = challengeManager.getClaim(depositId); + if (claim.depositId == 0) revert("BridgeSwapCoordinator: claim not found"); + if (!claim.finalized) revert ClaimNotFinalized(); + if (claim.challenged) revert ClaimChallenged(); + if (claim.recipient != recipient) revert("BridgeSwapCoordinator: recipient mismatch"); + + // Use amount from claim (ChallengeManager has the claim data) + uint256 bridgeAmount = claim.amount; + + // Add pending claim (this should have been done during claim submission, but check anyway) + // Note: In production, you'd want to track whether funds have already been released + + // Release funds from liquidity pool to this contract + liquidityPool.releaseToRecipient(depositId, address(this), bridgeAmount, outputAsset); + + // Execute swap + if (outputAsset == LiquidityPoolETH.AssetType.ETH) { + // Swap ETH to stablecoin via SwapRouter + stablecoinAmount = swapRouter.swapToStablecoin{value: bridgeAmount}( + outputAsset, + stablecoinToken, + bridgeAmount, + amountOutMin, + routeData + ); + } else { + // WETH case: approve and swap + // Get WETH address from liquidity pool + address wethAddress = liquidityPool.getWeth(); + IERC20 wethToken = IERC20(wethAddress); + wethToken.approve(address(swapRouter), bridgeAmount); + + stablecoinAmount = swapRouter.swapToStablecoin( + outputAsset, + stablecoinToken, + bridgeAmount, + amountOutMin, + routeData + ); + } + + if (stablecoinAmount < amountOutMin) revert InsufficientOutput(); + + // Transfer stablecoin to recipient + IERC20(stablecoinToken).safeTransfer(recipient, stablecoinAmount); + + // Note: Bond release should be handled separately after finalization + // This coordinator only handles bridge release + swap + + emit BridgeSwapExecuted( + depositId, + recipient, + outputAsset, + bridgeAmount, + stablecoinToken, + stablecoinAmount + ); + + return stablecoinAmount; + } + + /** + * @notice Check if claim can be swapped + * @param depositId Deposit ID + * @return canSwap_ True if claim can be swapped + * @return reason Reason if cannot swap + */ + function canSwap(uint256 depositId) external view returns (bool canSwap_, string memory reason) { + ChallengeManager.Claim memory claim = challengeManager.getClaim(depositId); + + if (claim.depositId == 0) { + return (false, "Claim not found"); + } + if (!claim.finalized) { + return (false, "Claim not finalized"); + } + if (claim.challenged) { + return (false, "Claim was challenged"); + } + + return (true, ""); + } + + // Allow contract to receive ETH + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/ChallengeManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/ChallengeManager.sol new file mode 100644 index 0000000..a596b3f --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/ChallengeManager.sol @@ -0,0 +1,458 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./BondManager.sol"; +import "./libraries/MerkleProofVerifier.sol"; +import "./libraries/FraudProofTypes.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title ChallengeManager + * @notice Manages fraud proof challenges for trustless bridge claims + * @dev Permissionless challenging mechanism with automated slashing on successful challenges + */ +contract ChallengeManager is ReentrancyGuard { + BondManager public immutable bondManager; + uint256 public immutable challengeWindow; // Challenge window duration in seconds + + enum FraudProofType { + NonExistentDeposit, // Deposit doesn't exist on source chain + IncorrectAmount, // Amount mismatch + IncorrectRecipient, // Recipient mismatch + DoubleSpend // Deposit already claimed elsewhere + } + + struct Challenge { + address challenger; + uint256 depositId; + FraudProofType proofType; + bytes proof; + uint256 timestamp; + bool resolved; + } + + struct Claim { + uint256 depositId; // Slot 0 + address asset; // Slot 1 (20 bytes) + 12 bytes padding + address recipient; // Slot 2 (20 bytes) + 12 bytes padding + uint256 amount; // Slot 3 + uint256 challengeWindowEnd; // Slot 4 + bool finalized; // Slot 5 (1 byte) + 31 bytes padding + bool challenged; // Slot 6 (1 byte) + 31 bytes padding + // Note: Could pack finalized and challenged in same slot, but keeping separate for clarity + } + + mapping(uint256 => Claim) public claims; // depositId => Claim + mapping(uint256 => Challenge) public challenges; // depositId => Challenge + + event ClaimSubmitted( + uint256 indexed depositId, + address indexed asset, + uint256 amount, + address indexed recipient, + uint256 challengeWindowEnd + ); + + event ClaimChallenged( + uint256 indexed depositId, + address indexed challenger, + FraudProofType proofType + ); + + event FraudProven( + uint256 indexed depositId, + address indexed challenger, + FraudProofType proofType, + uint256 slashedAmount + ); + + event ChallengeRejected( + uint256 indexed depositId, + address indexed challenger + ); + + event ClaimFinalized( + uint256 indexed depositId + ); + + error ZeroDepositId(); + error ClaimNotFound(); + error ClaimAlreadyFinalized(); + error ClaimAlreadyChallenged(); + error ChallengeWindowExpired(); + error ChallengeWindowNotExpired(); + error InvalidFraudProof(); + error ChallengeNotFound(); + error ChallengeAlreadyResolved(); + + /** + * @notice Constructor + * @param _bondManager Address of BondManager contract + * @param _challengeWindow Challenge window duration in seconds + */ + constructor(address _bondManager, uint256 _challengeWindow) { + require(_bondManager != address(0), "ChallengeManager: zero bond manager"); + require(_challengeWindow > 0, "ChallengeManager: zero challenge window"); + bondManager = BondManager(payable(_bondManager)); + challengeWindow = _challengeWindow; + } + + /** + * @notice Register a claim (called by InboxETH) + * @param depositId Deposit ID from source chain + * @param asset Asset address (address(0) for native ETH) + * @param amount Deposit amount + * @param recipient Recipient address + */ + function registerClaim( + uint256 depositId, + address asset, + uint256 amount, + address recipient + ) external { + if (depositId == 0) revert ZeroDepositId(); + + // Only allow one claim per deposit ID + require(claims[depositId].depositId == 0, "ChallengeManager: claim already registered"); + + uint256 challengeWindowEnd = block.timestamp + challengeWindow; + + claims[depositId] = Claim({ + depositId: depositId, + asset: asset, + amount: amount, + recipient: recipient, + challengeWindowEnd: challengeWindowEnd, + finalized: false, + challenged: false + }); + + emit ClaimSubmitted(depositId, asset, amount, recipient, challengeWindowEnd); + } + + /** + * @notice Challenge a claim with fraud proof + * @param depositId Deposit ID of the claim to challenge + * @param proofType Type of fraud proof + * @param proof Fraud proof data (format depends on proofType) + */ + function challengeClaim( + uint256 depositId, + FraudProofType proofType, + bytes calldata proof + ) external nonReentrant { + if (depositId == 0) revert ZeroDepositId(); + + Claim storage claim = claims[depositId]; + if (claim.depositId == 0) revert ClaimNotFound(); + if (claim.finalized) revert ClaimAlreadyFinalized(); + if (claim.challenged) revert ClaimAlreadyChallenged(); + if (block.timestamp > claim.challengeWindowEnd) revert ChallengeWindowExpired(); + + // Verify fraud proof (pass storage reference to save gas) + if (!_verifyFraudProof(depositId, claim, proofType, proof)) { + revert InvalidFraudProof(); + } + + // Mark claim as challenged + claim.challenged = true; + + // Store challenge + challenges[depositId] = Challenge({ + challenger: msg.sender, + depositId: depositId, + proofType: proofType, + proof: proof, + timestamp: block.timestamp, + resolved: false + }); + + emit ClaimChallenged(depositId, msg.sender, proofType); + + // Automatically slash bond and mark challenge as resolved + (uint256 challengerReward, ) = bondManager.slashBond(depositId, msg.sender); + + challenges[depositId].resolved = true; + + emit FraudProven(depositId, msg.sender, proofType, challengerReward * 2); // Total slashed amount + } + + /** + * @notice Finalize a claim after challenge window expires without challenge + * @param depositId Deposit ID to finalize + */ + function finalizeClaim(uint256 depositId) external { + if (depositId == 0) revert ZeroDepositId(); + + Claim storage claim = claims[depositId]; + if (claim.depositId == 0) revert ClaimNotFound(); + if (claim.finalized) revert ClaimAlreadyFinalized(); + if (claim.challenged) revert ClaimAlreadyChallenged(); + if (block.timestamp <= claim.challengeWindowEnd) revert ChallengeWindowNotExpired(); + + claim.finalized = true; + + emit ClaimFinalized(depositId); + } + + /** + * @notice Finalize multiple claims in batch (gas optimization) + * @param depositIds Array of deposit IDs to finalize + */ + function finalizeClaimsBatch(uint256[] calldata depositIds) external { + uint256 length = depositIds.length; + require(length > 0, "ChallengeManager: empty array"); + require(length <= 50, "ChallengeManager: batch too large"); // Prevent gas limit issues + + for (uint256 i = 0; i < length; i++) { + uint256 depositId = depositIds[i]; + if (depositId == 0) continue; // Skip zero IDs + + Claim storage claim = claims[depositId]; + if (claim.depositId == 0) continue; // Skip non-existent claims + if (claim.finalized) continue; // Skip already finalized + if (claim.challenged) continue; // Skip challenged claims + if (block.timestamp <= claim.challengeWindowEnd) continue; // Skip if window not expired + + claim.finalized = true; + emit ClaimFinalized(depositId); + } + } + + /** + * @notice Verify fraud proof (internal function) + * @dev Verifies fraud proofs against source chain state using Merkle proofs + * @param depositId Deposit ID + * @param claim Claim data + * @param proofType Type of fraud proof + * @param proof Proof data (encoded according to proofType) + * @return True if fraud proof is valid + */ + function _verifyFraudProof( + uint256 depositId, + Claim storage claim, // Changed to storage to save gas + FraudProofType proofType, + bytes calldata proof + ) internal view returns (bool) { + if (proof.length == 0) return false; + + if (proofType == FraudProofType.NonExistentDeposit) { + return _verifyNonExistentDeposit(depositId, claim, proof); + } else if (proofType == FraudProofType.IncorrectAmount) { + return _verifyIncorrectAmount(depositId, claim, proof); + } else if (proofType == FraudProofType.IncorrectRecipient) { + return _verifyIncorrectRecipient(depositId, claim, proof); + } else if (proofType == FraudProofType.DoubleSpend) { + return _verifyDoubleSpend(depositId, claim, proof); + } + + return false; + } + + /** + * @notice Verify non-existent deposit fraud proof + * @param depositId Deposit ID + * @param claim Claim data + * @param proof Encoded NonExistentDepositProof + * @return True if proof is valid + */ + function _verifyNonExistentDeposit( + uint256 depositId, + Claim storage claim, // Changed to storage to save gas + bytes calldata proof + ) internal view returns (bool) { + FraudProofTypes.NonExistentDepositProof memory fraudProof = + FraudProofTypes.decodeNonExistentDeposit(proof); + + // Verify state root against block header + if (!MerkleProofVerifier.verifyStateRoot(fraudProof.blockHeader, fraudProof.stateRoot)) { + return false; + } + + // Hash the claimed deposit data + bytes32 claimedDepositHash = MerkleProofVerifier.hashDepositData( + depositId, + claim.asset, + claim.amount, + claim.recipient, + block.timestamp // Note: In production, use actual deposit timestamp from source chain + ); + + // Verify that the claimed deposit hash matches the proof + if (claimedDepositHash != fraudProof.depositHash) { + return false; + } + + // Verify non-existence proof (deposit doesn't exist in Merkle tree) + return MerkleProofVerifier.verifyDepositNonExistence( + fraudProof.stateRoot, + fraudProof.depositHash, + fraudProof.merkleProof, + fraudProof.leftSibling, + fraudProof.rightSibling + ); + } + + /** + * @notice Verify incorrect amount fraud proof + * @param depositId Deposit ID + * @param claim Claim data + * @param proof Encoded IncorrectAmountProof + * @return True if proof is valid + */ + function _verifyIncorrectAmount( + uint256 depositId, + Claim storage claim, // Changed to storage to save gas + bytes calldata proof + ) internal view returns (bool) { + FraudProofTypes.IncorrectAmountProof memory fraudProof = + FraudProofTypes.decodeIncorrectAmount(proof); + + // Verify state root against block header + if (!MerkleProofVerifier.verifyStateRoot(fraudProof.blockHeader, fraudProof.stateRoot)) { + return false; + } + + // Verify that actual amount differs from claimed amount + if (fraudProof.actualAmount == claim.amount) { + return false; // Amounts match, not a fraud + } + + // Hash the actual deposit data + bytes32 actualDepositHash = MerkleProofVerifier.hashDepositData( + depositId, + claim.asset, + fraudProof.actualAmount, + claim.recipient, + block.timestamp // Note: In production, use actual deposit timestamp + ); + + // Verify Merkle proof for actual deposit + return MerkleProofVerifier.verifyDepositExistence( + fraudProof.stateRoot, + actualDepositHash, + fraudProof.merkleProof + ); + } + + /** + * @notice Verify incorrect recipient fraud proof + * @param depositId Deposit ID + * @param claim Claim data + * @param proof Encoded IncorrectRecipientProof + * @return True if proof is valid + */ + function _verifyIncorrectRecipient( + uint256 depositId, + Claim storage claim, // Changed to storage to save gas + bytes calldata proof + ) internal view returns (bool) { + FraudProofTypes.IncorrectRecipientProof memory fraudProof = + FraudProofTypes.decodeIncorrectRecipient(proof); + + // Verify state root against block header + if (!MerkleProofVerifier.verifyStateRoot(fraudProof.blockHeader, fraudProof.stateRoot)) { + return false; + } + + // Verify that actual recipient differs from claimed recipient + if (fraudProof.actualRecipient == claim.recipient) { + return false; // Recipients match, not a fraud + } + + // Hash the actual deposit data + bytes32 actualDepositHash = MerkleProofVerifier.hashDepositData( + depositId, + claim.asset, + claim.amount, + fraudProof.actualRecipient, + block.timestamp // Note: In production, use actual deposit timestamp + ); + + // Verify Merkle proof for actual deposit + return MerkleProofVerifier.verifyDepositExistence( + fraudProof.stateRoot, + actualDepositHash, + fraudProof.merkleProof + ); + } + + /** + * @notice Verify double spend fraud proof + * @param depositId Deposit ID + * @param claim Claim data + * @param proof Encoded DoubleSpendProof + * @return True if proof is valid + */ + function _verifyDoubleSpend( + uint256 depositId, + Claim storage claim, // Changed to storage to save gas + bytes calldata proof + ) internal view returns (bool) { + FraudProofTypes.DoubleSpendProof memory fraudProof = + FraudProofTypes.decodeDoubleSpend(proof); + + // Verify that the previous claim ID is different (same deposit claimed twice) + if (fraudProof.previousClaimId == depositId) { + // Check if previous claim exists and is finalized (use storage to save gas) + Claim storage previousClaim = claims[fraudProof.previousClaimId]; + if (previousClaim.depositId == 0 || !previousClaim.finalized) { + return false; // Previous claim doesn't exist or isn't finalized + } + + // Verify that the deposit data matches (same deposit, different claim) + if ( + previousClaim.asset == claim.asset && + previousClaim.amount == claim.amount && + previousClaim.recipient == claim.recipient + ) { + return true; // Double spend detected + } + } + + return false; + } + + /** + * @notice Check if a claim can be finalized + * @param depositId Deposit ID to check + * @return canFinalize_ True if claim can be finalized + * @return reason Reason if cannot finalize + */ + function canFinalize(uint256 depositId) external view returns (bool canFinalize_, string memory reason) { + Claim memory claim = claims[depositId]; + + if (claim.depositId == 0) { + return (false, "Claim not found"); + } + if (claim.finalized) { + return (false, "Already finalized"); + } + if (claim.challenged) { + return (false, "Claim was challenged"); + } + if (block.timestamp <= claim.challengeWindowEnd) { + return (false, "Challenge window not expired"); + } + + return (true, ""); + } + + /** + * @notice Get claim information + * @param depositId Deposit ID + * @return Claim data + */ + function getClaim(uint256 depositId) external view returns (Claim memory) { + return claims[depositId]; + } + + /** + * @notice Get challenge information + * @param depositId Deposit ID + * @return Challenge data + */ + function getChallenge(uint256 depositId) external view returns (Challenge memory) { + return challenges[depositId]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/EnhancedSwapRouter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/EnhancedSwapRouter.sol new file mode 100644 index 0000000..4d0aa54 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/EnhancedSwapRouter.sol @@ -0,0 +1,689 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./LiquidityPoolETH.sol"; +import "./interfaces/ISwapRouter.sol"; +import "./interfaces/ICurvePool.sol"; +import "./interfaces/IAggregationRouter.sol"; +import "./interfaces/IDodoexRouter.sol"; +import "./interfaces/IBalancerVault.sol"; +import "./interfaces/IWETH.sol"; + +/** + * @title EnhancedSwapRouter + * @notice Multi-protocol swap router with intelligent routing and decision logic + * @dev Supports Uniswap V3, Curve, Dodoex PMM, Balancer, and 1inch aggregation + */ +contract EnhancedSwapRouter is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant COORDINATOR_ROLE = keccak256("COORDINATOR_ROLE"); + bytes32 public constant ROUTING_MANAGER_ROLE = keccak256("ROUTING_MANAGER_ROLE"); + + enum SwapProvider { + UniswapV3, + Curve, + Dodoex, + Balancer, + OneInch + } + + // Protocol addresses + address public immutable uniswapV3Router; + address public immutable curve3Pool; + address public immutable dodoexRouter; + address public immutable balancerVault; + address public immutable oneInchRouter; + + // Token addresses + address public immutable weth; + address public immutable usdt; + address public immutable usdc; + address public immutable dai; + + // Routing configuration + struct RoutingConfig { + SwapProvider[] providers; // Ordered list of providers to try + uint256[] sizeThresholds; // Size thresholds in wei + bool enabled; + } + + mapping(SwapProvider => bool) public providerEnabled; + mapping(uint256 => RoutingConfig) public sizeBasedRouting; // size category => config + uint256 public constant SMALL_SWAP_THRESHOLD = 10_000 * 1e18; // $10k + uint256 public constant MEDIUM_SWAP_THRESHOLD = 100_000 * 1e18; // $100k + + // Uniswap V3 fee tiers + uint24 public constant FEE_TIER_LOW = 500; + uint24 public constant FEE_TIER_MEDIUM = 3000; + uint24 public constant FEE_TIER_HIGH = 10000; + + // Balancer pool IDs (example - would be set via admin) + mapping(address => mapping(address => bytes32)) public balancerPoolIds; // tokenIn => tokenOut => poolId + + // Dodoex PMM pool addresses (tokenIn => tokenOut => PMM pool address) + mapping(address => mapping(address => address)) public dodoPoolAddresses; + + /// @dev Uniswap V3 Quoter for on-chain quotes; set via setUniswapQuoter when deployed on 138/651940 + address public uniswapQuoter; + + event SwapExecuted( + SwapProvider indexed provider, + LiquidityPoolETH.AssetType indexed inputAsset, + address indexed tokenIn, + address tokenOut, + uint256 amountIn, + uint256 amountOut, + uint256 gasUsed + ); + + event RoutingConfigUpdated(uint256 sizeCategory, SwapProvider[] providers); + event ProviderToggled(SwapProvider provider, bool enabled); + + error ZeroAddress(); + error ZeroAmount(); + error SwapFailed(); + error InvalidProvider(); + error ProviderDisabled(); + error InsufficientOutput(); + error InvalidRoutingConfig(); + + /** + * @notice Constructor + * @param _uniswapV3Router Uniswap V3 SwapRouter address + * @param _curve3Pool Curve 3pool address + * @param _dodoexRouter Dodoex Router address + * @param _balancerVault Balancer Vault address + * @param _oneInchRouter 1inch Router address (can be address(0)) + * @param _weth WETH address + * @param _usdt USDT address + * @param _usdc USDC address + * @param _dai DAI address + */ + constructor( + address _uniswapV3Router, + address _curve3Pool, + address _dodoexRouter, + address _balancerVault, + address _oneInchRouter, + address _weth, + address _usdt, + address _usdc, + address _dai + ) { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + if (_uniswapV3Router == address(0) || _curve3Pool == address(0) || + _dodoexRouter == address(0) || _balancerVault == address(0) || + _weth == address(0) || _usdt == address(0) || _usdc == address(0) || _dai == address(0)) { + revert ZeroAddress(); + } + + uniswapV3Router = _uniswapV3Router; + curve3Pool = _curve3Pool; + dodoexRouter = _dodoexRouter; + balancerVault = _balancerVault; + oneInchRouter = _oneInchRouter; + weth = _weth; + usdt = _usdt; + usdc = _usdc; + dai = _dai; + + // Enable all providers by default + providerEnabled[SwapProvider.UniswapV3] = true; + providerEnabled[SwapProvider.Curve] = true; + providerEnabled[SwapProvider.Dodoex] = true; + providerEnabled[SwapProvider.Balancer] = true; + if (_oneInchRouter != address(0)) { + providerEnabled[SwapProvider.OneInch] = true; + } + + // Initialize default routing configs + _initializeDefaultRouting(); + } + + /** + * @notice Swap to stablecoin using intelligent routing + * @param inputAsset Input asset type (ETH or WETH) + * @param stablecoinToken Target stablecoin + * @param amountIn Input amount + * @param amountOutMin Minimum output (slippage protection) + * @param preferredProvider Optional preferred provider (0 = auto-select) + * @return amountOut Output amount + * @return providerUsed Provider that executed the swap + */ + function swapToStablecoin( + LiquidityPoolETH.AssetType inputAsset, + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin, + SwapProvider preferredProvider + ) external payable nonReentrant returns (uint256 amountOut, SwapProvider providerUsed) { + if (amountIn == 0) revert ZeroAmount(); + if (stablecoinToken == address(0)) revert ZeroAddress(); + if (!_isValidStablecoin(stablecoinToken)) revert("EnhancedSwapRouter: invalid stablecoin"); + + // Convert ETH to WETH if needed + if (inputAsset == LiquidityPoolETH.AssetType.ETH) { + require(msg.value == amountIn, "EnhancedSwapRouter: ETH amount mismatch"); + IWETH(weth).deposit{value: amountIn}(); + } + + // Get routing providers based on swap size + SwapProvider[] memory providers = _getRoutingProviders(amountIn, preferredProvider); + + // Try each provider in order + for (uint256 i = 0; i < providers.length; i++) { + if (!providerEnabled[providers[i]]) continue; + + try this._executeSwap( + providers[i], + stablecoinToken, + amountIn, + amountOutMin + ) returns (uint256 output) { + if (output >= amountOutMin) { + // Transfer output to caller + IERC20(stablecoinToken).safeTransfer(msg.sender, output); + + emit SwapExecuted( + providers[i], + inputAsset, + weth, + stablecoinToken, + amountIn, + output, + gasleft() + ); + + return (output, providers[i]); + } + } catch { + // Try next provider + continue; + } + } + + revert SwapFailed(); + } + + /** + * @notice Get quote from all enabled providers + * @param stablecoinToken Target stablecoin + * @param amountIn Input amount + * @return providers Array of providers that returned quotes + * @return amounts Array of output amounts for each provider + */ + function getQuotes( + address stablecoinToken, + uint256 amountIn + ) external view returns (SwapProvider[] memory providers, uint256[] memory amounts) { + SwapProvider[] memory enabledProviders = new SwapProvider[](5); + uint256[] memory quotes = new uint256[](5); + uint256 count = 0; + + // Query each enabled provider + if (providerEnabled[SwapProvider.UniswapV3]) { + try this._getUniswapV3Quote(stablecoinToken, amountIn) returns (uint256 quote) { + enabledProviders[count] = SwapProvider.UniswapV3; + quotes[count] = quote; + count++; + } catch {} + } + + if (providerEnabled[SwapProvider.Dodoex]) { + try this._getDodoexQuote(stablecoinToken, amountIn) returns (uint256 quote) { + enabledProviders[count] = SwapProvider.Dodoex; + quotes[count] = quote; + count++; + } catch {} + } + + if (providerEnabled[SwapProvider.Balancer]) { + try this._getBalancerQuote(stablecoinToken, amountIn) returns (uint256 quote) { + enabledProviders[count] = SwapProvider.Balancer; + quotes[count] = quote; + count++; + } catch {} + } + + // Resize arrays + SwapProvider[] memory resultProviders = new SwapProvider[](count); + uint256[] memory resultQuotes = new uint256[](count); + for (uint256 i = 0; i < count; i++) { + resultProviders[i] = enabledProviders[i]; + resultQuotes[i] = quotes[i]; + } + + return (resultProviders, resultQuotes); + } + + /** + * @notice Set routing configuration for a size category + * @param sizeCategory 0 = small, 1 = medium, 2 = large + * @param providers Ordered list of providers to try + */ + function setRoutingConfig( + uint256 sizeCategory, + SwapProvider[] calldata providers + ) external onlyRole(ROUTING_MANAGER_ROLE) { + require(sizeCategory < 3, "EnhancedSwapRouter: invalid size category"); + require(providers.length > 0, "EnhancedSwapRouter: empty providers"); + + sizeBasedRouting[sizeCategory] = RoutingConfig({ + providers: providers, + sizeThresholds: new uint256[](0), + enabled: true + }); + + emit RoutingConfigUpdated(sizeCategory, providers); + } + + /** + * @notice Toggle provider on/off + * @param provider Provider to toggle + * @param enabled Whether to enable + */ + function setProviderEnabled( + SwapProvider provider, + bool enabled + ) external onlyRole(ROUTING_MANAGER_ROLE) { + providerEnabled[provider] = enabled; + emit ProviderToggled(provider, enabled); + } + + /** + * @notice Set Balancer pool ID for a token pair + * @param tokenIn Input token + * @param tokenOut Output token + * @param poolId Balancer pool ID + */ + function setBalancerPoolId( + address tokenIn, + address tokenOut, + bytes32 poolId + ) external onlyRole(ROUTING_MANAGER_ROLE) { + balancerPoolIds[tokenIn][tokenOut] = poolId; + } + + /** + * @notice Set Dodoex PMM pool address for a token pair + * @param tokenIn Input token + * @param tokenOut Output token + * @param poolAddress Dodo PMM pool address + */ + function setDodoPoolAddress( + address tokenIn, + address tokenOut, + address poolAddress + ) external onlyRole(ROUTING_MANAGER_ROLE) { + dodoPoolAddresses[tokenIn][tokenOut] = poolAddress; + } + + /** + * @notice Set Uniswap V3 Quoter address for on-chain quotes + * @param _quoter Quoter contract address (address(0) to use 0.5% slippage estimate) + */ + function setUniswapQuoter(address _quoter) external onlyRole(ROUTING_MANAGER_ROLE) { + uniswapQuoter = _quoter; + } + + /** + * @notice Swap arbitrary token pair via Dodoex when pool is configured + * @param tokenIn Input token + * @param tokenOut Output token + * @param amountIn Input amount + * @param amountOutMin Minimum output (slippage protection) + * @return amountOut Output amount + */ + function swapTokenToToken( + address tokenIn, + address tokenOut, + uint256 amountIn, + uint256 amountOutMin + ) external nonReentrant returns (uint256 amountOut) { + if (amountIn == 0) revert ZeroAmount(); + if (tokenIn == address(0) || tokenOut == address(0)) revert ZeroAddress(); + address pool = dodoPoolAddresses[tokenIn][tokenOut]; + require(pool != address(0), "EnhancedSwapRouter: Dodoex pool not configured"); + + IERC20(tokenIn).safeTransferFrom(msg.sender, address(this), amountIn); + IERC20(tokenIn).approve(dodoexRouter, amountIn); + + address[] memory dodoPairs = new address[](1); + dodoPairs[0] = pool; + + IDodoexRouter.DodoSwapParams memory params = IDodoexRouter.DodoSwapParams({ + fromToken: tokenIn, + toToken: tokenOut, + fromTokenAmount: amountIn, + minReturnAmount: amountOutMin, + dodoPairs: dodoPairs, + directions: 0, + isIncentive: false, + deadLine: block.timestamp + 300 + }); + + amountOut = IDodoexRouter(dodoexRouter).dodoSwapV2TokenToToken(params); + require(amountOut >= amountOutMin, "EnhancedSwapRouter: insufficient output"); + IERC20(tokenOut).safeTransfer(msg.sender, amountOut); + return amountOut; + } + + // ============ Internal Functions ============ + + /** + * @notice Execute swap via specified provider + */ + function _executeSwap( + SwapProvider provider, + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) external returns (uint256) { + require(msg.sender == address(this), "EnhancedSwapRouter: internal only"); + + if (provider == SwapProvider.UniswapV3) { + return _executeUniswapV3Swap(stablecoinToken, amountIn, amountOutMin); + } else if (provider == SwapProvider.Dodoex) { + return _executeDodoexSwap(stablecoinToken, amountIn, amountOutMin); + } else if (provider == SwapProvider.Balancer) { + return _executeBalancerSwap(stablecoinToken, amountIn, amountOutMin); + } else if (provider == SwapProvider.Curve) { + return _executeCurveSwap(stablecoinToken, amountIn, amountOutMin); + } else if (provider == SwapProvider.OneInch && oneInchRouter != address(0)) { + return _execute1inchSwap(stablecoinToken, amountIn, amountOutMin); + } + + revert InvalidProvider(); + } + + /** + * @notice Get routing providers based on swap size + */ + function _getRoutingProviders( + uint256 amountIn, + SwapProvider preferredProvider + ) internal view returns (SwapProvider[] memory) { + // If preferred provider is specified and enabled, use it first + if (preferredProvider != SwapProvider.UniswapV3 && providerEnabled[preferredProvider]) { + SwapProvider[] memory providers = new SwapProvider[](1); + providers[0] = preferredProvider; + return providers; + } + + // Determine size category + uint256 category; + if (amountIn < SMALL_SWAP_THRESHOLD) { + category = 0; // Small + } else if (amountIn < MEDIUM_SWAP_THRESHOLD) { + category = 1; // Medium + } else { + category = 2; // Large + } + + RoutingConfig memory config = sizeBasedRouting[category]; + if (config.enabled && config.providers.length > 0) { + return config.providers; + } + + // Default fallback routing + SwapProvider[] memory defaultProviders = new SwapProvider[](5); + defaultProviders[0] = SwapProvider.Dodoex; + defaultProviders[1] = SwapProvider.UniswapV3; + defaultProviders[2] = SwapProvider.Balancer; + defaultProviders[3] = SwapProvider.Curve; + defaultProviders[4] = SwapProvider.OneInch; + return defaultProviders; + } + + /** + * @notice Execute Uniswap V3 swap + */ + function _executeUniswapV3Swap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256) { + // Approve for swap + IERC20 wethToken = IERC20(weth); + wethToken.approve(uniswapV3Router, amountIn); + + ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ + tokenIn: weth, + tokenOut: stablecoinToken, + fee: FEE_TIER_MEDIUM, + recipient: address(this), + deadline: block.timestamp + 300, + amountIn: amountIn, + amountOutMinimum: amountOutMin, + sqrtPriceLimitX96: 0 + }); + + return ISwapRouter(uniswapV3Router).exactInputSingle(params); + } + + /** + * @notice Execute Dodoex PMM swap + */ + function _executeDodoexSwap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256) { + address pool = dodoPoolAddresses[weth][stablecoinToken]; + require(pool != address(0), "EnhancedSwapRouter: Dodoex pool not configured"); + + IERC20 wethToken = IERC20(weth); + wethToken.approve(dodoexRouter, amountIn); + + address[] memory dodoPairs = new address[](1); + dodoPairs[0] = pool; + + IDodoexRouter.DodoSwapParams memory params = IDodoexRouter.DodoSwapParams({ + fromToken: weth, + toToken: stablecoinToken, + fromTokenAmount: amountIn, + minReturnAmount: amountOutMin, + dodoPairs: dodoPairs, + directions: 0, + isIncentive: false, + deadLine: block.timestamp + 300 + }); + + return IDodoexRouter(dodoexRouter).dodoSwapV2TokenToToken(params); + } + + /** + * @notice Execute Balancer swap + */ + function _executeBalancerSwap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256) { + bytes32 poolId = balancerPoolIds[weth][stablecoinToken]; + require(poolId != bytes32(0), "EnhancedSwapRouter: pool not configured"); + + IERC20 wethToken = IERC20(weth); + wethToken.approve(balancerVault, amountIn); + + IBalancerVault.SingleSwap memory singleSwap = IBalancerVault.SingleSwap({ + poolId: poolId, + kind: IBalancerVault.SwapKind.GIVEN_IN, + assetIn: weth, + assetOut: stablecoinToken, + amount: amountIn, + userData: "" + }); + + IBalancerVault.FundManagement memory funds = IBalancerVault.FundManagement({ + sender: address(this), + fromInternalBalance: false, + recipient: payable(address(this)), + toInternalBalance: false + }); + + return IBalancerVault(balancerVault).swap( + singleSwap, + funds, + amountOutMin, + block.timestamp + 300 + ); + } + + /** + * @notice Execute Curve swap + */ + function _executeCurveSwap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256) { + // Curve 3pool doesn't support WETH directly + // Would need intermediate swap or different pool + revert("EnhancedSwapRouter: Curve direct swap not supported"); + } + + /** + * @notice Execute 1inch swap + */ + function _execute1inchSwap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256) { + if (oneInchRouter == address(0)) revert ProviderDisabled(); + + IERC20 wethToken = IERC20(weth); + wethToken.approve(oneInchRouter, amountIn); + + // 1inch: requires route data from 1inch API (e.g. /swap/v5.2/138/swap). Use 1inch SDK or API to get calldata and execute separately. + revert("EnhancedSwapRouter: 1inch requires route calldata from API; use 1inch aggregator SDK"); + } + + /** + * @notice Get Uniswap V3 quote (view) + * When UNISWAP_QUOTER_ADDRESS is configured, queries quoter. Otherwise returns + * estimate via amountIn * 9950/10000 (0.5% slippage) for stablecoin pairs. + */ + function _getUniswapV3Quote( + address stablecoinToken, + uint256 amountIn + ) external view returns (uint256) { + if (uniswapQuoter != address(0) && _isValidStablecoin(stablecoinToken)) { + // IQuoter.quoteExactInputSingle(tokenIn, tokenOut, fee, amountIn, sqrtPriceLimitX96) + (bool ok, bytes memory data) = uniswapQuoter.staticcall( + abi.encodeWithSignature( + "quoteExactInputSingle(address,address,uint24,uint256,uint160)", + weth, + stablecoinToken, + FEE_TIER_MEDIUM, + amountIn, + uint160(0) + ) + ); + if (ok && data.length >= 32) { + uint256 quoted = abi.decode(data, (uint256)); + if (quoted > 0) return quoted; + } + } + if (_isValidStablecoin(stablecoinToken)) { + return (amountIn * 9950) / 10000; // 0.5% slippage estimate for WETH->stable + } + return 0; + } + + /** + * @notice Get Dodoex quote (view) + */ + function _getDodoexQuote( + address stablecoinToken, + uint256 amountIn + ) external view returns (uint256) { + return IDodoexRouter(dodoexRouter).getDodoSwapQuote(weth, stablecoinToken, amountIn); + } + + /** + * @notice Get Balancer quote (view) + * When poolId configured, would query Balancer. Otherwise estimate for stablecoins. + */ + function _getBalancerQuote( + address stablecoinToken, + uint256 amountIn + ) external view returns (uint256) { + bytes32 poolId = balancerPoolIds[weth][stablecoinToken]; + if (poolId != bytes32(0)) { + (address[] memory tokens, uint256[] memory balances,) = + IBalancerVault(balancerVault).getPoolTokens(poolId); + if (tokens.length >= 2 && balances.length >= 2) { + uint256 wethIdx = type(uint256).max; + uint256 stableIdx = type(uint256).max; + for (uint256 i = 0; i < tokens.length; i++) { + if (tokens[i] == weth) wethIdx = i; + if (tokens[i] == stablecoinToken) stableIdx = i; + } + if (wethIdx != type(uint256).max && stableIdx != type(uint256).max && balances[wethIdx] > 0) { + uint256 amountOut = (amountIn * balances[stableIdx]) / balances[wethIdx]; + return (amountOut * 9950) / 10000; // 0.5% slippage + } + } + } + if (_isValidStablecoin(stablecoinToken)) { + return (amountIn * 9950) / 10000; // 0.5% slippage estimate when pool not configured + } + return 0; + } + + /** + * @notice Initialize default routing configurations + */ + function _initializeDefaultRouting() internal { + // Small swaps (< $10k): Uniswap V3, Dodoex + SwapProvider[] memory smallProviders = new SwapProvider[](2); + smallProviders[0] = SwapProvider.UniswapV3; + smallProviders[1] = SwapProvider.Dodoex; + sizeBasedRouting[0] = RoutingConfig({ + providers: smallProviders, + sizeThresholds: new uint256[](0), + enabled: true + }); + + // Medium swaps ($10k-$100k): Dodoex, Balancer, Uniswap V3 + SwapProvider[] memory mediumProviders = new SwapProvider[](3); + mediumProviders[0] = SwapProvider.Dodoex; + mediumProviders[1] = SwapProvider.Balancer; + mediumProviders[2] = SwapProvider.UniswapV3; + sizeBasedRouting[1] = RoutingConfig({ + providers: mediumProviders, + sizeThresholds: new uint256[](0), + enabled: true + }); + + // Large swaps (> $100k): Dodoex, Curve, Balancer + SwapProvider[] memory largeProviders = new SwapProvider[](3); + largeProviders[0] = SwapProvider.Dodoex; + largeProviders[1] = SwapProvider.Curve; + largeProviders[2] = SwapProvider.Balancer; + sizeBasedRouting[2] = RoutingConfig({ + providers: largeProviders, + sizeThresholds: new uint256[](0), + enabled: true + }); + } + + /** + * @notice Check if token is valid stablecoin + */ + function _isValidStablecoin(address token) internal view returns (bool) { + return token == usdt || token == usdc || token == dai; + } + + // Allow contract to receive ETH + receive() external payable {} +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/InboxETH.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/InboxETH.sol new file mode 100644 index 0000000..6772621 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/InboxETH.sol @@ -0,0 +1,426 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./BondManager.sol"; +import "./ChallengeManager.sol"; +import "./LiquidityPoolETH.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title InboxETH + * @notice Receives and processes claims from relayers for trustless bridge deposits + * @dev Permissionless claim submission requiring bonds and challenge mechanism + */ +contract InboxETH is ReentrancyGuard { + BondManager public immutable bondManager; + ChallengeManager public immutable challengeManager; + LiquidityPoolETH public immutable liquidityPool; + + // Rate limiting + uint256 public constant MIN_DEPOSIT = 0.001 ether; // Minimum deposit to prevent dust + uint256 public constant COOLDOWN_PERIOD = 60 seconds; // Cooldown between claims per relayer + mapping(address => uint256) public lastClaimTime; // relayer => last claim timestamp + mapping(address => uint256) public claimsPerHour; // relayer => claims in current hour + mapping(address => uint256) public hourStart; // relayer => current hour start timestamp + uint256 public constant MAX_CLAIMS_PER_HOUR = 100; // Max claims per hour per relayer + + // Relayer fees (optional, can be enabled via governance) + uint256 public relayerFeeBps = 0; // Basis points (0 = disabled, 100 = 1%) + mapping(uint256 => RelayerFee) public relayerFees; // depositId => RelayerFee + + struct RelayerFee { + address relayer; + uint256 amount; + bool claimed; + } + + struct ClaimData { + uint256 depositId; + address asset; + uint256 amount; + address recipient; + address relayer; + uint256 timestamp; + bool exists; + } + + mapping(uint256 => ClaimData) public claims; // depositId => ClaimData + + event RelayerFeeSet(uint256 newFeeBps); + event RelayerFeeClaimed(uint256 indexed depositId, address indexed relayer, uint256 amount); + + event ClaimSubmitted( + uint256 indexed depositId, + address indexed relayer, + address asset, + uint256 amount, + address indexed recipient, + uint256 bondAmount, + uint256 challengeWindowEnd + ); + + error ZeroDepositId(); + error ZeroAsset(); + error ZeroAmount(); + error ZeroRecipient(); + error ClaimAlreadyExists(); + error InsufficientBond(); + error DepositTooSmall(); + error CooldownActive(); + error RateLimitExceeded(); + error RelayerFeeNotEnabled(); + + /** + * @notice Constructor + * @param _bondManager Address of BondManager contract + * @param _challengeManager Address of ChallengeManager contract + * @param _liquidityPool Address of LiquidityPoolETH contract + */ + constructor( + address _bondManager, + address _challengeManager, + address _liquidityPool + ) { + require(_bondManager != address(0), "InboxETH: zero bond manager"); + require(_challengeManager != address(0), "InboxETH: zero challenge manager"); + require(_liquidityPool != address(0), "InboxETH: zero liquidity pool"); + + bondManager = BondManager(payable(_bondManager)); + challengeManager = ChallengeManager(payable(_challengeManager)); + liquidityPool = LiquidityPoolETH(payable(_liquidityPool)); + } + + /** + * @notice Submit a claim for a deposit from source chain + * @param depositId Deposit ID from source chain (ChainID 138) + * @param asset Asset address (address(0) for native ETH) + * @param amount Deposit amount + * @param recipient Recipient address on Ethereum + * @param proof Optional proof data (not used in optimistic model, but reserved for future light client) + * @return bondAmount Amount of bond posted + */ + function submitClaim( + uint256 depositId, + address asset, + uint256 amount, + address recipient, + bytes calldata proof + ) external payable nonReentrant returns (uint256 bondAmount) { + if (depositId == 0) revert ZeroDepositId(); + if (asset == address(0) && amount == 0) revert ZeroAmount(); + if (recipient == address(0)) revert ZeroRecipient(); + + // Rate limiting checks + if (amount < MIN_DEPOSIT) revert DepositTooSmall(); + + // Cooldown check + if (block.timestamp < lastClaimTime[msg.sender] + COOLDOWN_PERIOD) { + revert CooldownActive(); + } + + // Hourly rate limit check + uint256 currentHour = block.timestamp / 3600; + if (hourStart[msg.sender] != currentHour) { + hourStart[msg.sender] = currentHour; + claimsPerHour[msg.sender] = 0; + } + if (claimsPerHour[msg.sender] >= MAX_CLAIMS_PER_HOUR) { + revert RateLimitExceeded(); + } + + // Check if claim already exists + if (claims[depositId].exists) revert ClaimAlreadyExists(); + + // Calculate required bond + uint256 requiredBond = bondManager.getRequiredBond(amount); + + // Calculate relayer fee if enabled + uint256 relayerFee = 0; + uint256 bridgeAmount = amount; + if (relayerFeeBps > 0) { + relayerFee = (amount * relayerFeeBps) / 10000; + bridgeAmount = amount - relayerFee; + + // Store relayer fee + relayerFees[depositId] = RelayerFee({ + relayer: msg.sender, + amount: relayerFee, + claimed: false + }); + } + + if (msg.value < requiredBond) revert InsufficientBond(); + + // Post bond (pass relayer address explicitly) + bondAmount = bondManager.postBond{value: requiredBond}(depositId, bridgeAmount, msg.sender); + + // Update rate limiting + lastClaimTime[msg.sender] = block.timestamp; + claimsPerHour[msg.sender]++; + + // Register claim with ChallengeManager (use bridgeAmount after fee) + challengeManager.registerClaim(depositId, asset, bridgeAmount, recipient); + + // Determine asset type for liquidity pool + LiquidityPoolETH.AssetType assetType = asset == address(0) + ? LiquidityPoolETH.AssetType.ETH + : LiquidityPoolETH.AssetType.WETH; + + // Add pending claim to liquidity pool (use bridgeAmount after fee deduction) + liquidityPool.addPendingClaim(bridgeAmount, assetType); + + // Store claim data (use bridgeAmount for amount) + claims[depositId] = ClaimData({ + depositId: depositId, + asset: asset, + amount: bridgeAmount, // Store bridge amount (after fee) + recipient: recipient, + relayer: msg.sender, + timestamp: block.timestamp, + exists: true + }); + + // Get challenge window end time + (uint256 challengeWindowEnd, ) = _getChallengeWindowEnd(depositId); + + emit ClaimSubmitted( + depositId, + msg.sender, + asset, + bridgeAmount, // Emit bridge amount (after fee) + recipient, + bondAmount, + challengeWindowEnd + ); + + return bondAmount; + } + + /** + * @notice Submit multiple claims in batch (gas optimization) + * @param depositIds Array of deposit IDs + * @param assets Array of asset addresses + * @param amounts Array of deposit amounts + * @param recipients Array of recipient addresses + * @param proofs Array of proof data + * @return totalBondAmount Total bond amount posted + */ + function submitClaimsBatch( + uint256[] calldata depositIds, + address[] calldata assets, + uint256[] calldata amounts, + address[] calldata recipients, + bytes[] calldata proofs + ) external payable nonReentrant returns (uint256 totalBondAmount) { + uint256 length = depositIds.length; + require(length > 0, "InboxETH: empty array"); + require(length <= 20, "InboxETH: batch too large"); // Prevent gas limit issues + require(length == assets.length && length == amounts.length && + length == recipients.length && length == proofs.length, + "InboxETH: length mismatch"); + + // Calculate total required bond + uint256 totalRequiredBond = 0; + for (uint256 i = 0; i < length; i++) { + if (depositIds[i] == 0) revert ZeroDepositId(); + if (assets[i] == address(0) && amounts[i] == 0) revert ZeroAmount(); + if (recipients[i] == address(0)) revert ZeroRecipient(); + if (claims[depositIds[i]].exists) revert ClaimAlreadyExists(); + + totalRequiredBond += bondManager.getRequiredBond(amounts[i]); + } + + if (msg.value < totalRequiredBond) revert InsufficientBond(); + + // Process each claim + for (uint256 i = 0; i < length; i++) { + // Rate limiting checks (simplified for batch - check first item) + if (i == 0) { + if (amounts[i] < MIN_DEPOSIT) revert DepositTooSmall(); + if (block.timestamp < lastClaimTime[msg.sender] + COOLDOWN_PERIOD) { + revert CooldownActive(); + } + uint256 currentHour = block.timestamp / 3600; + if (hourStart[msg.sender] != currentHour) { + hourStart[msg.sender] = currentHour; + claimsPerHour[msg.sender] = 0; + } + } + if (claimsPerHour[msg.sender] + i >= MAX_CLAIMS_PER_HOUR) { + revert RateLimitExceeded(); + } + + // Calculate relayer fee if enabled + uint256 relayerFee = 0; + uint256 bridgeAmount = amounts[i]; + if (relayerFeeBps > 0) { + relayerFee = (amounts[i] * relayerFeeBps) / 10000; + bridgeAmount = amounts[i] - relayerFee; + relayerFees[depositIds[i]] = RelayerFee({ + relayer: msg.sender, + amount: relayerFee, + claimed: false + }); + } + + uint256 requiredBond = bondManager.getRequiredBond(bridgeAmount); + + // Post bond + uint256 bondAmount = bondManager.postBond{value: requiredBond}( + depositIds[i], + bridgeAmount, + msg.sender + ); + totalBondAmount += bondAmount; + + // Register claim (use bridgeAmount) + challengeManager.registerClaim(depositIds[i], assets[i], bridgeAmount, recipients[i]); + + // Determine asset type + LiquidityPoolETH.AssetType assetType = assets[i] == address(0) + ? LiquidityPoolETH.AssetType.ETH + : LiquidityPoolETH.AssetType.WETH; + + // Add pending claim (use bridgeAmount) + liquidityPool.addPendingClaim(bridgeAmount, assetType); + + // Store claim data (use bridgeAmount) + claims[depositIds[i]] = ClaimData({ + depositId: depositIds[i], + asset: assets[i], + amount: bridgeAmount, + recipient: recipients[i], + relayer: msg.sender, + timestamp: block.timestamp, + exists: true + }); + + // Get challenge window end time + (uint256 challengeWindowEnd, ) = _getChallengeWindowEnd(depositIds[i]); + + emit ClaimSubmitted( + depositIds[i], + msg.sender, + assets[i], + bridgeAmount, + recipients[i], + bondAmount, + challengeWindowEnd + ); + } + + // Update rate limiting + lastClaimTime[msg.sender] = block.timestamp; + claimsPerHour[msg.sender] += length; + + // Refund excess bond if any + if (msg.value > totalBondAmount) { + (bool success, ) = payable(msg.sender).call{value: msg.value - totalBondAmount}(""); + require(success, "InboxETH: refund failed"); + } + + return totalBondAmount; + } + + /** + * @notice Get claim status + * @param depositId Deposit ID + * @return exists True if claim exists + * @return finalized True if claim is finalized + * @return challenged True if claim was challenged + * @return challengeWindowEnd Timestamp when challenge window ends + */ + function getClaimStatus( + uint256 depositId + ) external view returns ( + bool exists, + bool finalized, + bool challenged, + uint256 challengeWindowEnd + ) { + if (!claims[depositId].exists) { + return (false, false, false, 0); + } + + ChallengeManager.Claim memory claim = challengeManager.getClaim(depositId); + (challengeWindowEnd, ) = _getChallengeWindowEnd(depositId); + + return ( + true, + claim.finalized, + claim.challenged, + challengeWindowEnd + ); + } + + /** + * @notice Get claim data + * @param depositId Deposit ID + * @return Claim data + */ + function getClaim(uint256 depositId) external view returns (ClaimData memory) { + return claims[depositId]; + } + + /** + * @notice Internal function to get challenge window end time + * @param depositId Deposit ID + * @return challengeWindowEnd Timestamp + * @return exists True if claim exists + */ + function _getChallengeWindowEnd( + uint256 depositId + ) internal view returns (uint256 challengeWindowEnd, bool exists) { + ChallengeManager.Claim memory claim = challengeManager.getClaim(depositId); + if (claim.depositId == 0) { + return (0, false); + } + return (claim.challengeWindowEnd, true); + } + + /** + * @notice Set relayer fee (only callable by owner/multisig in future upgrade) + * @param _relayerFeeBps New relayer fee in basis points (0 = disabled) + */ + function setRelayerFee(uint256 _relayerFeeBps) external { + // Note: In production, add access control (owner/multisig) + // For now, this is a placeholder for future governance + require(_relayerFeeBps <= 1000, "InboxETH: fee too high"); // Max 10% + relayerFeeBps = _relayerFeeBps; + emit RelayerFeeSet(_relayerFeeBps); + } + + /** + * @notice Claim relayer fee for a finalized deposit + * @param depositId Deposit ID to claim fee for + */ + function claimRelayerFee(uint256 depositId) external nonReentrant { + if (relayerFeeBps == 0) revert RelayerFeeNotEnabled(); + + RelayerFee storage fee = relayerFees[depositId]; + if (fee.relayer == address(0)) revert("InboxETH: no fee for deposit"); + if (fee.claimed) revert("InboxETH: fee already claimed"); + if (fee.relayer != msg.sender) revert("InboxETH: not fee recipient"); + + // Verify claim is finalized + ChallengeManager.Claim memory claim = challengeManager.getClaim(depositId); + if (!claim.finalized) revert("InboxETH: claim not finalized"); + + fee.claimed = true; + + // Transfer fee to relayer + (bool success, ) = payable(msg.sender).call{value: fee.amount}(""); + require(success, "InboxETH: fee transfer failed"); + + emit RelayerFeeClaimed(depositId, msg.sender, fee.amount); + } + + /** + * @notice Get relayer fee for a deposit + * @param depositId Deposit ID + * @return fee Relayer fee information + */ + function getRelayerFee(uint256 depositId) external view returns (RelayerFee memory) { + return relayerFees[depositId]; + } +} \ No newline at end of file diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/LiquidityPoolETH.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/LiquidityPoolETH.sol new file mode 100644 index 0000000..ae361b4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/LiquidityPoolETH.sol @@ -0,0 +1,296 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title LiquidityPoolETH + * @notice Liquidity pool for ETH and WETH with fee model and minimum liquidity ratio enforcement + * @dev Supports separate pools for native ETH and WETH (ERC-20) + */ +contract LiquidityPoolETH is ReentrancyGuard { + using SafeERC20 for IERC20; + + enum AssetType { + ETH, // Native ETH + WETH // Wrapped ETH (ERC-20) + } + + // Pool configuration + uint256 public immutable lpFeeBps; // Liquidity provider fee in basis points (default: 5 = 0.05%) + uint256 public immutable minLiquidityRatioBps; // Minimum liquidity ratio in basis points (default: 11000 = 110%) + address public immutable weth; // WETH token address + + // WETH getter for external access + function getWeth() external view returns (address) { + return weth; + } + + // Pool state + struct PoolState { + uint256 totalLiquidity; + uint256 pendingClaims; // Total amount of pending claims to be released + mapping(address => uint256) lpShares; // LP address => amount provided + } + + mapping(AssetType => PoolState) public pools; + mapping(address => bool) public authorizedRelease; // Contracts authorized to release funds + + event LiquidityProvided( + AssetType indexed assetType, + address indexed provider, + uint256 amount + ); + + event LiquidityWithdrawn( + AssetType indexed assetType, + address indexed provider, + uint256 amount + ); + + event FundsReleased( + AssetType indexed assetType, + uint256 indexed depositId, + address indexed recipient, + uint256 amount, + uint256 feeAmount + ); + + event PendingClaimAdded( + AssetType indexed assetType, + uint256 amount + ); + + event PendingClaimRemoved( + AssetType indexed assetType, + uint256 amount + ); + + error ZeroAmount(); + error ZeroAddress(); + error InsufficientLiquidity(); + error WithdrawalBlockedByLiquidityRatio(); + error UnauthorizedRelease(); + error InvalidAssetType(); + + /** + * @notice Constructor + * @param _weth WETH token address + * @param _lpFeeBps LP fee in basis points (5 = 0.05%) + * @param _minLiquidityRatioBps Minimum liquidity ratio in basis points (11000 = 110%) + */ + constructor( + address _weth, + uint256 _lpFeeBps, + uint256 _minLiquidityRatioBps + ) { + require(_weth != address(0), "LiquidityPoolETH: zero WETH address"); + require(_lpFeeBps <= 10000, "LiquidityPoolETH: fee exceeds 100%"); + require(_minLiquidityRatioBps >= 10000, "LiquidityPoolETH: min ratio must be >= 100%"); + + weth = _weth; + lpFeeBps = _lpFeeBps; + minLiquidityRatioBps = _minLiquidityRatioBps; + } + + /** + * @notice Authorize a contract to release funds (called during deployment) + * @param releaser Address authorized to release funds + */ + function authorizeRelease(address releaser) external { + require(releaser != address(0), "LiquidityPoolETH: zero address"); + authorizedRelease[releaser] = true; + } + + /** + * @notice Provide liquidity to the pool + * @param assetType Type of asset (ETH or WETH) + */ + function provideLiquidity(AssetType assetType) external payable nonReentrant { + uint256 amount; + + if (assetType == AssetType.ETH) { + if (msg.value == 0) revert ZeroAmount(); + amount = msg.value; + } else if (assetType == AssetType.WETH) { + if (msg.value != 0) revert("LiquidityPoolETH: WETH deposits must use depositWETH()"); + revert("LiquidityPoolETH: use depositWETH() for WETH deposits"); + } else { + revert InvalidAssetType(); + } + + pools[assetType].totalLiquidity += amount; + pools[assetType].lpShares[msg.sender] += amount; + + emit LiquidityProvided(assetType, msg.sender, amount); + } + + /** + * @notice Provide WETH liquidity to the pool + * @param amount Amount of WETH to deposit + */ + function depositWETH(uint256 amount) external nonReentrant { + if (amount == 0) revert ZeroAmount(); + + IERC20(weth).safeTransferFrom(msg.sender, address(this), amount); + + pools[AssetType.WETH].totalLiquidity += amount; + pools[AssetType.WETH].lpShares[msg.sender] += amount; + + emit LiquidityProvided(AssetType.WETH, msg.sender, amount); + } + + /** + * @notice Withdraw liquidity from the pool + * @param amount Amount to withdraw + * @param assetType Type of asset (ETH or WETH) + */ + function withdrawLiquidity( + uint256 amount, + AssetType assetType + ) external nonReentrant { + if (amount == 0) revert ZeroAmount(); + if (pools[assetType].lpShares[msg.sender] < amount) revert InsufficientLiquidity(); + + // Check minimum liquidity ratio + uint256 availableLiquidity = pools[assetType].totalLiquidity - pools[assetType].pendingClaims; + uint256 newAvailableLiquidity = availableLiquidity - amount; + uint256 minRequired = (pools[assetType].pendingClaims * minLiquidityRatioBps) / 10000; + + if (newAvailableLiquidity < minRequired) { + revert WithdrawalBlockedByLiquidityRatio(); + } + + pools[assetType].totalLiquidity -= amount; + pools[assetType].lpShares[msg.sender] -= amount; + + if (assetType == AssetType.ETH) { + (bool success, ) = payable(msg.sender).call{value: amount}(""); + require(success, "LiquidityPoolETH: ETH transfer failed"); + } else { + IERC20(weth).safeTransfer(msg.sender, amount); + } + + emit LiquidityWithdrawn(assetType, msg.sender, amount); + } + + /** + * @notice Release funds to recipient (only authorized contracts) + * @param depositId Deposit ID (for event tracking) + * @param recipient Recipient address + * @param amount Amount to release (before fees) + * @param assetType Type of asset (ETH or WETH) + */ + function releaseToRecipient( + uint256 depositId, + address recipient, + uint256 amount, + AssetType assetType + ) external nonReentrant { + if (!authorizedRelease[msg.sender]) revert UnauthorizedRelease(); + if (amount == 0) revert ZeroAmount(); + if (recipient == address(0)) revert ZeroAddress(); + + // Calculate fee + uint256 feeAmount = (amount * lpFeeBps) / 10000; + uint256 releaseAmount = amount - feeAmount; + + // Check available liquidity + PoolState storage pool = pools[assetType]; + uint256 availableLiquidity = pool.totalLiquidity - pool.pendingClaims; + + if (availableLiquidity < releaseAmount) { + revert InsufficientLiquidity(); + } + + // Reduce pending claims + pool.pendingClaims -= amount; + + // Release funds to recipient + if (assetType == AssetType.ETH) { + (bool success, ) = payable(recipient).call{value: releaseAmount}(""); + require(success, "LiquidityPoolETH: ETH transfer failed"); + } else { + IERC20(weth).safeTransfer(recipient, releaseAmount); + } + + // Fee remains in pool (increases totalLiquidity effectively by reducing pendingClaims) + + emit FundsReleased(assetType, depositId, recipient, releaseAmount, feeAmount); + } + + /** + * @notice Add pending claim (called when claim is submitted) + * @param amount Amount of pending claim + * @param assetType Type of asset + */ + function addPendingClaim(uint256 amount, AssetType assetType) external { + if (!authorizedRelease[msg.sender]) revert UnauthorizedRelease(); + pools[assetType].pendingClaims += amount; + emit PendingClaimAdded(assetType, amount); + } + + /** + * @notice Remove pending claim (called when claim is challenged/slashed) + * @param amount Amount of pending claim to remove + * @param assetType Type of asset + */ + function removePendingClaim(uint256 amount, AssetType assetType) external { + if (!authorizedRelease[msg.sender]) revert UnauthorizedRelease(); + pools[assetType].pendingClaims -= amount; + emit PendingClaimRemoved(assetType, amount); + } + + /** + * @notice Get available liquidity for an asset type + * @param assetType Type of asset + * @return Available liquidity (total - pending claims) + */ + function getAvailableLiquidity(AssetType assetType) external view returns (uint256) { + PoolState storage pool = pools[assetType]; + uint256 pending = pool.pendingClaims; + if (pool.totalLiquidity <= pending) { + return 0; + } + return pool.totalLiquidity - pending; + } + + /** + * @notice Get LP share for a provider + * @param provider LP provider address + * @param assetType Type of asset + * @return LP share amount + */ + function getLpShare(address provider, AssetType assetType) external view returns (uint256) { + return pools[assetType].lpShares[provider]; + } + + /** + * @notice Get pool statistics + * @param assetType Type of asset + * @return totalLiquidity Total liquidity in pool + * @return pendingClaims Total pending claims + * @return availableLiquidity Available liquidity (total - pending) + */ + function getPoolStats( + AssetType assetType + ) external view returns ( + uint256 totalLiquidity, + uint256 pendingClaims, + uint256 availableLiquidity + ) { + PoolState storage pool = pools[assetType]; + totalLiquidity = pool.totalLiquidity; + pendingClaims = pool.pendingClaims; + if (totalLiquidity > pendingClaims) { + availableLiquidity = totalLiquidity - pendingClaims; + } else { + availableLiquidity = 0; + } + } + + // Allow contract to receive ETH + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/Lockbox138.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/Lockbox138.sol new file mode 100644 index 0000000..40da5de --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/Lockbox138.sol @@ -0,0 +1,170 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title Lockbox138 + * @notice Asset lock contract on ChainID 138 (Besu) for trustless bridge deposits + * @dev Supports both native ETH and ERC-20 tokens. Immutable after deployment (no admin functions). + */ +contract Lockbox138 is ReentrancyGuard { + using SafeERC20 for IERC20; + + // Replay protection: track nonces per user + mapping(address => uint256) public nonces; + + // Track processed deposit IDs to prevent double deposits + mapping(uint256 => bool) public processedDeposits; + + event Deposit( + uint256 indexed depositId, + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 nonce, + address depositor, + uint256 timestamp + ); + + error ZeroAmount(); + error ZeroRecipient(); + error ZeroAsset(); + error DepositAlreadyProcessed(); + error TransferFailed(); + + /** + * @notice Lock native ETH for cross-chain transfer + * @param recipient Address on destination chain (Ethereum) to receive funds + * @param nonce Unique nonce for this deposit (prevents replay attacks) + * @return depositId Unique identifier for this deposit + */ + function depositNative( + address recipient, + bytes32 nonce + ) external payable nonReentrant returns (uint256 depositId) { + if (msg.value == 0) revert ZeroAmount(); + if (recipient == address(0)) revert ZeroRecipient(); + + // Increment user nonce + nonces[msg.sender]++; + + // Generate unique deposit ID + depositId = _generateDepositId( + address(0), // Native ETH is represented as address(0) + msg.value, + recipient, + nonce + ); + + // Replay protection: ensure deposit ID hasn't been used + if (processedDeposits[depositId]) revert DepositAlreadyProcessed(); + processedDeposits[depositId] = true; + + emit Deposit( + depositId, + address(0), // address(0) represents native ETH + msg.value, + recipient, + nonce, + msg.sender, + block.timestamp + ); + + return depositId; + } + + /** + * @notice Lock ERC-20 tokens (e.g., WETH) for cross-chain transfer + * @param token ERC-20 token address to lock + * @param amount Amount of tokens to lock + * @param recipient Address on destination chain (Ethereum) to receive funds + * @param nonce Unique nonce for this deposit (prevents replay attacks) + * @return depositId Unique identifier for this deposit + */ + function depositERC20( + address token, + uint256 amount, + address recipient, + bytes32 nonce + ) external nonReentrant returns (uint256 depositId) { + if (token == address(0)) revert ZeroAsset(); + if (amount == 0) revert ZeroAmount(); + if (recipient == address(0)) revert ZeroRecipient(); + + // Increment user nonce + nonces[msg.sender]++; + + // Generate unique deposit ID + depositId = _generateDepositId(token, amount, recipient, nonce); + + // Replay protection: ensure deposit ID hasn't been used + if (processedDeposits[depositId]) revert DepositAlreadyProcessed(); + processedDeposits[depositId] = true; + + // Transfer tokens from user to this contract + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + + emit Deposit( + depositId, + token, + amount, + recipient, + nonce, + msg.sender, + block.timestamp + ); + + return depositId; + } + + /** + * @notice Get current nonce for a user + * @param user Address to check nonce for + * @return Current nonce value + */ + function getNonce(address user) external view returns (uint256) { + return nonces[user]; + } + + /** + * @notice Check if a deposit ID has been processed + * @param depositId Deposit ID to check + * @return True if deposit has been processed + */ + function isDepositProcessed(uint256 depositId) external view returns (bool) { + return processedDeposits[depositId]; + } + + /** + * @notice Generate a unique deposit ID from deposit parameters + * @dev Uses keccak256 hash of all deposit parameters + sender + timestamp to ensure uniqueness + * @param asset Asset address (address(0) for native ETH) + * @param amount Deposit amount + * @param recipient Recipient address on destination chain + * @param nonce User-provided nonce + * @return depositId Unique deposit identifier + */ + function _generateDepositId( + address asset, + uint256 amount, + address recipient, + bytes32 nonce + ) internal view returns (uint256) { + return uint256( + keccak256( + abi.encodePacked( + asset, + amount, + recipient, + nonce, + msg.sender, + block.timestamp, + block.number + ) + ) + ); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/SwapBridgeSwapCoordinator.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/SwapBridgeSwapCoordinator.sol new file mode 100644 index 0000000..30238a0 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/SwapBridgeSwapCoordinator.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../UniversalCCIPBridge.sol"; +import "./EnhancedSwapRouter.sol"; + +/** + * @title SwapBridgeSwapCoordinator + * @notice Coordinates source-chain swap (token A -> bridgeable token) then CCIP bridge in one flow + * @dev User approves coordinator for sourceToken; coordinator swaps via EnhancedSwapRouter (Dodoex) then calls UniversalCCIPBridge + */ +contract SwapBridgeSwapCoordinator is ReentrancyGuard { + using SafeERC20 for IERC20; + + EnhancedSwapRouter public immutable swapRouter; + UniversalCCIPBridge public immutable bridge; + + event SwapAndBridgeExecuted( + address indexed sourceToken, + address indexed bridgeableToken, + uint256 amountIn, + uint256 amountBridged, + uint64 destinationChain, + address indexed recipient, + bytes32 messageId + ); + + error ZeroAddress(); + error ZeroAmount(); + error InsufficientOutput(); + error SameToken(); + + constructor(address _swapRouter, address _bridge) { + if (_swapRouter == address(0) || _bridge == address(0)) revert ZeroAddress(); + swapRouter = EnhancedSwapRouter(payable(_swapRouter)); + bridge = UniversalCCIPBridge(payable(_bridge)); + } + + /** + * @notice Swap source token to bridgeable token then bridge to destination chain + * @param sourceToken Token user is sending (will be swapped if different from bridgeableToken) + * @param amountIn Amount of source token + * @param amountOutMin Minimum bridgeable token from swap (slippage protection; ignored if sourceToken == bridgeableToken) + * @param bridgeableToken Token to bridge (WETH or stablecoin); must be registered on bridge + * @param destinationChainSelector CCIP destination chain selector + * @param recipient Recipient on destination chain + * @param assetType Asset type hash for bridge (from UniversalAssetRegistry) + * @param usePMM Whether bridge should use PMM liquidity + * @param useVault Whether bridge should use vault + */ + function swapAndBridge( + address sourceToken, + uint256 amountIn, + uint256 amountOutMin, + address bridgeableToken, + uint64 destinationChainSelector, + address recipient, + bytes32 assetType, + bool usePMM, + bool useVault + ) external payable nonReentrant returns (bytes32 messageId) { + if (amountIn == 0) revert ZeroAmount(); + if (sourceToken == address(0) || bridgeableToken == address(0) || recipient == address(0)) revert ZeroAddress(); + + uint256 amountToBridge; + + if (sourceToken == bridgeableToken) { + IERC20(sourceToken).safeTransferFrom(msg.sender, address(this), amountIn); + amountToBridge = amountIn; + } else { + IERC20(sourceToken).safeTransferFrom(msg.sender, address(this), amountIn); + IERC20(sourceToken).approve(address(swapRouter), amountIn); + amountToBridge = swapRouter.swapTokenToToken(sourceToken, bridgeableToken, amountIn, amountOutMin); + if (amountToBridge < amountOutMin) revert InsufficientOutput(); + } + + UniversalCCIPBridge.BridgeOperation memory op = UniversalCCIPBridge.BridgeOperation({ + token: bridgeableToken, + amount: amountToBridge, + destinationChain: destinationChainSelector, + recipient: recipient, + assetType: assetType, + usePMM: usePMM, + useVault: useVault, + complianceProof: "", + vaultInstructions: "" + }); + + IERC20(bridgeableToken).approve(address(bridge), amountToBridge); + (bool ok, bytes memory result) = address(bridge).call{value: msg.value}( + abi.encodeWithSelector(bridge.bridge.selector, op) + ); + require(ok, "SwapBridgeSwapCoordinator: bridge failed"); + messageId = abi.decode(result, (bytes32)); + + emit SwapAndBridgeExecuted( + sourceToken, + bridgeableToken, + amountIn, + amountToBridge, + destinationChainSelector, + recipient, + messageId + ); + return messageId; + } + + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/SwapRouter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/SwapRouter.sol new file mode 100644 index 0000000..d1f91ca --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/SwapRouter.sol @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./LiquidityPoolETH.sol"; +import "./interfaces/ISwapRouter.sol"; +import "./interfaces/IWETH.sol"; +import "./interfaces/ICurvePool.sol"; +import "./interfaces/IAggregationRouter.sol"; + +/** + * @title SwapRouter + * @notice Swaps ETH/WETH to stablecoins via Uniswap V3, Curve, or 1inch + * @dev Primary: Uniswap V3, Secondary: Curve, Optional: 1inch aggregation + */ +contract SwapRouter is ReentrancyGuard { + using SafeERC20 for IERC20; + + enum SwapProvider { + UniswapV3, + Curve, + OneInch + } + + // Contract addresses (Ethereum Mainnet) + address public immutable uniswapV3Router; // 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 + address public immutable curve3Pool; // 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7 + address public immutable oneInchRouter; // 0x1111111254EEB25477B68fb85Ed929f73A960582 (optional) + + // Token addresses (Ethereum Mainnet) + address public immutable weth; // 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + address public immutable usdt; // 0xdAC17F958D2ee523a2206206994597C13D831ec7 + address public immutable usdc; // 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + address public immutable dai; // 0x6B175474E89094C44Da98b954EedeAC495271d0F + + // Uniswap V3 fee tiers (0.05% = 500, 0.3% = 3000, 1% = 10000) + uint24 public constant FEE_TIER_LOW = 500; // 0.05% + uint24 public constant FEE_TIER_MEDIUM = 3000; // 0.3% + uint24 public constant FEE_TIER_HIGH = 10000; // 1% + + event SwapExecuted( + SwapProvider provider, + LiquidityPoolETH.AssetType inputAsset, + address inputToken, + address outputToken, + uint256 amountIn, + uint256 amountOut + ); + + error ZeroAmount(); + error ZeroAddress(); + error InsufficientOutput(); + error InvalidAssetType(); + error SwapFailed(); + + /** + * @notice Constructor + * @param _uniswapV3Router Uniswap V3 SwapRouter address + * @param _curve3Pool Curve 3pool address + * @param _oneInchRouter 1inch Router address (can be address(0) if not used) + * @param _weth WETH address + * @param _usdt USDT address + * @param _usdc USDC address + * @param _dai DAI address + */ + constructor( + address _uniswapV3Router, + address _curve3Pool, + address _oneInchRouter, + address _weth, + address _usdt, + address _usdc, + address _dai + ) { + require(_uniswapV3Router != address(0), "SwapRouter: zero Uniswap router"); + require(_curve3Pool != address(0), "SwapRouter: zero Curve pool"); + require(_weth != address(0), "SwapRouter: zero WETH"); + require(_usdt != address(0), "SwapRouter: zero USDT"); + require(_usdc != address(0), "SwapRouter: zero USDC"); + require(_dai != address(0), "SwapRouter: zero DAI"); + + uniswapV3Router = _uniswapV3Router; + curve3Pool = _curve3Pool; + oneInchRouter = _oneInchRouter; + weth = _weth; + usdt = _usdt; + usdc = _usdc; + dai = _dai; + } + + /** + * @notice Swap to stablecoin using best available route + * @param inputAsset Input asset type (ETH or WETH) + * @param stablecoinToken Target stablecoin address (USDT, USDC, or DAI) + * @param amountIn Input amount + * @param amountOutMin Minimum output amount (slippage protection) + * @param routeData Optional route data for specific provider + * @return amountOut Output amount + */ + function swapToStablecoin( + LiquidityPoolETH.AssetType inputAsset, + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin, + bytes calldata routeData + ) external payable nonReentrant returns (uint256 amountOut) { + if (amountIn == 0) revert ZeroAmount(); + if (stablecoinToken == address(0)) revert ZeroAddress(); + if (!_isValidStablecoin(stablecoinToken)) revert("SwapRouter: invalid stablecoin"); + + // Convert ETH to WETH if needed + if (inputAsset == LiquidityPoolETH.AssetType.ETH) { + IWETH(weth).deposit{value: amountIn}(); + inputAsset = LiquidityPoolETH.AssetType.WETH; + } + + // Approve WETH for swap + IERC20 wethToken = IERC20(weth); + // Use forceApprove for OpenZeppelin 5.x (or approve directly) + wethToken.approve(uniswapV3Router, amountIn); + if (oneInchRouter != address(0)) { + wethToken.approve(oneInchRouter, amountIn); + } + + // Try Uniswap V3 first (primary) + uint256 outputAmount = _executeUniswapV3Swap(stablecoinToken, amountIn, amountOutMin); + if (outputAmount >= amountOutMin) { + // Transfer output to caller + IERC20(stablecoinToken).safeTransfer(msg.sender, outputAmount); + emit SwapExecuted(SwapProvider.UniswapV3, inputAsset, weth, stablecoinToken, amountIn, outputAmount); + return outputAmount; + } + + // Try Curve for stable/stable swaps (if USDT/USDC/DAI and routeData provided) + // Note: Curve 3pool doesn't support WETH directly, would need intermediate swap + // For now, revert if Uniswap fails + revert SwapFailed(); + } + + /** + * @notice Execute Uniswap V3 swap (internal) + * @param stablecoinToken Target stablecoin + * @param amountIn Input amount + * @param amountOutMin Minimum output + * @return amountOut Output amount + */ + function _executeUniswapV3Swap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256 amountOut) { + ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ + tokenIn: weth, + tokenOut: stablecoinToken, + fee: FEE_TIER_MEDIUM, // 0.3% fee tier + recipient: address(this), + deadline: block.timestamp + 300, // 5 minutes + amountIn: amountIn, + amountOutMinimum: amountOutMin, + sqrtPriceLimitX96: 0 // No price limit + }); + + amountOut = ISwapRouter(uniswapV3Router).exactInputSingle(params); + return amountOut; + } + + /** + * @notice Check if token is a valid stablecoin + * @param token Token address to check + * @return True if valid stablecoin + */ + function _isValidStablecoin(address token) internal view returns (bool) { + return token == usdt || token == usdc || token == dai; + } + + // Allow contract to receive ETH + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/BridgeReserveCoordinator.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/BridgeReserveCoordinator.sol new file mode 100644 index 0000000..a4f1492 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/BridgeReserveCoordinator.sol @@ -0,0 +1,304 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "../BridgeSwapCoordinator.sol"; +import "../LiquidityPoolETH.sol"; +import "../../../reserve/IReserveSystem.sol"; +import "./IStablecoinPegManager.sol"; +import "./ICommodityPegManager.sol"; +import "./IISOCurrencyManager.sol"; + +/** + * @title BridgeReserveCoordinator + * @notice Orchestrates bridge operations with ReserveSystem, ensuring peg maintenance and asset backing + * @dev Connects trustless bridge to ReserveSystem for reserve verification and peg maintenance + */ +contract BridgeReserveCoordinator is Ownable, ReentrancyGuard { + using SafeERC20 for IERC20; + + BridgeSwapCoordinator public immutable bridgeSwapCoordinator; + IReserveSystem public immutable reserveSystem; + IStablecoinPegManager public immutable stablecoinPegManager; + ICommodityPegManager public immutable commodityPegManager; + IISOCurrencyManager public immutable isoCurrencyManager; + + // Reserve verification threshold (basis points: 10000 = 100%) + uint256 public reserveVerificationThresholdBps = 10000; // 100% - must have full backing + uint256 public constant MAX_RESERVE_THRESHOLD_BPS = 15000; // 150% max + + // Rebalancing parameters + uint256 public rebalancingCooldown = 1 hours; + mapping(address => uint256) public lastRebalancingTime; + + struct ReserveStatus { + address asset; + uint256 bridgeAmount; + uint256 reserveBalance; + uint256 reserveRatio; // reserveBalance / bridgeAmount * 10000 + bool isSufficient; + uint256 lastVerified; + } + + struct PegStatus { + address asset; + uint256 currentPrice; + uint256 targetPrice; + int256 deviationBps; // Can be negative + bool isMaintained; + } + + event ReserveVerified( + uint256 indexed depositId, + address indexed asset, + uint256 bridgeAmount, + uint256 reserveBalance, + bool isSufficient + ); + + event RebalancingTriggered( + address indexed asset, + uint256 amount, + address indexed recipient + ); + + event ReserveThresholdUpdated(uint256 oldThreshold, uint256 newThreshold); + + error ZeroAddress(); + error InsufficientReserve(); + error RebalancingCooldownActive(); + error InvalidReserveThreshold(); + error ReserveVerificationFailed(); + + /** + * @notice Constructor + * @param _bridgeSwapCoordinator BridgeSwapCoordinator contract address + * @param _reserveSystem ReserveSystem contract address + * @param _stablecoinPegManager StablecoinPegManager contract address + * @param _commodityPegManager CommodityPegManager contract address + * @param _isoCurrencyManager ISOCurrencyManager contract address + */ + constructor( + address _bridgeSwapCoordinator, + address _reserveSystem, + address _stablecoinPegManager, + address _commodityPegManager, + address _isoCurrencyManager + ) Ownable(msg.sender) { + if (_bridgeSwapCoordinator == address(0) || + _reserveSystem == address(0) || + _stablecoinPegManager == address(0) || + _commodityPegManager == address(0) || + _isoCurrencyManager == address(0)) { + revert ZeroAddress(); + } + + bridgeSwapCoordinator = BridgeSwapCoordinator(payable(_bridgeSwapCoordinator)); + reserveSystem = IReserveSystem(_reserveSystem); + stablecoinPegManager = IStablecoinPegManager(_stablecoinPegManager); + commodityPegManager = ICommodityPegManager(_commodityPegManager); + isoCurrencyManager = IISOCurrencyManager(_isoCurrencyManager); + } + + /** + * @notice Bridge transfer with automatic reserve verification + * @param depositId Deposit ID from bridge + * @param recipient Recipient address + * @param outputAsset Asset type (ETH or WETH) + * @param stablecoinToken Target stablecoin + * @param amountOutMin Minimum output amount + * @param routeData Optional route data for swap + * @return stablecoinAmount Amount of stablecoin received + */ + function bridgeWithReserveBacking( + uint256 depositId, + address recipient, + LiquidityPoolETH.AssetType outputAsset, + address stablecoinToken, + uint256 amountOutMin, + bytes calldata routeData + ) external nonReentrant returns (uint256 stablecoinAmount) { + // Get claim amount from bridge + // Note: We need to get the amount from ChallengeManager via BridgeSwapCoordinator + // For now, we'll verify reserves after the bridge operation + + // Execute bridge and swap + stablecoinAmount = bridgeSwapCoordinator.bridgeAndSwap( + depositId, + recipient, + outputAsset, + stablecoinToken, + amountOutMin, + routeData + ); + + // Verify reserve backing for the stablecoin + ReserveStatus memory status = verifyReserveStatus(stablecoinToken, stablecoinAmount); + + if (!status.isSufficient) { + // Trigger rebalancing if reserves insufficient + _triggerRebalancing(stablecoinToken, stablecoinAmount); + } + + emit ReserveVerified( + depositId, + stablecoinToken, + stablecoinAmount, + status.reserveBalance, + status.isSufficient + ); + + return stablecoinAmount; + } + + /** + * @notice Verify peg status for all assets + * @return pegStatuses Array of peg statuses + */ + function verifyPegStatus() external view returns (PegStatus[] memory pegStatuses) { + // Get stablecoin peg statuses + address[] memory stablecoins = stablecoinPegManager.getSupportedAssets(); + uint256 stablecoinCount = stablecoins.length; + + // Get commodity peg statuses + address[] memory commodities = commodityPegManager.getSupportedCommodities(); + uint256 commodityCount = commodities.length; + + uint256 totalCount = stablecoinCount + commodityCount; + pegStatuses = new PegStatus[](totalCount); + + uint256 index = 0; + + // Add stablecoin peg statuses + for (uint256 i = 0; i < stablecoinCount; i++) { + (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained) = + stablecoinPegManager.getPegStatus(stablecoins[i]); + + pegStatuses[index] = PegStatus({ + asset: stablecoins[i], + currentPrice: currentPrice, + targetPrice: targetPrice, + deviationBps: deviationBps, + isMaintained: isMaintained + }); + index++; + } + + // Add commodity peg statuses + for (uint256 i = 0; i < commodityCount; i++) { + (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained) = + commodityPegManager.getCommodityPegStatus(commodities[i]); + + pegStatuses[index] = PegStatus({ + asset: commodities[i], + currentPrice: currentPrice, + targetPrice: targetPrice, + deviationBps: deviationBps, + isMaintained: isMaintained + }); + index++; + } + } + + /** + * @notice Trigger rebalancing if peg deviates + * @param asset Asset address to rebalance + * @param amount Amount that needs backing + */ + function triggerRebalancing(address asset, uint256 amount) external onlyOwner nonReentrant { + if (block.timestamp < lastRebalancingTime[asset] + rebalancingCooldown) { + revert RebalancingCooldownActive(); + } + + _triggerRebalancing(asset, amount); + } + + /** + * @notice Get reserve status for an asset + * @param asset Asset address + * @param bridgeAmount Amount bridged/required + * @return status Reserve status + */ + function getReserveStatus( + address asset, + uint256 bridgeAmount + ) external view returns (ReserveStatus memory status) { + return verifyReserveStatus(asset, bridgeAmount); + } + + /** + * @notice Set reserve verification threshold + * @param newThreshold New threshold in basis points + */ + function setReserveThreshold(uint256 newThreshold) external onlyOwner { + if (newThreshold > MAX_RESERVE_THRESHOLD_BPS) { + revert InvalidReserveThreshold(); + } + + uint256 oldThreshold = reserveVerificationThresholdBps; + reserveVerificationThresholdBps = newThreshold; + + emit ReserveThresholdUpdated(oldThreshold, newThreshold); + } + + /** + * @notice Set rebalancing cooldown period + * @param newCooldown New cooldown in seconds + */ + function setRebalancingCooldown(uint256 newCooldown) external onlyOwner { + rebalancingCooldown = newCooldown; + } + + // ============ Internal Functions ============ + + /** + * @notice Verify reserve status for an asset + * @param asset Asset address + * @param bridgeAmount Amount bridged/required + * @return status Reserve status + */ + function verifyReserveStatus( + address asset, + uint256 bridgeAmount + ) internal view returns (ReserveStatus memory status) { + uint256 reserveBalance = reserveSystem.getReserveBalance(asset); + uint256 reserveRatio = bridgeAmount > 0 + ? (reserveBalance * 10000) / bridgeAmount + : type(uint256).max; + + bool isSufficient = reserveRatio >= reserveVerificationThresholdBps; + + return ReserveStatus({ + asset: asset, + bridgeAmount: bridgeAmount, + reserveBalance: reserveBalance, + reserveRatio: reserveRatio, + isSufficient: isSufficient, + lastVerified: block.timestamp + }); + } + + /** + * @notice Internal function to trigger rebalancing + * @param asset Asset address + * @param amount Amount that needs backing + */ + function _triggerRebalancing(address asset, uint256 amount) internal { + lastRebalancingTime[asset] = block.timestamp; + + // Check if we need to deposit reserves + ReserveStatus memory status = verifyReserveStatus(asset, amount); + + if (!status.isSufficient) { + uint256 shortfall = amount - status.reserveBalance; + + // In production, this would trigger reserve deposits or conversions + // For now, we emit an event for off-chain monitoring + emit RebalancingTriggered(asset, shortfall, address(this)); + } + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/CommodityPegManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/CommodityPegManager.sol new file mode 100644 index 0000000..b27c972 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/CommodityPegManager.sol @@ -0,0 +1,296 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../../reserve/IReserveSystem.sol"; +import "./ICommodityPegManager.sol"; + +/** + * @title CommodityPegManager + * @notice Manages commodity pegging (gold XAU, silver, oil, etc.) via XAU triangulation + * @dev All commodities are pegged through XAU (gold) as the base anchor + */ +contract CommodityPegManager is ICommodityPegManager, Ownable, ReentrancyGuard { + IReserveSystem public immutable reserveSystem; + + // XAU address (gold) - base anchor + address public xauAddress; + + // Commodity peg threshold (basis points: 10000 = 100%) + uint256 public commodityPegThresholdBps = 100; // ±1.0% for commodities + uint256 public constant MAX_PEG_THRESHOLD_BPS = 1000; // 10% max + + struct Commodity { + address commodityAddress; + string symbol; + uint256 xauRate; // Rate per 1 oz XAU (in 18 decimals) + bool isActive; + } + + mapping(address => Commodity) public commodities; + address[] public supportedCommodities; + + // XAU rates: 1 oz XAU = xauRate units of commodity + // Example: 1 oz XAU = 75 oz XAG (silver), so xauRate = 75e18 + + event CommodityRegistered( + address indexed commodity, + string symbol, + uint256 xauRate + ); + + event CommodityPegChecked( + address indexed commodity, + uint256 currentPrice, + uint256 targetPrice, + int256 deviationBps, + bool isMaintained + ); + + event RebalancingTriggered( + address indexed commodity, + int256 deviationBps + ); + + error ZeroAddress(); + error CommodityNotRegistered(); + error InvalidXauRate(); + error InvalidThreshold(); + error XauNotSet(); + + /** + * @notice Constructor + * @param _reserveSystem ReserveSystem contract address + */ + constructor(address _reserveSystem) Ownable(msg.sender) { + if (_reserveSystem == address(0)) revert ZeroAddress(); + reserveSystem = IReserveSystem(_reserveSystem); + } + + /** + * @notice Set XAU (gold) address + * @param _xauAddress XAU token address + */ + function setXAUAddress(address _xauAddress) external onlyOwner { + if (_xauAddress == address(0)) revert ZeroAddress(); + xauAddress = _xauAddress; + } + + /** + * @notice Register a commodity for pegging + * @param commodity Commodity token address + * @param symbol Commodity symbol (XAG, XPT, XPD, etc.) + * @param xauRate Rate: 1 oz XAU = xauRate units of commodity (in 18 decimals) + * @return success Whether registration was successful + */ + function registerCommodity( + address commodity, + string memory symbol, + uint256 xauRate + ) external override onlyOwner returns (bool) { + if (commodity == address(0)) revert ZeroAddress(); + if (xauRate == 0) revert InvalidXauRate(); + if (xauAddress == address(0)) revert XauNotSet(); + + commodities[commodity] = Commodity({ + commodityAddress: commodity, + symbol: symbol, + xauRate: xauRate, + isActive: true + }); + + // Add to supported commodities if not already present + bool alreadyAdded = false; + for (uint256 i = 0; i < supportedCommodities.length; i++) { + if (supportedCommodities[i] == commodity) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + supportedCommodities.push(commodity); + } + + emit CommodityRegistered(commodity, symbol, xauRate); + return true; + } + + /** + * @notice Check commodity peg via XAU + * @param commodity Commodity address + * @return isMaintained Whether peg is maintained + * @return deviationBps Deviation in basis points + */ + function checkCommodityPeg( + address commodity + ) external view override returns (bool isMaintained, int256 deviationBps) { + Commodity memory comm = commodities[commodity]; + if (comm.commodityAddress == address(0)) revert CommodityNotRegistered(); + + // Get XAU price in target currency (USD) + (uint256 xauPrice, ) = reserveSystem.getPrice(xauAddress); + + // Calculate target price: xauPrice / xauRate + uint256 targetPrice = (xauPrice * 1e18) / comm.xauRate; + + // Get current commodity price + (uint256 currentPrice, ) = reserveSystem.getPrice(commodity); + + // Calculate deviation + if (targetPrice == 0) { + return (false, type(int256).max); + } + + if (currentPrice >= targetPrice) { + uint256 diff = currentPrice - targetPrice; + deviationBps = int256((diff * 10000) / targetPrice); + } else { + uint256 diff = targetPrice - currentPrice; + deviationBps = -int256((diff * 10000) / targetPrice); + } + + isMaintained = _abs(deviationBps) <= commodityPegThresholdBps; + + return (isMaintained, deviationBps); + } + + /** + * @notice Triangulate commodity value through XAU to target currency + * @param commodity Commodity address + * @param amount Amount of commodity + * @param targetCurrency Target currency address (e.g., USDT for USD) + * @return targetAmount Amount in target currency + */ + function triangulateViaXAU( + address commodity, + uint256 amount, + address targetCurrency + ) external view override returns (uint256 targetAmount) { + Commodity memory comm = commodities[commodity]; + if (comm.commodityAddress == address(0)) revert CommodityNotRegistered(); + if (xauAddress == address(0)) revert XauNotSet(); + + // Convert commodity to XAU: amount / xauRate + uint256 xauAmount = (amount * 1e18) / comm.xauRate; + + // Get XAU price in target currency + (uint256 xauPrice, ) = reserveSystem.getPrice(xauAddress); + + // Get target currency price (should be 1e18 for stablecoins) + (uint256 targetPrice, ) = reserveSystem.getPrice(targetCurrency); + + // Calculate: xauAmount * xauPrice / targetPrice + targetAmount = (xauAmount * xauPrice) / (targetPrice * 1e18); + + return targetAmount; + } + + /** + * @notice Get commodity price in target currency + * @param commodity Commodity address + * @param targetCurrency Target currency address + * @return price Price in target currency + */ + function getCommodityPrice( + address commodity, + address targetCurrency + ) external view override returns (uint256 price) { + Commodity memory comm = commodities[commodity]; + if (comm.commodityAddress == address(0)) revert CommodityNotRegistered(); + if (xauAddress == address(0)) revert XauNotSet(); + + // Get XAU price in target currency + (uint256 xauPrice, ) = reserveSystem.getPrice(xauAddress); + + // Calculate commodity price: xauPrice / xauRate + price = (xauPrice * 1e18) / comm.xauRate; + + return price; + } + + /** + * @notice Get commodity peg status + * @param commodity Commodity address + * @return currentPrice Current price + * @return targetPrice Target price (via XAU) + * @return deviationBps Deviation in basis points + * @return isMaintained Whether peg is maintained + */ + function getCommodityPegStatus( + address commodity + ) external view override returns (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained) { + Commodity memory comm = commodities[commodity]; + if (comm.commodityAddress == address(0)) revert CommodityNotRegistered(); + if (xauAddress == address(0)) revert XauNotSet(); + + // Get XAU price + (uint256 xauPrice, ) = reserveSystem.getPrice(xauAddress); + + // Calculate target price + targetPrice = (xauPrice * 1e18) / comm.xauRate; + + // Get current price + (currentPrice, ) = reserveSystem.getPrice(commodity); + + // Calculate deviation + if (targetPrice == 0) { + return (currentPrice, targetPrice, type(int256).max, false); + } + + if (currentPrice >= targetPrice) { + uint256 diff = currentPrice - targetPrice; + deviationBps = int256((diff * 10000) / targetPrice); + } else { + uint256 diff = targetPrice - currentPrice; + deviationBps = -int256((diff * 10000) / targetPrice); + } + + isMaintained = _abs(deviationBps) <= commodityPegThresholdBps; + + // Note: Cannot emit in view function, events should be emitted by caller if needed + + return (currentPrice, targetPrice, deviationBps, isMaintained); + } + + /** + * @notice Get all supported commodities + * @return Array of commodity addresses + */ + function getSupportedCommodities() external view override returns (address[] memory) { + return supportedCommodities; + } + + /** + * @notice Set commodity peg threshold + * @param newThreshold New threshold in basis points + */ + function setCommodityPegThreshold(uint256 newThreshold) external onlyOwner { + if (newThreshold > MAX_PEG_THRESHOLD_BPS) revert InvalidThreshold(); + commodityPegThresholdBps = newThreshold; + } + + /** + * @notice Update XAU rate for a commodity + * @param commodity Commodity address + * @param newXauRate New XAU rate + */ + function updateXauRate(address commodity, uint256 newXauRate) external onlyOwner { + if (commodities[commodity].commodityAddress == address(0)) revert CommodityNotRegistered(); + if (newXauRate == 0) revert InvalidXauRate(); + + commodities[commodity].xauRate = newXauRate; + } + + // ============ Internal Functions ============ + + /** + * @notice Get absolute value of int256 + * @param value Input value + * @return Absolute value + */ + function _abs(int256 value) internal pure returns (uint256) { + return value < 0 ? uint256(-value) : uint256(value); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/ICommodityPegManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/ICommodityPegManager.sol new file mode 100644 index 0000000..76f575d --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/ICommodityPegManager.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title ICommodityPegManager + * @notice Interface for Commodity Peg Manager + */ +interface ICommodityPegManager { + struct CommodityPegStatus { + uint256 currentPrice; + uint256 targetPrice; + int256 deviationBps; + bool isMaintained; + } + + function registerCommodity(address commodity, string memory symbol, uint256 xauRate) external returns (bool); + function checkCommodityPeg(address commodity) external view returns (bool isMaintained, int256 deviationBps); + function triangulateViaXAU(address commodity, uint256 amount, address targetCurrency) external view returns (uint256 targetAmount); + function getCommodityPrice(address commodity, address targetCurrency) external view returns (uint256 price); + function getCommodityPegStatus(address commodity) external view returns (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained); + function getSupportedCommodities() external view returns (address[] memory); +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/IISOCurrencyManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/IISOCurrencyManager.sol new file mode 100644 index 0000000..ef21137 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/IISOCurrencyManager.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IISOCurrencyManager + * @notice Interface for ISO-4217 Currency Manager + */ +interface IISOCurrencyManager { + function registerCurrency(string memory currencyCode, address tokenAddress, uint256 xauRate) external returns (bool); + function convertViaXAU(string memory fromCurrency, string memory toCurrency, uint256 amount) external view returns (uint256 targetAmount); + function getCurrencyRate(string memory fromCurrency, string memory toCurrency) external view returns (uint256 rate); + function getAllSupportedCurrencies() external view returns (string[] memory); + function getCurrencyAddress(string memory currencyCode) external view returns (address); +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/ISOCurrencyManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/ISOCurrencyManager.sol new file mode 100644 index 0000000..731d939 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/ISOCurrencyManager.sol @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../../reserve/IReserveSystem.sol"; +import "./IISOCurrencyManager.sol"; + +/** + * @title ISOCurrencyManager + * @notice Manages all ISO-4217 currencies with XAU triangulation support + * @dev All currency conversions go through XAU: CurrencyA → XAU → CurrencyB + */ +contract ISOCurrencyManager is IISOCurrencyManager, Ownable, ReentrancyGuard { + IReserveSystem public immutable reserveSystem; + + // XAU address (gold) - base anchor for all triangulations + address public xauAddress; + + struct Currency { + string currencyCode; // ISO-4217 code (USD, EUR, GBP, etc.) + address tokenAddress; // Token contract address (if tokenized) + uint256 xauRate; // Rate: 1 oz XAU = xauRate units of currency (in 18 decimals) + bool isActive; + bool isTokenized; // Whether currency has on-chain token representation + } + + mapping(string => Currency) public currencies; + string[] public supportedCurrencies; + + // Example rates (in 18 decimals): + // USD: 1 oz XAU = 2000 USD, so xauRate = 2000e18 + // EUR: 1 oz XAU = 1800 EUR, so xauRate = 1800e18 + + event CurrencyRegistered( + string indexed currencyCode, + address tokenAddress, + uint256 xauRate, + bool isTokenized + ); + + event CurrencyConverted( + string fromCurrency, + string toCurrency, + uint256 fromAmount, + uint256 toAmount + ); + + error ZeroAddress(); + error CurrencyNotRegistered(); + error InvalidXauRate(); + error XauNotSet(); + error InvalidCurrencyCode(); + + /** + * @notice Constructor + * @param _reserveSystem ReserveSystem contract address + */ + constructor(address _reserveSystem) Ownable(msg.sender) { + if (_reserveSystem == address(0)) revert ZeroAddress(); + reserveSystem = IReserveSystem(_reserveSystem); + } + + /** + * @notice Set XAU (gold) address + * @param _xauAddress XAU token address + */ + function setXAUAddress(address _xauAddress) external onlyOwner { + if (_xauAddress == address(0)) revert ZeroAddress(); + xauAddress = _xauAddress; + } + + /** + * @notice Register ISO-4217 currency + * @param currencyCode ISO-4217 currency code (USD, EUR, GBP, JPY, etc.) + * @param tokenAddress Token contract address (address(0) if not tokenized) + * @param xauRate Rate: 1 oz XAU = xauRate units of currency (in 18 decimals) + * @return success Whether registration was successful + */ + function registerCurrency( + string memory currencyCode, + address tokenAddress, + uint256 xauRate + ) external override onlyOwner returns (bool) { + if (bytes(currencyCode).length == 0) revert InvalidCurrencyCode(); + if (xauRate == 0) revert InvalidXauRate(); + if (xauAddress == address(0)) revert XauNotSet(); + + bool isTokenized = tokenAddress != address(0); + + currencies[currencyCode] = Currency({ + currencyCode: currencyCode, + tokenAddress: tokenAddress, + xauRate: xauRate, + isActive: true, + isTokenized: isTokenized + }); + + // Add to supported currencies if not already present + bool alreadyAdded = false; + for (uint256 i = 0; i < supportedCurrencies.length; i++) { + if (keccak256(bytes(supportedCurrencies[i])) == keccak256(bytes(currencyCode))) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + supportedCurrencies.push(currencyCode); + } + + emit CurrencyRegistered(currencyCode, tokenAddress, xauRate, isTokenized); + return true; + } + + /** + * @notice Convert between currencies via XAU triangulation + * @param fromCurrency Source currency code + * @param toCurrency Target currency code + * @param amount Amount to convert + * @return targetAmount Amount in target currency + */ + function convertViaXAU( + string memory fromCurrency, + string memory toCurrency, + uint256 amount + ) external view override returns (uint256 targetAmount) { + Currency memory from = currencies[fromCurrency]; + Currency memory to = currencies[toCurrency]; + + if (bytes(from.currencyCode).length == 0) revert CurrencyNotRegistered(); + if (bytes(to.currencyCode).length == 0) revert CurrencyNotRegistered(); + if (xauAddress == address(0)) revert XauNotSet(); + + // Step 1: Convert fromCurrency to XAU + // amount / from.xauRate = XAU amount + uint256 xauAmount = (amount * 1e18) / from.xauRate; + + // Step 2: Convert XAU to toCurrency + // xauAmount * to.xauRate / 1e18 = targetAmount + targetAmount = (xauAmount * to.xauRate) / 1e18; + + return targetAmount; + } + + /** + * @notice Get exchange rate for currency pair + * @param fromCurrency Source currency code + * @param toCurrency Target currency code + * @return rate Exchange rate (toCurrency per fromCurrency, in 18 decimals) + */ + function getCurrencyRate( + string memory fromCurrency, + string memory toCurrency + ) external view override returns (uint256 rate) { + Currency memory from = currencies[fromCurrency]; + Currency memory to = currencies[toCurrency]; + + if (bytes(from.currencyCode).length == 0) revert CurrencyNotRegistered(); + if (bytes(to.currencyCode).length == 0) revert CurrencyNotRegistered(); + + // Rate = (to.xauRate / from.xauRate) * 1e18 + // This gives: 1 fromCurrency = rate toCurrency + rate = (to.xauRate * 1e18) / from.xauRate; + + return rate; + } + + /** + * @notice Get all supported currencies + * @return Array of currency codes + */ + function getAllSupportedCurrencies() external view override returns (string[] memory) { + return supportedCurrencies; + } + + /** + * @notice Get token address for a currency code + * @param currencyCode ISO-4217 currency code + * @return Token address (address(0) if not tokenized) + */ + function getCurrencyAddress( + string memory currencyCode + ) external view override returns (address) { + Currency memory currency = currencies[currencyCode]; + if (bytes(currency.currencyCode).length == 0) revert CurrencyNotRegistered(); + return currency.tokenAddress; + } + + /** + * @notice Update XAU rate for a currency + * @param currencyCode ISO-4217 currency code + * @param newXauRate New XAU rate + */ + function updateXauRate(string memory currencyCode, uint256 newXauRate) external onlyOwner { + Currency storage currency = currencies[currencyCode]; + if (bytes(currency.currencyCode).length == 0) revert CurrencyNotRegistered(); + if (newXauRate == 0) revert InvalidXauRate(); + + currency.xauRate = newXauRate; + } + + /** + * @notice Get currency info + * @param currencyCode ISO-4217 currency code + * @return tokenAddress Token address + * @return xauRate XAU rate + * @return isActive Whether currency is active + * @return isTokenized Whether currency is tokenized + */ + function getCurrencyInfo( + string memory currencyCode + ) external view returns ( + address tokenAddress, + uint256 xauRate, + bool isActive, + bool isTokenized + ) { + Currency memory currency = currencies[currencyCode]; + if (bytes(currency.currencyCode).length == 0) revert CurrencyNotRegistered(); + + return ( + currency.tokenAddress, + currency.xauRate, + currency.isActive, + currency.isTokenized + ); + } + + /** + * @notice Batch register currencies + * @param currencyCodes Array of currency codes + * @param tokenAddresses Array of token addresses + * @param xauRates Array of XAU rates + */ + function batchRegisterCurrencies( + string[] memory currencyCodes, + address[] memory tokenAddresses, + uint256[] memory xauRates + ) external onlyOwner { + require( + currencyCodes.length == tokenAddresses.length && + currencyCodes.length == xauRates.length, + "ISOCurrencyManager: length mismatch" + ); + + for (uint256 i = 0; i < currencyCodes.length; i++) { + // Call internal registration logic directly + bool isTokenized = tokenAddresses[i] != address(0); + currencies[currencyCodes[i]] = Currency({ + currencyCode: currencyCodes[i], + tokenAddress: tokenAddresses[i], + xauRate: xauRates[i], + isActive: true, + isTokenized: isTokenized + }); + + // Add to supported currencies if not already present + bool alreadyAdded = false; + for (uint256 j = 0; j < supportedCurrencies.length; j++) { + if (keccak256(bytes(supportedCurrencies[j])) == keccak256(bytes(currencyCodes[i]))) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + supportedCurrencies.push(currencyCodes[i]); + } + + emit CurrencyRegistered(currencyCodes[i], tokenAddresses[i], xauRates[i], isTokenized); + } + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/IStablecoinPegManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/IStablecoinPegManager.sol new file mode 100644 index 0000000..b96bcd7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/IStablecoinPegManager.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IStablecoinPegManager + * @notice Interface for Stablecoin Peg Manager + */ +interface IStablecoinPegManager { + struct PegStatus { + uint256 currentPrice; + uint256 targetPrice; + int256 deviationBps; // Can be negative + bool isMaintained; + } + + function checkUSDpeg(address stablecoin) external view returns (bool isMaintained, int256 deviationBps); + function checkETHpeg(address weth) external view returns (bool isMaintained, int256 deviationBps); + function calculateDeviation(address asset, uint256 currentPrice, uint256 targetPrice) external pure returns (int256 deviationBps); + function getPegStatus(address asset) external view returns (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained); + function getSupportedAssets() external view returns (address[] memory); +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/Stabilizer.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/Stabilizer.sol new file mode 100644 index 0000000..e108b77 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/Stabilizer.sol @@ -0,0 +1,237 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../../dex/PrivatePoolRegistry.sol"; +import "./IStablecoinPegManager.sol"; +import "./ICommodityPegManager.sol"; + +/** + * @title Minimal DODO PMM pool interface for Stabilizer swaps + */ +interface IDODOPMMPoolStabilizer { + function _BASE_TOKEN_() external view returns (address); + function _QUOTE_TOKEN_() external view returns (address); + function sellBase(uint256 amount) external returns (uint256); + function sellQuote(uint256 amount) external returns (uint256); + function getMidPrice() external view returns (uint256); +} + +/** + * @title Stabilizer + * @notice Phase 3: Deviation-triggered private swaps via XAU-anchored pools. Phase 6: TWAP/sustained deviation, per-block cap, flash containment. + * @dev Implements Appendix A of VAULT_SYSTEM_MASTER_TECHNICAL_PLAN. Only STABILIZER_KEEPER_ROLE may call executePrivateSwap. + */ +contract Stabilizer is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant STABILIZER_KEEPER_ROLE = keccak256("STABILIZER_KEEPER_ROLE"); + + PrivatePoolRegistry public immutable privatePoolRegistry; + + uint256 public lastExecutionBlock; + uint256 public volumeThisBlock; + uint256 public volumeBlockNumber; + uint256 public minBlocksBetweenExecution = 3; + uint256 public maxStabilizationVolumePerBlock; + uint256 public thresholdBps = 50; + uint256 public sustainedDeviationBlocks = 3; + uint256 public maxSlippageBps = 100; + uint256 public maxGasPriceForStabilizer; + + IStablecoinPegManager public stablecoinPegManager; + address public stablecoinPegAsset; + ICommodityPegManager public commodityPegManager; + address public commodityPegAsset; + bool public useStablecoinPeg; // true = use stablecoin peg, false = use commodity peg (when set) + + struct DeviationSample { + uint256 blockNumber; + int256 deviationBps; + } + uint256 public constant MAX_DEVIATION_SAMPLES = 32; + DeviationSample[MAX_DEVIATION_SAMPLES] private _samples; + uint256 private _sampleIndex; + uint256 private _sampleCount; + + event PrivateSwapExecuted(address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut); + event ConfigUpdated(string key, uint256 value); + event PegSourceStablecoinSet(address manager, address asset); + event PegSourceCommoditySet(address manager, address asset); + + error NoPrivatePool(); + error ShouldNotRebalance(); + error BlockDelayNotMet(); + error VolumeCapExceeded(); + error SlippageExceeded(); + error GasPriceTooHigh(); + error ZeroAmount(); + error NoDeviationSource(); + error InsufficientBalance(); + + constructor(address admin, address _privatePoolRegistry) { + require(admin != address(0), "Stabilizer: zero admin"); + require(_privatePoolRegistry != address(0), "Stabilizer: zero registry"); + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(STABILIZER_KEEPER_ROLE, admin); + privatePoolRegistry = PrivatePoolRegistry(_privatePoolRegistry); + } + + function setStablecoinPegSource(address manager, address asset) external onlyRole(DEFAULT_ADMIN_ROLE) { + stablecoinPegManager = IStablecoinPegManager(manager); + stablecoinPegAsset = asset; + useStablecoinPeg = true; + emit PegSourceStablecoinSet(manager, asset); + } + + function setCommodityPegSource(address manager, address asset) external onlyRole(DEFAULT_ADMIN_ROLE) { + commodityPegManager = ICommodityPegManager(manager); + commodityPegAsset = asset; + useStablecoinPeg = false; + emit PegSourceCommoditySet(manager, asset); + } + + function setMinBlocksBetweenExecution(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + minBlocksBetweenExecution = v; + emit ConfigUpdated("minBlocksBetweenExecution", v); + } + + function setMaxStabilizationVolumePerBlock(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + maxStabilizationVolumePerBlock = v; + emit ConfigUpdated("maxStabilizationVolumePerBlock", v); + } + + function setThresholdBps(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + thresholdBps = v; + emit ConfigUpdated("thresholdBps", v); + } + + function setSustainedDeviationBlocks(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(v <= MAX_DEVIATION_SAMPLES, "Stabilizer: sample limit"); + sustainedDeviationBlocks = v; + emit ConfigUpdated("sustainedDeviationBlocks", v); + } + + function setMaxSlippageBps(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + maxSlippageBps = v; + emit ConfigUpdated("maxSlippageBps", v); + } + + function setMaxGasPriceForStabilizer(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + maxGasPriceForStabilizer = v; + emit ConfigUpdated("maxGasPriceForStabilizer", v); + } + + /** + * @notice Get current deviation in bps and whether rebalance is recommended (sustained over threshold). + * @return deviationBps Current peg deviation in basis points. + * @return shouldRebalance True if over threshold for sustainedDeviationBlocks samples. + */ + function checkDeviation() external view returns (int256 deviationBps, bool shouldRebalance) { + deviationBps = _getDeviationBps(); + // forge-lint: disable-next-line unsafe-typecast -- thresholdBps is uint256, casting to int256 for comparison with _abs result; thresholdBps is small (basis points) + if (_abs(deviationBps) <= int256(uint256(thresholdBps))) { + return (deviationBps, false); + } + shouldRebalance = _sustainedOverThreshold(); + return (deviationBps, shouldRebalance); + } + + /** + * @notice Record current deviation for sustained-deviation check (call from keeper each block or before executePrivateSwap). + */ + function recordDeviation() external { + int256 d = _getDeviationBps(); + _pushSample(block.number, d); + } + + /** + * @notice Execute a private swap via the private pool registry (only keeper when shouldRebalance). + * @param tradeSize Amount of tokenIn to swap. + * @param tokenIn Token to sell (must have balance on this contract). + * @param tokenOut Token to buy. + * @return amountOut Amount of tokenOut received (reverts on slippage or volume cap). + */ + function executePrivateSwap( + uint256 tradeSize, + address tokenIn, + address tokenOut + ) external nonReentrant onlyRole(STABILIZER_KEEPER_ROLE) returns (uint256 amountOut) { + if (tradeSize == 0) revert ZeroAmount(); + if (maxGasPriceForStabilizer != 0 && block.basefee > maxGasPriceForStabilizer) revert GasPriceTooHigh(); + if (block.number < lastExecutionBlock + minBlocksBetweenExecution) revert BlockDelayNotMet(); + + _pushSample(block.number, _getDeviationBps()); + (int256 deviationBps, bool shouldRebalance) = this.checkDeviation(); + if (!shouldRebalance) revert ShouldNotRebalance(); + + if (block.number != volumeBlockNumber) { + volumeBlockNumber = block.number; + volumeThisBlock = 0; + } + if (volumeThisBlock + tradeSize > maxStabilizationVolumePerBlock) revert VolumeCapExceeded(); + volumeThisBlock += tradeSize; + lastExecutionBlock = block.number; + + address pool = privatePoolRegistry.getPrivatePool(tokenIn, tokenOut); + if (pool == address(0)) revert NoPrivatePool(); + + address base = IDODOPMMPoolStabilizer(pool)._BASE_TOKEN_(); + address quote = IDODOPMMPoolStabilizer(pool)._QUOTE_TOKEN_(); + uint256 midPrice = IDODOPMMPoolStabilizer(pool).getMidPrice(); + uint256 expectedOut = tokenIn == base + ? (tradeSize * midPrice) / 1e18 + : (tradeSize * 1e18) / midPrice; + uint256 minAmountOut = (expectedOut * (10000 - maxSlippageBps)) / 10000; + + if (IERC20(tokenIn).balanceOf(address(this)) < tradeSize) revert InsufficientBalance(); + IERC20(tokenIn).safeTransfer(pool, tradeSize); + amountOut = tokenIn == base + ? IDODOPMMPoolStabilizer(pool).sellBase(tradeSize) + : IDODOPMMPoolStabilizer(pool).sellQuote(tradeSize); + if (amountOut < minAmountOut) revert SlippageExceeded(); + + emit PrivateSwapExecuted(tokenIn, tokenOut, tradeSize, amountOut); + return amountOut; + } + + function _getDeviationBps() internal view returns (int256) { + if (useStablecoinPeg && address(stablecoinPegManager) != address(0) && stablecoinPegAsset != address(0)) { + (, int256 d) = stablecoinPegManager.checkUSDpeg(stablecoinPegAsset); + return d; + } + if (!useStablecoinPeg && address(commodityPegManager) != address(0) && commodityPegAsset != address(0)) { + (, int256 d) = commodityPegManager.checkCommodityPeg(commodityPegAsset); + return d; + } + return 0; + } + + function _sustainedOverThreshold() internal view returns (bool) { + if (sustainedDeviationBlocks == 0) return true; + if (_sampleCount < sustainedDeviationBlocks) return false; + uint256 n = sustainedDeviationBlocks; + for (uint256 i = 0; i < n; i++) { + uint256 idx = (_sampleIndex + MAX_DEVIATION_SAMPLES - 1 - i) % MAX_DEVIATION_SAMPLES; + int256 d = _samples[idx].deviationBps; + // forge-lint: disable-next-line unsafe-typecast -- d is deviationBps (small int256), safe to cast to uint256 for abs + uint256 absD = d < 0 ? uint256(-d) : uint256(d); + if (absD <= thresholdBps) return false; + } + return true; + } + + function _pushSample(uint256 blockNum, int256 deviationBps) internal { + uint256 idx = _sampleIndex % MAX_DEVIATION_SAMPLES; + _samples[idx] = DeviationSample({ blockNumber: blockNum, deviationBps: deviationBps }); + _sampleIndex = ( _sampleIndex + 1) % MAX_DEVIATION_SAMPLES; + if (_sampleCount < MAX_DEVIATION_SAMPLES) _sampleCount++; + } + + function _abs(int256 x) internal pure returns (int256) { + return x < 0 ? -x : x; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/StablecoinPegManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/StablecoinPegManager.sol new file mode 100644 index 0000000..1ea6b3d --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/integration/StablecoinPegManager.sol @@ -0,0 +1,301 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../../reserve/IReserveSystem.sol"; +import "./IStablecoinPegManager.sol"; + +/** + * @title StablecoinPegManager + * @notice Maintains USD peg for USDT/USDC, ETH peg for WETH, and monitors deviations + * @dev Monitors peg status and triggers rebalancing if deviation exceeds thresholds + */ +contract StablecoinPegManager is IStablecoinPegManager, Ownable, ReentrancyGuard { + IReserveSystem public immutable reserveSystem; + + // Peg thresholds (basis points: 10000 = 100%) + uint256 public usdPegThresholdBps = 50; // ±0.5% for USD stablecoins + uint256 public ethPegThresholdBps = 10; // ±0.1% for ETH/WETH + uint256 public constant MAX_PEG_THRESHOLD_BPS = 500; // 5% max + + // Target prices (in 18 decimals) + uint256 public constant USD_TARGET_PRICE = 1e18; // $1.00 + uint256 public constant ETH_TARGET_PRICE = 1e18; // 1:1 with ETH + + // Supported assets + mapping(address => bool) public isUSDStablecoin; // USDT, USDC, DAI + mapping(address => bool) public isWETH; // WETH + address[] public supportedAssets; + + struct AssetPeg { + address asset; + uint256 targetPrice; + uint256 thresholdBps; + bool isActive; + } + + mapping(address => AssetPeg) public assetPegs; + + event PegChecked( + address indexed asset, + uint256 currentPrice, + uint256 targetPrice, + int256 deviationBps, + bool isMaintained + ); + + event RebalancingTriggered( + address indexed asset, + int256 deviationBps, + uint256 requiredAdjustment + ); + + event AssetRegistered(address indexed asset, uint256 targetPrice, uint256 thresholdBps); + event PegThresholdUpdated(address indexed asset, uint256 oldThreshold, uint256 newThreshold); + + error ZeroAddress(); + error AssetNotRegistered(); + error InvalidThreshold(); + error InvalidTargetPrice(); + + /** + * @notice Constructor + * @param _reserveSystem ReserveSystem contract address + */ + constructor(address _reserveSystem) Ownable(msg.sender) { + if (_reserveSystem == address(0)) revert ZeroAddress(); + reserveSystem = IReserveSystem(_reserveSystem); + } + + /** + * @notice Register a USD stablecoin + * @param asset Asset address (USDT, USDC, DAI) + */ + function registerUSDStablecoin(address asset) external onlyOwner { + if (asset == address(0)) revert ZeroAddress(); + + isUSDStablecoin[asset] = true; + assetPegs[asset] = AssetPeg({ + asset: asset, + targetPrice: USD_TARGET_PRICE, + thresholdBps: usdPegThresholdBps, + isActive: true + }); + + // Add to supported assets if not already present + bool alreadyAdded = false; + for (uint256 i = 0; i < supportedAssets.length; i++) { + if (supportedAssets[i] == asset) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + supportedAssets.push(asset); + } + + emit AssetRegistered(asset, USD_TARGET_PRICE, usdPegThresholdBps); + } + + /** + * @notice Register WETH + * @param weth WETH token address + */ + function registerWETH(address weth) external onlyOwner { + if (weth == address(0)) revert ZeroAddress(); + + isWETH[weth] = true; + assetPegs[weth] = AssetPeg({ + asset: weth, + targetPrice: ETH_TARGET_PRICE, + thresholdBps: ethPegThresholdBps, + isActive: true + }); + + // Add to supported assets if not already present + bool alreadyAdded = false; + for (uint256 i = 0; i < supportedAssets.length; i++) { + if (supportedAssets[i] == weth) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + supportedAssets.push(weth); + } + + emit AssetRegistered(weth, ETH_TARGET_PRICE, ethPegThresholdBps); + } + + /** + * @notice Check USD peg for a stablecoin + * @param stablecoin Stablecoin address + * @return isMaintained Whether peg is maintained + * @return deviationBps Deviation in basis points + */ + function checkUSDpeg(address stablecoin) external view override returns (bool isMaintained, int256 deviationBps) { + if (!isUSDStablecoin[stablecoin]) revert AssetNotRegistered(); + + AssetPeg memory peg = assetPegs[stablecoin]; + (uint256 currentPrice, ) = reserveSystem.getPrice(stablecoin); + + deviationBps = calculateDeviation(stablecoin, currentPrice, peg.targetPrice); + isMaintained = _abs(deviationBps) <= peg.thresholdBps; + + return (isMaintained, deviationBps); + } + + /** + * @notice Check ETH peg for WETH + * @param weth WETH address + * @return isMaintained Whether peg is maintained + * @return deviationBps Deviation in basis points + */ + function checkETHpeg(address weth) external view override returns (bool isMaintained, int256 deviationBps) { + if (!isWETH[weth]) revert AssetNotRegistered(); + + AssetPeg memory peg = assetPegs[weth]; + (uint256 currentPrice, ) = reserveSystem.getPrice(weth); + + deviationBps = calculateDeviation(weth, currentPrice, peg.targetPrice); + isMaintained = _abs(deviationBps) <= peg.thresholdBps; + + return (isMaintained, deviationBps); + } + + /** + * @notice Calculate deviation from target price + * @param asset Asset address + * @param currentPrice Current price + * @param targetPrice Target price + * @return deviationBps Deviation in basis points (can be negative) + */ + function calculateDeviation( + address asset, + uint256 currentPrice, + uint256 targetPrice + ) public pure override returns (int256 deviationBps) { + if (targetPrice == 0) revert InvalidTargetPrice(); + + // Calculate deviation: ((currentPrice - targetPrice) / targetPrice) * 10000 + if (currentPrice >= targetPrice) { + uint256 diff = currentPrice - targetPrice; + deviationBps = int256((diff * 10000) / targetPrice); + } else { + uint256 diff = targetPrice - currentPrice; + deviationBps = -int256((diff * 10000) / targetPrice); + } + + return deviationBps; + } + + /** + * @notice Get peg status for an asset + * @param asset Asset address + * @return currentPrice Current price + * @return targetPrice Target price + * @return deviationBps Deviation in basis points + * @return isMaintained Whether peg is maintained + */ + function getPegStatus( + address asset + ) external view override returns (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained) { + AssetPeg memory peg = assetPegs[asset]; + if (peg.asset == address(0)) revert AssetNotRegistered(); + + (currentPrice, ) = reserveSystem.getPrice(asset); + targetPrice = peg.targetPrice; + deviationBps = calculateDeviation(asset, currentPrice, targetPrice); + isMaintained = _abs(deviationBps) <= peg.thresholdBps; + + // Note: Cannot emit in view function, events should be emitted by caller if needed + + return (currentPrice, targetPrice, deviationBps, isMaintained); + } + + /** + * @notice Get all supported assets + * @return Array of supported asset addresses + */ + function getSupportedAssets() external view override returns (address[] memory) { + return supportedAssets; + } + + /** + * @notice Set USD peg threshold + * @param newThreshold New threshold in basis points + */ + function setUSDPegThreshold(uint256 newThreshold) external onlyOwner { + if (newThreshold > MAX_PEG_THRESHOLD_BPS) revert InvalidThreshold(); + + uint256 oldThreshold = usdPegThresholdBps; + usdPegThresholdBps = newThreshold; + + // Update all USD stablecoin thresholds + for (uint256 i = 0; i < supportedAssets.length; i++) { + if (isUSDStablecoin[supportedAssets[i]]) { + uint256 oldAssetThreshold = assetPegs[supportedAssets[i]].thresholdBps; + assetPegs[supportedAssets[i]].thresholdBps = newThreshold; + emit PegThresholdUpdated(supportedAssets[i], oldAssetThreshold, newThreshold); + } + } + + emit PegThresholdUpdated(address(0), oldThreshold, newThreshold); + } + + /** + * @notice Set ETH peg threshold + * @param newThreshold New threshold in basis points + */ + function setETHPegThreshold(uint256 newThreshold) external onlyOwner { + if (newThreshold > MAX_PEG_THRESHOLD_BPS) revert InvalidThreshold(); + + uint256 oldThreshold = ethPegThresholdBps; + ethPegThresholdBps = newThreshold; + + // Update all WETH thresholds + for (uint256 i = 0; i < supportedAssets.length; i++) { + if (isWETH[supportedAssets[i]]) { + uint256 oldAssetThreshold = assetPegs[supportedAssets[i]].thresholdBps; + assetPegs[supportedAssets[i]].thresholdBps = newThreshold; + emit PegThresholdUpdated(supportedAssets[i], oldAssetThreshold, newThreshold); + } + } + + emit PegThresholdUpdated(address(0), oldThreshold, newThreshold); + } + + /** + * @notice Trigger rebalancing if deviation exceeds threshold + * @param asset Asset address + */ + function triggerRebalancing(address asset) external onlyOwner nonReentrant { + AssetPeg memory peg = assetPegs[asset]; + if (peg.asset == address(0)) revert AssetNotRegistered(); + + (uint256 currentPrice, ) = reserveSystem.getPrice(asset); + int256 deviationBps = calculateDeviation(asset, currentPrice, peg.targetPrice); + + if (_abs(deviationBps) > peg.thresholdBps) { + // Calculate required adjustment + uint256 adjustment = currentPrice > peg.targetPrice + ? currentPrice - peg.targetPrice + : peg.targetPrice - currentPrice; + + emit RebalancingTriggered(asset, deviationBps, adjustment); + } + } + + // ============ Internal Functions ============ + + /** + * @notice Get absolute value of int256 + * @param value Input value + * @return Absolute value + */ + function _abs(int256 value) internal pure returns (uint256) { + return value < 0 ? uint256(-value) : uint256(value); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IAggregationRouter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IAggregationRouter.sol new file mode 100644 index 0000000..71d6a00 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IAggregationRouter.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IAggregationRouter - 1inch AggregationRouter Interface + * @notice Minimal interface for 1inch AggregationRouter + * @dev Based on 1inch V5 Router + */ +interface IAggregationRouter { + struct SwapDescription { + address srcToken; + address dstToken; + address srcReceiver; + address dstReceiver; + uint256 amount; + uint256 minReturnAmount; + uint256 flags; + bytes permit; + } + + function swap( + address executor, + SwapDescription calldata desc, + bytes calldata permit, + bytes calldata data + ) external payable returns (uint256 returnAmount, uint256 spentAmount); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IBalancerVault.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IBalancerVault.sol new file mode 100644 index 0000000..4144743 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IBalancerVault.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IBalancerVault + * @notice Interface for Balancer V2 Vault + * @dev Balancer provides weighted pools and better stablecoin swaps + */ +interface IBalancerVault { + struct SingleSwap { + bytes32 poolId; + SwapKind kind; + address assetIn; + address assetOut; + uint256 amount; + bytes userData; + } + + struct FundManagement { + address sender; + bool fromInternalBalance; + address payable recipient; + bool toInternalBalance; + } + + enum SwapKind { + GIVEN_IN, // Amount in is known + GIVEN_OUT // Amount out is known + } + + /** + * @notice Execute a single swap + * @param singleSwap Swap parameters + * @param funds Fund management parameters + * @param limit Maximum amount to swap (slippage protection) + * @param deadline Deadline for swap + * @return amountCalculated Amount calculated for swap + */ + function swap( + SingleSwap memory singleSwap, + FundManagement memory funds, + uint256 limit, + uint256 deadline + ) external payable returns (uint256 amountCalculated); + + /** + * @notice Get pool information + * @param poolId Pool identifier + * @return poolAddress Pool address + * @return specialization Pool specialization type + */ + function getPool(bytes32 poolId) external view returns (address poolAddress, uint8 specialization); + + /** + * @notice Query batch swap for quotes + * @param kind Swap kind + * @param swaps Array of swaps to query + * @param assets Array of assets involved + * @return assetDeltas Asset deltas for each asset + */ + function queryBatchSwap( + SwapKind kind, + SingleSwap[] memory swaps, + address[] memory assets + ) external view returns (int256[] memory assetDeltas); + + /** + * @notice Get pool tokens and balances + * @param poolId Pool identifier + * @return tokens Token addresses in the pool + * @return balances Token balances in the pool + * @return lastChangeBlock Last block number that changed balances + */ + function getPoolTokens(bytes32 poolId) + external + view + returns ( + address[] memory tokens, + uint256[] memory balances, + uint256 lastChangeBlock + ); +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/ICurvePool.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/ICurvePool.sol new file mode 100644 index 0000000..4215aa7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/ICurvePool.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title ICurvePool - Curve Pool Interface + * @notice Minimal interface for Curve stable pools (e.g., 3pool) + * @dev Based on Curve StableSwap pools + */ +interface ICurvePool { + function exchange( + int128 i, + int128 j, + uint256 dx, + uint256 min_dy + ) external payable returns (uint256); + + function exchange_underlying( + int128 i, + int128 j, + uint256 dx, + uint256 min_dy + ) external payable returns (uint256); + + function get_dy( + int128 i, + int128 j, + uint256 dx + ) external view returns (uint256); + + function coins(uint256 i) external view returns (address); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IDodoexRouter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IDodoexRouter.sol new file mode 100644 index 0000000..71c93db --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IDodoexRouter.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IDodoexRouter + * @notice Interface for Dodoex PMM (Proactive Market Maker) Router + * @dev Dodoex uses PMM which provides better price discovery and lower slippage + */ +interface IDodoexRouter { + struct DodoSwapParams { + address fromToken; + address toToken; + uint256 fromTokenAmount; + uint256 minReturnAmount; + address[] dodoPairs; // Dodo PMM pool addresses + uint256 directions; // 0 = base to quote, 1 = quote to base + bool isIncentive; // Whether to use incentive mechanism + uint256 deadLine; + } + + /** + * @notice Swap tokens via Dodoex PMM + * @param params Swap parameters + * @return receivedAmount Amount received after swap + */ + function dodoSwapV2TokenToToken( + DodoSwapParams calldata params + ) external returns (uint256 receivedAmount); + + /** + * @notice Get quote for swap (view function) + * @param fromToken Source token + * @param toToken Destination token + * @param fromTokenAmount Amount to swap + * @return toTokenAmount Expected output amount + */ + function getDodoSwapQuote( + address fromToken, + address toToken, + uint256 fromTokenAmount + ) external view returns (uint256 toTokenAmount); +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/ISwapRouter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/ISwapRouter.sol new file mode 100644 index 0000000..b0444a9 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/ISwapRouter.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title ISwapRouter - Uniswap V3 SwapRouter Interface + * @notice Minimal interface for Uniswap V3 SwapRouter + * @dev Based on Uniswap V3 SwapRouter02 + */ +interface ISwapRouter { + struct ExactInputSingleParams { + address tokenIn; + address tokenOut; + uint24 fee; + address recipient; + uint256 deadline; + uint256 amountIn; + uint256 amountOutMinimum; + uint160 sqrtPriceLimitX96; + } + + struct ExactInputParams { + bytes path; + address recipient; + uint256 deadline; + uint256 amountIn; + uint256 amountOutMinimum; + } + + function exactInputSingle(ExactInputSingleParams calldata params) + external + payable + returns (uint256 amountOut); + + function exactInput(ExactInputParams calldata params) + external + payable + returns (uint256 amountOut); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IWETH.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IWETH.sol new file mode 100644 index 0000000..ee56ce1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/interfaces/IWETH.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IWETH + * @notice Minimal WETH interface for bridge contracts + */ +interface IWETH { + function deposit() external payable; + function withdraw(uint256) external; + function transfer(address to, uint256 value) external returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/libraries/FraudProofTypes.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/libraries/FraudProofTypes.sol new file mode 100644 index 0000000..24da10c --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/libraries/FraudProofTypes.sol @@ -0,0 +1,242 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title FraudProofTypes + * @notice Library for encoding/decoding fraud proof data + * @dev Defines structures and encoding for different fraud proof types + */ +library FraudProofTypes { + /** + * @notice Fraud proof for non-existent deposit + * @dev Contains Merkle proof showing deposit doesn't exist in source chain state + */ + struct NonExistentDepositProof { + bytes32 stateRoot; // State root from source chain block + bytes32 depositHash; // Hash of deposit data that should exist + bytes32[] merkleProof; // Merkle proof path + bytes32 leftSibling; // Left sibling for non-existence proof + bytes32 rightSibling; // Right sibling for non-existence proof + bytes blockHeader; // Block header from source chain + uint256 blockNumber; // Block number + } + + /** + * @notice Fraud proof for incorrect amount + * @dev Contains proof showing actual deposit amount differs from claimed amount + */ + struct IncorrectAmountProof { + bytes32 stateRoot; // State root from source chain block + bytes32 depositHash; // Hash of actual deposit data + bytes32[] merkleProof; // Merkle proof for actual deposit + uint256 actualAmount; // Actual deposit amount from source chain + bytes blockHeader; // Block header from source chain + uint256 blockNumber; // Block number + } + + /** + * @notice Fraud proof for incorrect recipient + * @dev Contains proof showing actual recipient differs from claimed recipient + */ + struct IncorrectRecipientProof { + bytes32 stateRoot; // State root from source chain block + bytes32 depositHash; // Hash of actual deposit data + bytes32[] merkleProof; // Merkle proof for actual deposit + address actualRecipient; // Actual recipient from source chain + bytes blockHeader; // Block header from source chain + uint256 blockNumber; // Block number + } + + /** + * @notice Fraud proof for double spend + * @dev Contains proof showing deposit was already claimed in another claim + */ + struct DoubleSpendProof { + uint256 previousClaimId; // Deposit ID of previous claim + bytes32 previousClaimHash; // Hash of previous claim + bytes32[] merkleProof; // Merkle proof for previous claim + bytes blockHeader; // Block header from source chain + uint256 blockNumber; // Block number + } + + /** + * @notice Encode NonExistentDepositProof to bytes + */ + function encodeNonExistentDeposit(NonExistentDepositProof memory proof) + internal + pure + returns (bytes memory) + { + return abi.encode( + proof.stateRoot, + proof.depositHash, + proof.merkleProof, + proof.leftSibling, + proof.rightSibling, + proof.blockHeader, + proof.blockNumber + ); + } + + /** + * @notice Decode bytes to NonExistentDepositProof + */ + function decodeNonExistentDeposit(bytes memory data) + internal + pure + returns (NonExistentDepositProof memory) + { + ( + bytes32 stateRoot, + bytes32 depositHash, + bytes32[] memory merkleProof, + bytes32 leftSibling, + bytes32 rightSibling, + bytes memory blockHeader, + uint256 blockNumber + ) = abi.decode(data, (bytes32, bytes32, bytes32[], bytes32, bytes32, bytes, uint256)); + + return NonExistentDepositProof({ + stateRoot: stateRoot, + depositHash: depositHash, + merkleProof: merkleProof, + leftSibling: leftSibling, + rightSibling: rightSibling, + blockHeader: blockHeader, + blockNumber: blockNumber + }); + } + + /** + * @notice Encode IncorrectAmountProof to bytes + */ + function encodeIncorrectAmount(IncorrectAmountProof memory proof) + internal + pure + returns (bytes memory) + { + return abi.encode( + proof.stateRoot, + proof.depositHash, + proof.merkleProof, + proof.actualAmount, + proof.blockHeader, + proof.blockNumber + ); + } + + /** + * @notice Decode bytes to IncorrectAmountProof + */ + function decodeIncorrectAmount(bytes memory data) + internal + pure + returns (IncorrectAmountProof memory) + { + ( + bytes32 stateRoot, + bytes32 depositHash, + bytes32[] memory merkleProof, + uint256 actualAmount, + bytes memory blockHeader, + uint256 blockNumber + ) = abi.decode(data, (bytes32, bytes32, bytes32[], uint256, bytes, uint256)); + + return IncorrectAmountProof({ + stateRoot: stateRoot, + depositHash: depositHash, + merkleProof: merkleProof, + actualAmount: actualAmount, + blockHeader: blockHeader, + blockNumber: blockNumber + }); + } + + /** + * @notice Encode IncorrectRecipientProof to bytes + */ + function encodeIncorrectRecipient(IncorrectRecipientProof memory proof) + internal + pure + returns (bytes memory) + { + return abi.encode( + proof.stateRoot, + proof.depositHash, + proof.merkleProof, + proof.actualRecipient, + proof.blockHeader, + proof.blockNumber + ); + } + + /** + * @notice Decode bytes to IncorrectRecipientProof + */ + function decodeIncorrectRecipient(bytes memory data) + internal + pure + returns (IncorrectRecipientProof memory) + { + ( + bytes32 stateRoot, + bytes32 depositHash, + bytes32[] memory merkleProof, + address actualRecipient, + bytes memory blockHeader, + uint256 blockNumber + ) = abi.decode(data, (bytes32, bytes32, bytes32[], address, bytes, uint256)); + + return IncorrectRecipientProof({ + stateRoot: stateRoot, + depositHash: depositHash, + merkleProof: merkleProof, + actualRecipient: actualRecipient, + blockHeader: blockHeader, + blockNumber: blockNumber + }); + } + + /** + * @notice Encode DoubleSpendProof to bytes + */ + function encodeDoubleSpend(DoubleSpendProof memory proof) + internal + pure + returns (bytes memory) + { + return abi.encode( + proof.previousClaimId, + proof.previousClaimHash, + proof.merkleProof, + proof.blockHeader, + proof.blockNumber + ); + } + + /** + * @notice Decode bytes to DoubleSpendProof + */ + function decodeDoubleSpend(bytes memory data) + internal + pure + returns (DoubleSpendProof memory) + { + ( + uint256 previousClaimId, + bytes32 previousClaimHash, + bytes32[] memory merkleProof, + bytes memory blockHeader, + uint256 blockNumber + ) = abi.decode(data, (uint256, bytes32, bytes32[], bytes, uint256)); + + return DoubleSpendProof({ + previousClaimId: previousClaimId, + previousClaimHash: previousClaimHash, + merkleProof: merkleProof, + blockHeader: blockHeader, + blockNumber: blockNumber + }); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/libraries/MerkleProofVerifier.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/libraries/MerkleProofVerifier.sol new file mode 100644 index 0000000..2babf1d --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/bridge/trustless/libraries/MerkleProofVerifier.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title MerkleProofVerifier + * @notice Library for verifying Merkle proofs for trustless bridge fraud proofs + * @dev Supports verification of deposit existence/non-existence in source chain state + */ +library MerkleProofVerifier { + /** + * @notice Verify a Merkle proof for deposit existence + * @param root Merkle root from source chain state + * @param leaf Deposit data hash (keccak256(abi.encodePacked(depositId, asset, amount, recipient, timestamp))) + * @param proof Merkle proof path + * @return True if proof is valid + */ + function verifyDepositExistence( + bytes32 root, + bytes32 leaf, + bytes32[] memory proof + ) internal pure returns (bool) { + return verify(proof, root, leaf); + } + + /** + * @notice Verify a Merkle proof for deposit non-existence (proof of absence) + * @param root Merkle root from source chain state + * @param leaf Deposit data hash + * @param proof Merkle proof path showing absence + * @param leftSibling Left sibling in the tree (for non-existence proofs) + * @param rightSibling Right sibling in the tree (for non-existence proofs) + * @return True if proof of absence is valid + */ + function verifyDepositNonExistence( + bytes32 root, + bytes32 leaf, + bytes32[] memory proof, + bytes32 leftSibling, + bytes32 rightSibling + ) internal pure returns (bool) { + // For non-existence proofs, we verify that the leaf would be between leftSibling and rightSibling + // and that the proof path shows the leaf doesn't exist + require(leftSibling < leaf && leaf < rightSibling, "MerkleProofVerifier: invalid sibling order"); + + // Verify the proof path + return verify(proof, root, leaf); + } + + /** + * @notice Verify a Merkle proof + * @param proof Array of proof elements + * @param root Merkle root + * @param leaf Leaf hash + * @return True if proof is valid + */ + function verify( + bytes32[] memory proof, + bytes32 root, + bytes32 leaf + ) internal pure returns (bool) { + bytes32 computedHash = leaf; + + for (uint256 i = 0; i < proof.length; i++) { + bytes32 proofElement = proof[i]; + + if (computedHash < proofElement) { + // Hash(current computed hash + current element of the proof) + computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); + } else { + // Hash(current element of the proof + current computed hash) + computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); + } + } + + // Check if the computed hash (root) is equal to the provided root + return computedHash == root; + } + + /** + * @notice Hash deposit data for Merkle tree leaf + * @param depositId Deposit ID + * @param asset Asset address + * @param amount Deposit amount + * @param recipient Recipient address + * @param timestamp Deposit timestamp + * @return Leaf hash + */ + function hashDepositData( + uint256 depositId, + address asset, + uint256 amount, + address recipient, + uint256 timestamp + ) internal pure returns (bytes32) { + return keccak256( + abi.encodePacked( + depositId, + asset, + amount, + recipient, + timestamp + ) + ); + } + + /** + * @notice Verify state root against block header + * @param blockHeader Block header bytes + * @param stateRoot State root to verify + * @return True if state root matches block header + * @dev This is a placeholder - in production, implement full block header parsing + */ + function verifyStateRoot( + bytes memory blockHeader, + bytes32 stateRoot + ) internal pure returns (bool) { + // Placeholder: In production, parse RLP-encoded block header and extract state root + // For now, require non-empty block header + require(blockHeader.length > 0, "MerkleProofVerifier: empty block header"); + + // TODO: Implement RLP decoding and state root extraction + // This would involve: + // 1. RLP decode block header + // 2. Extract state root (at specific position in header) + // 3. Compare with provided state root + + return true; // Placeholder - always return true for now + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/ccip-integration/CCIPLogger.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip-integration/CCIPLogger.sol new file mode 100644 index 0000000..488dd4d --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip-integration/CCIPLogger.sol @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../ccip/IRouterClient.sol"; + +/** + * @title CCIPLogger + * @notice Receives and logs Chain-138 transactions via Chainlink CCIP + * @dev Implements replay protection via batch ID tracking; optional authorized signer for future use + */ +contract CCIPLogger { + IRouterClient public immutable router; + address public authorizedSigner; + uint64 public expectedSourceChainSelector; + address public owner; + + mapping(bytes32 => bool) public processedBatches; + + event RemoteBatchLogged( + bytes32 indexed messageId, + bytes32 indexed batchId, + uint64 sourceChainSelector, + address sender, + bytes32[] txHashes, + address[] froms, + address[] tos, + uint256[] values + ); + event AuthorizedSignerUpdated(address oldSigner, address newSigner); + event SourceChainSelectorUpdated(uint64 oldSelector, uint64 newSelector); + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + modifier onlyRouter() { + require(msg.sender == address(router), "CCIPLogger: only router"); + _; + } + + modifier onlyOwner() { + require(msg.sender == owner, "CCIPLogger: only owner"); + _; + } + + constructor( + address _router, + address _authorizedSigner, + uint64 _expectedSourceChainSelector + ) { + require(_router != address(0), "CCIPLogger: zero router"); + router = IRouterClient(_router); + authorizedSigner = _authorizedSigner; + expectedSourceChainSelector = _expectedSourceChainSelector; + owner = msg.sender; + } + + /** + * @notice Handle CCIP message (called by CCIP Router) + * @param message The received CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRouter { + require( + message.sourceChainSelector == expectedSourceChainSelector, + "CCIPLogger: invalid source chain" + ); + + ( + bytes32 batchId, + bytes32[] memory txHashes, + address[] memory froms, + address[] memory tos, + uint256[] memory values, + bytes memory _extra + ) = abi.decode( + message.data, + (bytes32, bytes32[], address[], address[], uint256[], bytes) + ); + + require(!processedBatches[batchId], "CCIPLogger: batch already processed"); + processedBatches[batchId] = true; + + address sender = message.sender.length >= 20 + ? address(bytes20(message.sender)) + : address(0); + if (message.sender.length == 32) { + sender = address(bytes20(message.sender)); + } + + emit RemoteBatchLogged( + message.messageId, + batchId, + message.sourceChainSelector, + sender, + txHashes, + froms, + tos, + values + ); + } + + function getRouter() external view returns (address) { + return address(router); + } + + function setAuthorizedSigner(address _signer) external onlyOwner { + address old = authorizedSigner; + authorizedSigner = _signer; + emit AuthorizedSignerUpdated(old, _signer); + } + + function setExpectedSourceChainSelector(uint64 _selector) external onlyOwner { + uint64 old = expectedSourceChainSelector; + expectedSourceChainSelector = _selector; + emit SourceChainSelectorUpdated(old, _selector); + } + + function transferOwnership(address newOwner) external onlyOwner { + require(newOwner != address(0), "CCIPLogger: zero address"); + emit OwnershipTransferred(owner, newOwner); + owner = newOwner; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/ccip-integration/CCIPTxReporter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip-integration/CCIPTxReporter.sol new file mode 100644 index 0000000..81e8c81 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip-integration/CCIPTxReporter.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../ccip/IRouterClient.sol"; + +/** + * @title CCIPTxReporter + * @notice Sends Chain-138 transaction reports to Ethereum Mainnet via Chainlink CCIP + * @dev Encodes batch data for CCIPLogger.ccipReceive + */ +contract CCIPTxReporter { + IRouterClient public immutable router; + uint64 public destChainSelector; + address public destReceiver; + address public owner; + + event SingleTxReported(bytes32 indexed txHash, address from, address to, uint256 value); + event BatchReported(bytes32 indexed batchId, uint256 count); + + modifier onlyOwner() { + require(msg.sender == owner, "CCIPTxReporter: only owner"); + _; + } + + constructor( + address _router, + uint64 _destChainSelector, + address _destReceiver + ) { + require(_router != address(0), "CCIPTxReporter: zero router"); + require(_destReceiver != address(0), "CCIPTxReporter: zero receiver"); + router = IRouterClient(payable(_router)); + destChainSelector = _destChainSelector; + destReceiver = _destReceiver; + owner = msg.sender; + } + + /** + * @notice Report a single transaction to the CCIPLogger on destination chain + */ + function reportTx( + bytes32 txHash, + address from, + address to, + uint256 value, + bytes calldata extraData + ) external payable returns (bytes32 messageId) { + bytes32[] memory txHashes = new bytes32[](1); + address[] memory froms = new address[](1); + address[] memory tos = new address[](1); + uint256[] memory values = new uint256[](1); + txHashes[0] = txHash; + froms[0] = from; + tos[0] = to; + values[0] = value; + messageId = _reportBatch(txHash, txHashes, froms, tos, values, extraData); + emit SingleTxReported(txHash, from, to, value); + } + + /** + * @notice Report a batch of transactions to the CCIPLogger on destination chain + */ + function reportBatch( + bytes32 batchId, + bytes32[] calldata txHashes, + address[] calldata froms, + address[] calldata tos, + uint256[] calldata values, + bytes calldata extraData + ) external payable returns (bytes32 messageId) { + messageId = _reportBatch(batchId, txHashes, froms, tos, values, extraData); + emit BatchReported(batchId, txHashes.length); + } + + function _reportBatch( + bytes32 batchId, + bytes32[] memory txHashes, + address[] memory froms, + address[] memory tos, + uint256[] memory values, + bytes memory extraData + ) internal returns (bytes32 messageId) { + bytes memory data = abi.encode( + batchId, + txHashes, + froms, + tos, + values, + extraData + ); + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(destReceiver), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: address(0), + extraArgs: "" + }); + (messageId, ) = router.ccipSend{value: msg.value}(destChainSelector, message); + } + + /** + * @notice Estimate fee for sending a batch + */ + function estimateFee( + bytes32[] calldata txHashes, + address[] calldata froms, + address[] calldata tos, + uint256[] calldata values + ) external view returns (uint256 fee) { + bytes32 batchId = keccak256(abi.encodePacked(block.timestamp, block.prevrandao, txHashes.length)); + bytes memory data = abi.encode( + batchId, + txHashes, + froms, + tos, + values, + bytes("") + ); + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(destReceiver), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: address(0), + extraArgs: "" + }); + return router.getFee(destChainSelector, message); + } + + function setDestReceiver(address _destReceiver) external onlyOwner { + require(_destReceiver != address(0), "CCIPTxReporter: zero address"); + destReceiver = _destReceiver; + } + + function transferOwnership(address newOwner) external onlyOwner { + require(newOwner != address(0), "CCIPTxReporter: zero address"); + owner = newOwner; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPMessageValidator.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPMessageValidator.sol new file mode 100644 index 0000000..c32c9c6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPMessageValidator.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; + +/** + * @title CCIP Message Validator + * @notice Validates CCIP messages for replay protection and format + * @dev Provides message validation utilities + */ +library CCIPMessageValidator { + // Message nonce tracking per source chain + struct MessageNonce { + uint256 nonce; + bool used; + } + + /** + * @notice Validate message format + * @param message The CCIP message to validate + * @return valid True if message format is valid + */ + function validateMessageFormat( + IRouterClient.Any2EVMMessage memory message + ) internal pure returns (bool valid) { + // Check message ID is not zero + if (message.messageId == bytes32(0)) { + return false; + } + + // Check source chain selector is valid + if (message.sourceChainSelector == 0) { + return false; + } + + // Check sender is not empty + if (message.sender.length == 0) { + return false; + } + + // Check data is not empty + if (message.data.length == 0) { + return false; + } + + return true; + } + + /** + * @notice Validate oracle data format + * @param data The encoded oracle data + * @return valid True if data format is valid + * @return answer Decoded answer + * @return roundId Decoded round ID + * @return timestamp Decoded timestamp + */ + function validateOracleData( + bytes memory data + ) internal view returns ( + bool valid, + uint256 answer, + uint256 roundId, + uint256 timestamp + ) { + // Check minimum data length (3 uint256 = 96 bytes) + if (data.length < 96) { + return (false, 0, 0, 0); + } + + // Decode oracle data directly (no need for try-catch in library) + (uint256 _answer, uint256 _roundId, uint256 _timestamp) = abi.decode(data, (uint256, uint256, uint256)); + + // Validate answer is not zero + if (_answer == 0) { + return (false, 0, 0, 0); + } + + // Validate timestamp is reasonable (not too far in future/past) + // Note: Using uint256 to avoid underflow + uint256 currentTime = block.timestamp; + if (_timestamp > currentTime + 300) { + return (false, 0, 0, 0); + } + if (currentTime > _timestamp && currentTime - _timestamp > 3600) { + return (false, 0, 0, 0); + } + + return (true, _answer, _roundId, _timestamp); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPReceiver.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPReceiver.sol new file mode 100644 index 0000000..b957b30 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPReceiver.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "./CCIPMessageValidator.sol"; +import "../oracle/IAggregator.sol"; + +// Note: This contract must be added as a transmitter to the oracle aggregator +// to be able to update oracle answers. The aggregator's updateAnswer function +// requires the caller to be a transmitter. + +/** + * @title CCIP Receiver with Oracle Integration + * @notice Receives CCIP messages and updates oracle aggregator + * @dev Implements CCIP message receiving and oracle update logic with validation + */ +contract CCIPReceiver { + using CCIPMessageValidator for IRouterClient.Any2EVMMessage; + + IRouterClient public immutable router; + address public oracleAggregator; + address public admin; + + mapping(bytes32 => bool) public processedMessages; + mapping(uint64 => uint256) public lastNonce; // Track nonces per source chain + + event MessageReceived( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + bytes data + ); + event OracleUpdated(uint256 answer, uint256 roundId); + event OracleAggregatorUpdated(address oldAggregator, address newAggregator); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPReceiver: only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(router), "CCIPReceiver: only router"); + _; + } + + constructor(address _router, address _oracleAggregator) { + require(_router != address(0), "CCIPReceiver: zero router address"); + require(_oracleAggregator != address(0), "CCIPReceiver: zero aggregator address"); + + router = IRouterClient(_router); + oracleAggregator = _oracleAggregator; + admin = msg.sender; + } + + /** + * @notice Handle CCIP message (called by CCIP Router) + * @param message The received CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRouter { + // Replay protection: check if message already processed + require(!processedMessages[message.messageId], "CCIPReceiver: message already processed"); + + // Validate message format + require( + CCIPMessageValidator.validateMessageFormat(message), + "CCIPReceiver: invalid message format" + ); + + // Validate oracle data format + ( + bool valid, + uint256 answer, + uint256 roundId, + uint256 timestamp + ) = CCIPMessageValidator.validateOracleData(message.data); + + require(valid, "CCIPReceiver: invalid oracle data"); + + // Mark message as processed (replay protection) + processedMessages[message.messageId] = true; + + // Update last nonce for source chain (additional replay protection) + lastNonce[message.sourceChainSelector] = roundId; + + // Update oracle aggregator + // Note: The aggregator's updateAnswer function can be called directly + // The aggregator will handle access control (onlyTransmitter) + // We need to ensure this receiver is added as a transmitter + try IAggregator(oracleAggregator).updateAnswer(answer) { + address sender = abi.decode(message.sender, (address)); + emit MessageReceived(message.messageId, message.sourceChainSelector, sender, message.data); + emit OracleUpdated(answer, roundId); + } catch { + // If update fails, emit error event + // In production, consider adding error tracking + address sender = abi.decode(message.sender, (address)); + emit MessageReceived(message.messageId, message.sourceChainSelector, sender, message.data); + // Don't emit OracleUpdated if update failed + } + } + + /** + * @notice Update oracle aggregator address + */ + function updateOracleAggregator(address newAggregator) external onlyAdmin { + require(newAggregator != address(0), "CCIPReceiver: zero address"); + + address oldAggregator = oracleAggregator; + oracleAggregator = newAggregator; + + emit OracleAggregatorUpdated(oldAggregator, newAggregator); + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPReceiver: zero address"); + admin = newAdmin; + } + + /** + * @notice Check if message has been processed + */ + function isMessageProcessed(bytes32 messageId) external view returns (bool) { + return processedMessages[messageId]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPRouter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPRouter.sol new file mode 100644 index 0000000..fb2c845 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPRouter.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title CCIP Router Implementation + * @notice Full Chainlink CCIP Router interface implementation + * @dev Implements message sending, fee calculation, and message validation + */ +contract CCIPRouter is IRouterClient { + using SafeERC20 for IERC20; + + // Fee token (LINK token address) + address public immutable feeToken; + + // Message tracking + mapping(bytes32 => bool) public sentMessages; + mapping(bytes32 => bool) public receivedMessages; + + // Chain selectors + mapping(uint64 => bool) public supportedChains; + mapping(uint64 => address[]) public supportedTokens; + + // Fee configuration + uint256 public baseFee; // Base fee in feeToken units + uint256 public dataFeePerByte; // Fee per byte of data + + address public admin; + + // Events are inherited from IRouterClient interface + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPRouter: only admin"); + _; + } + + constructor(address _feeToken, uint256 _baseFee, uint256 _dataFeePerByte) { + // Allow zero address for native token fees (ETH) + // If feeToken is zero, fees are paid in native token (msg.value) + feeToken = _feeToken; + baseFee = _baseFee; + dataFeePerByte = _dataFeePerByte; + admin = msg.sender; + } + + /** + * @notice Send a message to a destination chain + * @param destinationChainSelector The chain selector of the destination chain + * @param message The message to send + * @return messageId The ID of the sent message + * @return fees The fees required for the message + */ + function ccipSend( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) external payable returns (bytes32 messageId, uint256 fees) { + require(supportedChains[destinationChainSelector], "CCIPRouter: chain not supported"); + require(message.receiver.length > 0, "CCIPRouter: empty receiver"); + + // Calculate fee + fees = getFee(destinationChainSelector, message); + + // Collect fee + if (fees > 0) { + if (feeToken == address(0)) { + // Native token (ETH) fees + require(msg.value >= fees, "CCIPRouter: insufficient native token fee"); + } else { + // ERC20 token fees + IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fees); + } + } + + // Generate message ID + messageId = keccak256(abi.encodePacked( + block.chainid, + destinationChainSelector, + msg.sender, + message.receiver, + message.data, + block.timestamp, + block.number + )); + + require(!sentMessages[messageId], "CCIPRouter: duplicate message"); + sentMessages[messageId] = true; + + emit MessageSent( + messageId, + destinationChainSelector, + msg.sender, + message.receiver, + message.data, + message.tokenAmounts, + message.feeToken, + message.extraArgs + ); + + return (messageId, fees); + } + + /** + * @notice Get the fee for sending a message + * @param destinationChainSelector The chain selector of the destination chain + * @param message The message to send + * @return fee The fee required for the message + */ + function getFee( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) public view returns (uint256 fee) { + require(supportedChains[destinationChainSelector], "CCIPRouter: chain not supported"); + + // Base fee + fee = baseFee; + + // Data fee (per byte) + fee += message.data.length * dataFeePerByte; + + // Token transfer fees + for (uint256 i = 0; i < message.tokenAmounts.length; i++) { + fee += message.tokenAmounts[i].amount / 1000; // 0.1% of token amount + } + + return fee; + } + + /** + * @notice Get supported tokens for a destination chain + * @param destinationChainSelector The chain selector of the destination chain + * @return tokens The list of supported tokens + */ + function getSupportedTokens( + uint64 destinationChainSelector + ) external view returns (address[] memory tokens) { + return supportedTokens[destinationChainSelector]; + } + + /** + * @notice Add supported chain + */ + function addSupportedChain(uint64 chainSelector) external onlyAdmin { + supportedChains[chainSelector] = true; + } + + /** + * @notice Remove supported chain + */ + function removeSupportedChain(uint64 chainSelector) external onlyAdmin { + supportedChains[chainSelector] = false; + } + + /** + * @notice Add supported token for a chain + */ + function addSupportedToken(uint64 chainSelector, address token) external onlyAdmin { + require(token != address(0), "CCIPRouter: zero token"); + address[] storage tokens = supportedTokens[chainSelector]; + for (uint256 i = 0; i < tokens.length; i++) { + require(tokens[i] != token, "CCIPRouter: token already supported"); + } + tokens.push(token); + } + + /** + * @notice Update fee configuration + */ + function updateFees(uint256 _baseFee, uint256 _dataFeePerByte) external onlyAdmin { + baseFee = _baseFee; + dataFeePerByte = _dataFeePerByte; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPRouter: zero address"); + admin = newAdmin; + } + + /** + * @notice Withdraw collected fees + */ + function withdrawFees(uint256 amount) external onlyAdmin { + if (feeToken == address(0)) { + // Native token (ETH) fees + payable(admin).transfer(amount); + } else { + // ERC20 token fees + IERC20(feeToken).safeTransfer(admin, amount); + } + } + + /** + * @notice Withdraw all native token (ETH) fees + */ + function withdrawNativeFees() external onlyAdmin { + require(feeToken == address(0), "CCIPRouter: not native token"); + payable(admin).transfer(address(this).balance); + } + + /** + * @notice Receive native token (ETH) + */ + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPRouterOptimized.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPRouterOptimized.sol new file mode 100644 index 0000000..f8100d1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPRouterOptimized.sol @@ -0,0 +1,218 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title Optimized CCIP Router + * @notice Optimized version with message batching and fee caching + * @dev Performance optimizations for CCIP message handling + */ +contract CCIPRouterOptimized is IRouterClient { + using SafeERC20 for IERC20; + + address public admin; + uint256 public baseFee = 1 ether; + uint256 public dataFeePerByte = 1000; + uint256 public tokenFeePerToken = 1 ether; + + mapping(uint64 => address[]) public supportedTokens; + + // Fee caching + mapping(bytes32 => uint256) public cachedFees; + uint256 public cacheExpiry = 1 hours; + mapping(bytes32 => uint256) public cacheTimestamp; + + // Message batching + struct BatchedMessage { + bytes32[] messageIds; + uint64 destinationChainSelector; + uint256 totalFee; + uint256 timestamp; + } + + mapping(uint256 => BatchedMessage) public batches; + uint256 public batchId; + uint256 public batchWindow = 5 minutes; + uint256 public maxBatchSize = 100; + + event RouterAdminChanged(address indexed oldAdmin, address indexed newAdmin); + event BaseFeeUpdated(uint256 oldFee, uint256 newFee); + event MessageBatched(uint256 indexed batchId, uint256 messageCount); + event FeeCached(bytes32 indexed cacheKey, uint256 fee); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPRouterOptimized: only admin"); + _; + } + + constructor() { + admin = msg.sender; + } + + /** + * @inheritdoc IRouterClient + */ + function ccipSend( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) external payable returns (bytes32 messageId, uint256 fees) { + fees = getFee(destinationChainSelector, message); + + // Handle fee payment + if (fees > 0) { + if (message.feeToken == address(0)) { + // Native token (ETH) fees + require(msg.value >= fees, "CCIPRouterOptimized: insufficient native token fee"); + } else { + // ERC20 token fees + IERC20(message.feeToken).safeTransferFrom(msg.sender, address(this), fees); + } + } + + messageId = keccak256(abi.encodePacked(block.timestamp, block.number, message.data)); + + emit MessageSent( + messageId, + destinationChainSelector, + msg.sender, + message.receiver, + message.data, + message.tokenAmounts, + message.feeToken, + message.extraArgs + ); + return (messageId, fees); + } + + /** + * @inheritdoc IRouterClient + */ + function getFee( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) public view override returns (uint256 fee) { + // Check cache + bytes32 cacheKey = keccak256(abi.encode(destinationChainSelector, message.receiver, message.data.length)); + if (cacheTimestamp[cacheKey] != 0 && block.timestamp < cacheTimestamp[cacheKey] + cacheExpiry) { + return cachedFees[cacheKey]; + } + + // Calculate fee + fee = baseFee; + fee += uint256(message.data.length) * dataFeePerByte; + + for (uint256 i = 0; i < message.tokenAmounts.length; i++) { + fee += message.tokenAmounts[i].amount * tokenFeePerToken; + } + + return fee; + } + + /** + * @notice Batch multiple messages + */ + function batchSend( + uint64 destinationChainSelector, + EVM2AnyMessage[] memory messages + ) external payable returns (uint256 batchId_, bytes32[] memory messageIds) { + require(messages.length <= maxBatchSize, "CCIPRouterOptimized: batch too large"); + + batchId_ = batchId++; + messageIds = new bytes32[](messages.length); + uint256 totalFee = 0; + + for (uint256 i = 0; i < messages.length; i++) { + uint256 fee = getFee(destinationChainSelector, messages[i]); + totalFee += fee; + + bytes32 messageId = keccak256(abi.encodePacked(block.timestamp, block.number, i, messages[i].data)); + messageIds[i] = messageId; + } + + require(msg.value >= totalFee, "CCIPRouterOptimized: insufficient fee"); + + batches[batchId_] = BatchedMessage({ + messageIds: messageIds, + destinationChainSelector: destinationChainSelector, + totalFee: totalFee, + timestamp: block.timestamp + }); + + emit MessageBatched(batchId_, messages.length); + return (batchId_, messageIds); + } + + /** + * @notice Cache fee calculation + */ + function cacheFee( + uint64 destinationChainSelector, + bytes memory receiver, + uint256 dataLength + ) external returns (uint256 fee) { + bytes32 cacheKey = keccak256(abi.encode(destinationChainSelector, receiver, dataLength)); + + // Calculate fee + fee = baseFee + (dataLength * dataFeePerByte); + + // Cache it + cachedFees[cacheKey] = fee; + cacheTimestamp[cacheKey] = block.timestamp; + + emit FeeCached(cacheKey, fee); + return fee; + } + + /** + * @inheritdoc IRouterClient + */ + function getSupportedTokens( + uint64 destinationChainSelector + ) external view override returns (address[] memory) { + return supportedTokens[destinationChainSelector]; + } + + /** + * @notice Update base fee + */ + function updateBaseFee(uint256 newFee) external onlyAdmin { + require(newFee > 0, "CCIPRouterOptimized: fee must be greater than 0"); + emit BaseFeeUpdated(baseFee, newFee); + baseFee = newFee; + } + + /** + * @notice Update cache expiry + */ + function setCacheExpiry(uint256 newExpiry) external onlyAdmin { + cacheExpiry = newExpiry; + } + + /** + * @notice Update batch window + */ + function setBatchWindow(uint256 newWindow) external onlyAdmin { + batchWindow = newWindow; + } + + /** + * @notice Update max batch size + */ + function setMaxBatchSize(uint256 newSize) external onlyAdmin { + require(newSize > 0, "CCIPRouterOptimized: size must be greater than 0"); + maxBatchSize = newSize; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPRouterOptimized: zero address"); + emit RouterAdminChanged(admin, newAdmin); + admin = newAdmin; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPSender.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPSender.sol new file mode 100644 index 0000000..302c9a1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPSender.sol @@ -0,0 +1,221 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title CCIP Sender + * @notice Chainlink CCIP sender for cross-chain oracle data transmission + * @dev Sends oracle updates to other chains via CCIP + */ +contract CCIPSender { + using SafeERC20 for IERC20; + + IRouterClient public immutable ccipRouter; + address public oracleAggregator; + address public admin; + address public feeToken; // LINK token address + + // Destination chain configurations + struct DestinationChain { + uint64 chainSelector; + address receiver; + bool enabled; + } + + mapping(uint64 => DestinationChain) public destinations; + uint64[] public destinationChains; + + event MessageSent( + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + bytes data + ); + event DestinationAdded(uint64 chainSelector, address receiver); + event DestinationRemoved(uint64 chainSelector); + event DestinationUpdated(uint64 chainSelector, address receiver); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPSender: only admin"); + _; + } + + modifier onlyAggregator() { + require(msg.sender == oracleAggregator, "CCIPSender: only aggregator"); + _; + } + + constructor(address _ccipRouter, address _oracleAggregator, address _feeToken) { + require(_ccipRouter != address(0), "CCIPSender: zero router"); + // Allow zero address for native token fees (ETH) + // If feeToken is zero, fees are paid in native token (msg.value) + ccipRouter = IRouterClient(_ccipRouter); + oracleAggregator = _oracleAggregator; + feeToken = _feeToken; + admin = msg.sender; + } + + /** + * @notice Send oracle update to destination chain + * @dev Implements full CCIP interface with fee payment + */ + function sendOracleUpdate( + uint64 destinationChainSelector, + uint256 answer, + uint256 roundId, + uint256 timestamp + ) external payable onlyAggregator returns (bytes32 messageId) { + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPSender: destination not enabled"); + + // Encode oracle data (answer, roundId, timestamp) + bytes memory data = abi.encode(answer, roundId, timestamp); + + // Prepare CCIP message + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiver), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: feeToken, + extraArgs: "" + }); + + // Calculate fee + uint256 fee = ccipRouter.getFee(destinationChainSelector, message); + + // Approve and pay fee + if (fee > 0) { + if (feeToken == address(0)) { + // Native token (ETH) fees - require msg.value + require(msg.value >= fee, "CCIPSender: insufficient native token fee"); + } else { + // ERC20 token fees + IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); + // Use safeIncreaseAllowance instead of deprecated safeApprove + SafeERC20.safeIncreaseAllowance(IERC20(feeToken), address(ccipRouter), fee); + } + } + + // Send via CCIP + if (feeToken == address(0)) { + // Native token fees - send with msg.value + (messageId, ) = ccipRouter.ccipSend{value: fee}(destinationChainSelector, message); + } else { + // ERC20 token fees + (messageId, ) = ccipRouter.ccipSend(destinationChainSelector, message); + } + + emit MessageSent(messageId, destinationChainSelector, dest.receiver, data); + return messageId; + } + + /** + * @notice Calculate fee for sending oracle update + */ + function calculateFee( + uint64 destinationChainSelector, + bytes memory data + ) external view returns (uint256) { + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPSender: destination not enabled"); + + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiver), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: feeToken, + extraArgs: "" + }); + + return ccipRouter.getFee(destinationChainSelector, message); + } + + /** + * @notice Add destination chain + */ + function addDestination( + uint64 chainSelector, + address receiver + ) external onlyAdmin { + require(receiver != address(0), "CCIPSender: zero address"); + require(!destinations[chainSelector].enabled, "CCIPSender: destination already exists"); + + destinations[chainSelector] = DestinationChain({ + chainSelector: chainSelector, + receiver: receiver, + enabled: true + }); + destinationChains.push(chainSelector); + + emit DestinationAdded(chainSelector, receiver); + } + + /** + * @notice Remove destination chain + */ + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPSender: destination not found"); + destinations[chainSelector].enabled = false; + + // Remove from array + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + + emit DestinationRemoved(chainSelector); + } + + /** + * @notice Update destination receiver + */ + function updateDestination( + uint64 chainSelector, + address receiver + ) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPSender: destination not found"); + require(receiver != address(0), "CCIPSender: zero address"); + + destinations[chainSelector].receiver = receiver; + emit DestinationUpdated(chainSelector, receiver); + } + + /** + * @notice Update fee token + * @dev Allows zero address for native token fees (ETH) + */ + function updateFeeToken(address newFeeToken) external onlyAdmin { + // Allow zero address for native token fees + feeToken = newFeeToken; + } + + /** + * @notice Update oracle aggregator + */ + function updateOracleAggregator(address newAggregator) external onlyAdmin { + require(newAggregator != address(0), "CCIPSender: zero address"); + oracleAggregator = newAggregator; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPSender: zero address"); + admin = newAdmin; + } + + /** + * @notice Get destination chains + */ + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPWETH10Bridge.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPWETH10Bridge.sol new file mode 100644 index 0000000..6c68f31 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPWETH10Bridge.sol @@ -0,0 +1,301 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title CCIP WETH10 Bridge + * @notice Cross-chain WETH10 transfer bridge using Chainlink CCIP + * @dev Enables users to send WETH10 tokens across chains via CCIP + */ +contract CCIPWETH10Bridge { + + IRouterClient public immutable ccipRouter; + address public immutable weth10; // WETH10 contract address + address public feeToken; // LINK token address + address public admin; + + // Destination chain configurations + struct DestinationChain { + uint64 chainSelector; + address receiverBridge; // Address of corresponding bridge on destination chain + bool enabled; + } + + mapping(uint64 => DestinationChain) public destinations; + uint64[] public destinationChains; + + // Track cross-chain transfers for replay protection + mapping(bytes32 => bool) public processedTransfers; + mapping(address => uint256) public nonces; + + event CrossChainTransferInitiated( + bytes32 indexed messageId, + address indexed sender, + uint64 indexed destinationChainSelector, + address recipient, + uint256 amount, + uint256 nonce + ); + + event CrossChainTransferCompleted( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed recipient, + uint256 amount + ); + + event DestinationAdded(uint64 chainSelector, address receiverBridge); + event DestinationRemoved(uint64 chainSelector); + event DestinationUpdated(uint64 chainSelector, address receiverBridge); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPWETH10Bridge: only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(ccipRouter), "CCIPWETH10Bridge: only router"); + _; + } + + constructor(address _ccipRouter, address _weth10, address _feeToken) { + require(_ccipRouter != address(0), "CCIPWETH10Bridge: zero router"); + require(_weth10 != address(0), "CCIPWETH10Bridge: zero WETH10"); + require(_feeToken != address(0), "CCIPWETH10Bridge: zero fee token"); + + ccipRouter = IRouterClient(_ccipRouter); + weth10 = _weth10; + feeToken = _feeToken; + admin = msg.sender; + } + + /** + * @notice Send WETH10 tokens to another chain via CCIP + * @param destinationChainSelector The chain selector of the destination chain + * @param recipient The recipient address on the destination chain + * @param amount The amount of WETH10 to send + * @return messageId The CCIP message ID + */ + function sendCrossChain( + uint64 destinationChainSelector, + address recipient, + uint256 amount + ) external returns (bytes32 messageId) { + require(amount > 0, "CCIPWETH10Bridge: invalid amount"); + require(recipient != address(0), "CCIPWETH10Bridge: zero recipient"); + + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH10Bridge: destination not enabled"); + + // Transfer WETH10 from user + require(IERC20(weth10).transferFrom(msg.sender, address(this), amount), "CCIPWETH10Bridge: transfer failed"); + + // Increment nonce for replay protection + nonces[msg.sender]++; + uint256 currentNonce = nonces[msg.sender]; + + // Encode transfer data (recipient, amount, sender, nonce) + bytes memory data = abi.encode( + recipient, + amount, + msg.sender, + currentNonce + ); + + // Prepare CCIP message with WETH10 tokens + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + // Set token amount (WETH10) + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth10, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + // Calculate fee + uint256 fee = ccipRouter.getFee(destinationChainSelector, message); + + // Approve and pay fee + if (fee > 0) { + require(IERC20(feeToken).transferFrom(msg.sender, address(this), fee), "CCIPWETH10Bridge: fee transfer failed"); + require(IERC20(feeToken).approve(address(ccipRouter), fee), "CCIPWETH10Bridge: fee approval failed"); + } + + // Send via CCIP + (messageId, ) = ccipRouter.ccipSend(destinationChainSelector, message); + + emit CrossChainTransferInitiated( + messageId, + msg.sender, + destinationChainSelector, + recipient, + amount, + currentNonce + ); + + return messageId; + } + + /** + * @notice Receive WETH10 tokens from another chain via CCIP + * @param message The CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRouter { + // Replay protection: check if message already processed + require(!processedTransfers[message.messageId], "CCIPWETH10Bridge: transfer already processed"); + + // Mark as processed + processedTransfers[message.messageId] = true; + + // Validate token amounts + require(message.tokenAmounts.length > 0, "CCIPWETH10Bridge: no tokens"); + require(message.tokenAmounts[0].token == weth10, "CCIPWETH10Bridge: invalid token"); + + uint256 amount = message.tokenAmounts[0].amount; + require(amount > 0, "CCIPWETH10Bridge: invalid amount"); + + // Decode transfer data (recipient, amount, sender, nonce) + (address recipient, , , ) = abi.decode( + message.data, + (address, uint256, address, uint256) + ); + + require(recipient != address(0), "CCIPWETH10Bridge: zero recipient"); + + // Transfer WETH10 to recipient + require(IERC20(weth10).transfer(recipient, amount), "CCIPWETH10Bridge: transfer failed"); + + emit CrossChainTransferCompleted( + message.messageId, + message.sourceChainSelector, + recipient, + amount + ); + } + + /** + * @notice Calculate fee for cross-chain transfer + * @param destinationChainSelector The chain selector of the destination chain + * @param amount The amount of WETH10 to send + * @return fee The fee required for the transfer + */ + function calculateFee( + uint64 destinationChainSelector, + uint256 amount + ) external view returns (uint256 fee) { + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH10Bridge: destination not enabled"); + + bytes memory data = abi.encode(address(0), amount, address(0), 0); + + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth10, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + return ccipRouter.getFee(destinationChainSelector, message); + } + + /** + * @notice Add destination chain + */ + function addDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(receiverBridge != address(0), "CCIPWETH10Bridge: zero address"); + require(!destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination already exists"); + + destinations[chainSelector] = DestinationChain({ + chainSelector: chainSelector, + receiverBridge: receiverBridge, + enabled: true + }); + destinationChains.push(chainSelector); + + emit DestinationAdded(chainSelector, receiverBridge); + } + + /** + * @notice Remove destination chain + */ + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination not found"); + destinations[chainSelector].enabled = false; + + // Remove from array + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + + emit DestinationRemoved(chainSelector); + } + + /** + * @notice Update destination receiver bridge + */ + function updateDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination not found"); + require(receiverBridge != address(0), "CCIPWETH10Bridge: zero address"); + + destinations[chainSelector].receiverBridge = receiverBridge; + emit DestinationUpdated(chainSelector, receiverBridge); + } + + /** + * @notice Update fee token + */ + function updateFeeToken(address newFeeToken) external onlyAdmin { + require(newFeeToken != address(0), "CCIPWETH10Bridge: zero address"); + feeToken = newFeeToken; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPWETH10Bridge: zero address"); + admin = newAdmin; + } + + /** + * @notice Get destination chains + */ + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } + + /** + * @notice Get user nonce + */ + function getUserNonce(address user) external view returns (uint256) { + return nonces[user]; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPWETH9Bridge.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPWETH9Bridge.sol new file mode 100644 index 0000000..4e01b3b --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/CCIPWETH9Bridge.sol @@ -0,0 +1,309 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title CCIP WETH9 Bridge + * @notice Cross-chain WETH9 transfer bridge using Chainlink CCIP + * @dev Enables users to send WETH9 tokens across chains via CCIP + */ +contract CCIPWETH9Bridge { + + IRouterClient public immutable ccipRouter; + address public immutable weth9; // WETH9 contract address + address public feeToken; // LINK token address + address public admin; + + // Destination chain configurations + struct DestinationChain { + uint64 chainSelector; + address receiverBridge; // Address of corresponding bridge on destination chain + bool enabled; + } + + mapping(uint64 => DestinationChain) public destinations; + uint64[] public destinationChains; + + // Track cross-chain transfers for replay protection + mapping(bytes32 => bool) public processedTransfers; + mapping(address => uint256) public nonces; + + event CrossChainTransferInitiated( + bytes32 indexed messageId, + address indexed sender, + uint64 indexed destinationChainSelector, + address recipient, + uint256 amount, + uint256 nonce + ); + + event CrossChainTransferCompleted( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed recipient, + uint256 amount + ); + + event DestinationAdded(uint64 chainSelector, address receiverBridge); + event DestinationRemoved(uint64 chainSelector); + event DestinationUpdated(uint64 chainSelector, address receiverBridge); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPWETH9Bridge: only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(ccipRouter), "CCIPWETH9Bridge: only router"); + _; + } + + constructor(address _ccipRouter, address _weth9, address _feeToken) { + require(_ccipRouter != address(0), "CCIPWETH9Bridge: zero router"); + require(_weth9 != address(0), "CCIPWETH9Bridge: zero WETH9"); + // feeToken may be address(0) to pay fees in native ETH (msg.value) + ccipRouter = IRouterClient(_ccipRouter); + weth9 = _weth9; + feeToken = _feeToken; + admin = msg.sender; + } + + /** + * @notice Send WETH9 tokens to another chain via CCIP + * @param destinationChainSelector The chain selector of the destination chain + * @param recipient The recipient address on the destination chain + * @param amount The amount of WETH9 to send + * @return messageId The CCIP message ID + */ + function sendCrossChain( + uint64 destinationChainSelector, + address recipient, + uint256 amount + ) external payable returns (bytes32 messageId) { + require(amount > 0, "CCIPWETH9Bridge: invalid amount"); + require(recipient != address(0), "CCIPWETH9Bridge: zero recipient"); + + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH9Bridge: destination not enabled"); + + // Transfer WETH9 from user + require(IERC20(weth9).transferFrom(msg.sender, address(this), amount), "CCIPWETH9Bridge: transfer failed"); + + // Increment nonce for replay protection + nonces[msg.sender]++; + uint256 currentNonce = nonces[msg.sender]; + + // Encode transfer data (recipient, amount, sender, nonce) + bytes memory data = abi.encode( + recipient, + amount, + msg.sender, + currentNonce + ); + + // Prepare CCIP message with WETH9 tokens + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + // Set token amount (WETH9) + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth9, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + // Calculate fee + uint256 fee = ccipRouter.getFee(destinationChainSelector, message); + + // Pay fee: native ETH if feeToken is address(0), else LINK/ERC20 + if (fee > 0) { + if (feeToken == address(0)) { + require(msg.value >= fee, "CCIPWETH9Bridge: insufficient native fee"); + } else { + require(msg.value == 0, "CCIPWETH9Bridge: use native or token fee, not both"); + require(IERC20(feeToken).transferFrom(msg.sender, address(this), fee), "CCIPWETH9Bridge: fee transfer failed"); + require(IERC20(feeToken).approve(address(ccipRouter), fee), "CCIPWETH9Bridge: fee approval failed"); + } + } + + // Send via CCIP (pass value when paying in native) + if (feeToken == address(0) && fee > 0) { + (messageId, ) = ccipRouter.ccipSend{value: fee}(destinationChainSelector, message); + } else { + (messageId, ) = ccipRouter.ccipSend(destinationChainSelector, message); + } + + emit CrossChainTransferInitiated( + messageId, + msg.sender, + destinationChainSelector, + recipient, + amount, + currentNonce + ); + + return messageId; + } + + /** + * @notice Receive WETH9 tokens from another chain via CCIP + * @param message The CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRouter { + // Replay protection: check if message already processed + require(!processedTransfers[message.messageId], "CCIPWETH9Bridge: transfer already processed"); + + // Mark as processed + processedTransfers[message.messageId] = true; + + // Validate token amounts + require(message.tokenAmounts.length > 0, "CCIPWETH9Bridge: no tokens"); + require(message.tokenAmounts[0].token == weth9, "CCIPWETH9Bridge: invalid token"); + + uint256 amount = message.tokenAmounts[0].amount; + require(amount > 0, "CCIPWETH9Bridge: invalid amount"); + + // Decode transfer data (recipient, amount, sender, nonce) + (address recipient, , , ) = abi.decode( + message.data, + (address, uint256, address, uint256) + ); + + require(recipient != address(0), "CCIPWETH9Bridge: zero recipient"); + + // Transfer WETH9 to recipient + require(IERC20(weth9).transfer(recipient, amount), "CCIPWETH9Bridge: transfer failed"); + + emit CrossChainTransferCompleted( + message.messageId, + message.sourceChainSelector, + recipient, + amount + ); + } + + /** + * @notice Calculate fee for cross-chain transfer + * @param destinationChainSelector The chain selector of the destination chain + * @param amount The amount of WETH9 to send + * @return fee The fee required for the transfer + */ + function calculateFee( + uint64 destinationChainSelector, + uint256 amount + ) external view returns (uint256 fee) { + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH9Bridge: destination not enabled"); + + bytes memory data = abi.encode(address(0), amount, address(0), 0); + + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth9, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + return ccipRouter.getFee(destinationChainSelector, message); + } + + /** + * @notice Add destination chain + */ + function addDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(receiverBridge != address(0), "CCIPWETH9Bridge: zero address"); + require(!destinations[chainSelector].enabled, "CCIPWETH9Bridge: destination already exists"); + + destinations[chainSelector] = DestinationChain({ + chainSelector: chainSelector, + receiverBridge: receiverBridge, + enabled: true + }); + destinationChains.push(chainSelector); + + emit DestinationAdded(chainSelector, receiverBridge); + } + + /** + * @notice Remove destination chain + */ + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH9Bridge: destination not found"); + destinations[chainSelector].enabled = false; + + // Remove from array + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + + emit DestinationRemoved(chainSelector); + } + + /** + * @notice Update destination receiver bridge + */ + function updateDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH9Bridge: destination not found"); + require(receiverBridge != address(0), "CCIPWETH9Bridge: zero address"); + + destinations[chainSelector].receiverBridge = receiverBridge; + emit DestinationUpdated(chainSelector, receiverBridge); + } + + /** + * @notice Update fee token + */ + function updateFeeToken(address newFeeToken) external onlyAdmin { + // address(0) = pay fees in native ETH via msg.value + feeToken = newFeeToken; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPWETH9Bridge: zero address"); + admin = newAdmin; + } + + /** + * @notice Get destination chains + */ + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } + + /** + * @notice Get user nonce + */ + function getUserNonce(address user) external view returns (uint256) { + return nonces[user]; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/IRouterClient.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/IRouterClient.sol new file mode 100644 index 0000000..ae7c127 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/ccip/IRouterClient.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Chainlink CCIP Router Client Interface + * @notice Interface for Chainlink CCIP Router Client + * @dev This interface is based on Chainlink CCIP Router Client specification + */ +interface IRouterClient { + /// @notice Represents the router's fee token + enum TokenAmountType { + Fiat, + Native + } + + /// @notice Represents a token amount and its type + struct TokenAmount { + address token; + uint256 amount; + TokenAmountType amountType; + } + + /// @notice Represents a CCIP message + struct EVM2AnyMessage { + bytes receiver; + bytes data; + TokenAmount[] tokenAmounts; + address feeToken; + bytes extraArgs; + } + + /// @notice Represents a CCIP message with source chain information + struct Any2EVMMessage { + bytes32 messageId; + uint64 sourceChainSelector; + bytes sender; + bytes data; + TokenAmount[] tokenAmounts; + } + + /// @notice Emitted when a message is sent + event MessageSent( + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address indexed sender, + bytes receiver, + bytes data, + TokenAmount[] tokenAmounts, + address feeToken, + bytes extraArgs + ); + + /// @notice Emitted when a message is received + event MessageReceived( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed sender, + bytes data, + TokenAmount[] tokenAmounts + ); + + /// @notice Sends a message to a destination chain + /// @param destinationChainSelector The chain selector of the destination chain + /// @param message The message to send + /// @return messageId The ID of the sent message + /// @return fees The fees required for the message + /// @dev If feeToken is zero address, fees are paid in native token (ETH) via msg.value + function ccipSend( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) external payable returns (bytes32 messageId, uint256 fees); + + /// @notice Gets the fee for sending a message + /// @param destinationChainSelector The chain selector of the destination chain + /// @param message The message to send + /// @return fee The fee required for the message + function getFee( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) external view returns (uint256 fee); + + /// @notice Gets the supported tokens for a destination chain + /// @param destinationChainSelector The chain selector of the destination chain + /// @return tokens The list of supported tokens + function getSupportedTokens( + uint64 destinationChainSelector + ) external view returns (address[] memory tokens); +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/channels/GenericStateChannelManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/channels/GenericStateChannelManager.sol new file mode 100644 index 0000000..b374dc6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/channels/GenericStateChannelManager.sol @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {IGenericStateChannelManager} from "./IGenericStateChannelManager.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/** + * @title GenericStateChannelManager + * @notice State channels with committed stateHash: open, fund, close with (stateHash, balanceA, balanceB, nonce). stateHash attests to arbitrary off-chain state (e.g. game, attestation). + * @dev Same lifecycle as PaymentChannelManager; close/submit/challenge include stateHash so settlement commits to agreed state. + */ +contract GenericStateChannelManager is IGenericStateChannelManager, ReentrancyGuard { + address public admin; + bool public paused; + + uint256 public challengeWindowSeconds; + + uint256 private _nextChannelId; + mapping(uint256 => Channel) private _channels; + uint256[] private _channelIds; + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin, uint256 _challengeWindowSeconds) { + require(_admin != address(0), "zero admin"); + require(_challengeWindowSeconds > 0, "zero challenge window"); + admin = _admin; + challengeWindowSeconds = _challengeWindowSeconds; + } + + function openChannel(address participantB) external payable whenNotPaused returns (uint256 channelId) { + require(participantB != address(0), "zero participant"); + require(participantB != msg.sender, "self channel"); + require(msg.value > 0, "zero deposit"); + + channelId = _nextChannelId++; + _channels[channelId] = Channel({ + participantA: msg.sender, + participantB: participantB, + depositA: msg.value, + depositB: 0, + status: ChannelStatus.Open, + disputeNonce: 0, + disputeStateHash: bytes32(0), + disputeBalanceA: 0, + disputeBalanceB: 0, + disputeDeadline: 0 + }); + _channelIds.push(channelId); + emit ChannelOpened(channelId, msg.sender, participantB, msg.value, 0); + return channelId; + } + + function fundChannel(uint256 channelId) external payable whenNotPaused { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open, "not open"); + require(ch.depositB == 0, "already funded"); + require(msg.sender == ch.participantB, "not participant B"); + require(msg.value > 0, "zero deposit"); + ch.depositB = msg.value; + emit ChannelOpened(channelId, ch.participantA, ch.participantB, ch.depositA, ch.depositB); + } + + function closeChannelCooperative( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external nonReentrant { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open, "not open"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + _verifySignatures(channelId, stateHash, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + ch.status = ChannelStatus.Closed; + _transfer(ch.participantA, balanceA); + _transfer(ch.participantB, balanceB); + emit ChannelClosed(channelId, stateHash, balanceA, balanceB, true); + } + + function submitClose( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open || ch.status == ChannelStatus.Dispute, "wrong status"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + _verifySignatures(channelId, stateHash, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + if (ch.status == ChannelStatus.Open) { + ch.status = ChannelStatus.Dispute; + } else { + require(nonce > ch.disputeNonce, "older state"); + } + ch.disputeNonce = nonce; + ch.disputeStateHash = stateHash; + ch.disputeBalanceA = balanceA; + ch.disputeBalanceB = balanceB; + ch.disputeDeadline = block.timestamp + challengeWindowSeconds; + emit ChallengeSubmitted(channelId, nonce, stateHash, balanceA, balanceB, ch.disputeDeadline); + } + + function challengeClose( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Dispute, "not in dispute"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + require(nonce > ch.disputeNonce, "not newer"); + _verifySignatures(channelId, stateHash, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + ch.disputeNonce = nonce; + ch.disputeStateHash = stateHash; + ch.disputeBalanceA = balanceA; + ch.disputeBalanceB = balanceB; + ch.disputeDeadline = block.timestamp + challengeWindowSeconds; + emit ChallengeSubmitted(channelId, nonce, stateHash, balanceA, balanceB, ch.disputeDeadline); + } + + function finalizeClose(uint256 channelId) external nonReentrant { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Dispute, "not in dispute"); + require(block.timestamp >= ch.disputeDeadline, "window open"); + ch.status = ChannelStatus.Closed; + _transfer(ch.participantA, ch.disputeBalanceA); + _transfer(ch.participantB, ch.disputeBalanceB); + emit ChannelClosed(channelId, ch.disputeStateHash, ch.disputeBalanceA, ch.disputeBalanceB, false); + } + + function getChannel(uint256 channelId) external view returns (Channel memory) { + return _channels[channelId]; + } + + function getChannelCount() external view returns (uint256) { + return _channelIds.length; + } + + function getChannelId(address participantA, address participantB) external view returns (uint256) { + for (uint256 i = 0; i < _channelIds.length; i++) { + Channel storage ch = _channels[_channelIds[i]]; + if ( + (ch.participantA == participantA && ch.participantB == participantB) || + (ch.participantA == participantB && ch.participantB == participantA) + ) { + if (ch.status == ChannelStatus.Open || ch.status == ChannelStatus.Dispute) { + return _channelIds[i]; + } + } + } + return 0; + } + + function getChannelIdByIndex(uint256 index) external view returns (uint256) { + require(index < _channelIds.length, "out of bounds"); + return _channelIds[index]; + } + + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function setChallengeWindow(uint256 newWindow) external onlyAdmin { + require(newWindow > 0, "zero window"); + uint256 old = challengeWindowSeconds; + challengeWindowSeconds = newWindow; + emit ChallengeWindowUpdated(old, newWindow); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } + + function _verifySignatures( + uint256 channelId, + bytes32 stateHash, + address participantA, + address participantB, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) internal pure { + bytes32 stateHashInner = keccak256(abi.encodePacked(channelId, stateHash, nonce, balanceA, balanceB)); + bytes32 ethSigned = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", stateHashInner)); + address signerA = ECDSA.recover(ethSigned, vA, rA, sA); + address signerB = ECDSA.recover(ethSigned, vB, rB, sB); + require(signerA == participantA && signerB == participantB, "invalid sigs"); + } + + function _transfer(address to, uint256 amount) internal { + if (amount > 0) { + (bool ok,) = payable(to).call{value: amount}(""); + require(ok, "transfer failed"); + } + } + + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/channels/IGenericStateChannelManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/channels/IGenericStateChannelManager.sol new file mode 100644 index 0000000..46bf7cd --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/channels/IGenericStateChannelManager.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IGenericStateChannelManager + * @notice State channels with committed stateHash: same as payment channels but settlement attests to an arbitrary stateHash (e.g. game result, attestation). + */ +interface IGenericStateChannelManager { + enum ChannelStatus { + None, + Open, + Dispute, + Closed + } + + struct Channel { + address participantA; + address participantB; + uint256 depositA; + uint256 depositB; + ChannelStatus status; + uint256 disputeNonce; + bytes32 disputeStateHash; + uint256 disputeBalanceA; + uint256 disputeBalanceB; + uint256 disputeDeadline; + } + + event ChannelOpened( + uint256 indexed channelId, + address indexed participantA, + address indexed participantB, + uint256 depositA, + uint256 depositB + ); + + event ChannelClosed( + uint256 indexed channelId, + bytes32 stateHash, + uint256 balanceA, + uint256 balanceB, + bool cooperative + ); + + event ChallengeSubmitted( + uint256 indexed channelId, + uint256 nonce, + bytes32 stateHash, + uint256 balanceA, + uint256 balanceB, + uint256 newDeadline + ); + + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + event ChallengeWindowUpdated(uint256 oldWindow, uint256 newWindow); + + function openChannel(address participantB) external payable returns (uint256 channelId); + function fundChannel(uint256 channelId) external payable; + + function closeChannelCooperative( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function submitClose( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function challengeClose( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function finalizeClose(uint256 channelId) external; + + function getChannel(uint256 channelId) external view returns (Channel memory); + function getChannelCount() external view returns (uint256); + function getChannelId(address participantA, address participantB) external view returns (uint256); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/channels/IPaymentChannelManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/channels/IPaymentChannelManager.sol new file mode 100644 index 0000000..7e89621 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/channels/IPaymentChannelManager.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IPaymentChannelManager + * @notice Interface for payment channel manager (open, update state, cooperative/unilateral close, challenge) + */ +interface IPaymentChannelManager { + enum ChannelStatus { + None, + Open, + Dispute, + Closed + } + + struct Channel { + address participantA; + address participantB; + uint256 depositA; + uint256 depositB; + ChannelStatus status; + uint256 disputeNonce; + uint256 disputeBalanceA; + uint256 disputeBalanceB; + uint256 disputeDeadline; + } + + event ChannelOpened( + uint256 indexed channelId, + address indexed participantA, + address indexed participantB, + uint256 depositA, + uint256 depositB + ); + + event ChannelClosed( + uint256 indexed channelId, + uint256 balanceA, + uint256 balanceB, + bool cooperative + ); + + event ChallengeSubmitted( + uint256 indexed channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint256 newDeadline + ); + + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + event ChallengeWindowUpdated(uint256 oldWindow, uint256 newWindow); + + function openChannel(address participantB) external payable returns (uint256 channelId); + function fundChannel(uint256 channelId) external payable; + + function closeChannelCooperative( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function submitClose( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function challengeClose( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function finalizeClose(uint256 channelId) external; + + function getChannel(uint256 channelId) external view returns (Channel memory); + function getChannelCount() external view returns (uint256); + function getChannelId(address participantA, address participantB) external view returns (uint256); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/channels/PaymentChannelManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/channels/PaymentChannelManager.sol new file mode 100644 index 0000000..d3fe64c --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/channels/PaymentChannelManager.sol @@ -0,0 +1,263 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {IPaymentChannelManager} from "./IPaymentChannelManager.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/** + * @title PaymentChannelManager + * @notice Manages payment channels: open, cooperative/unilateral close, challenge window (newest state wins). + * @dev Deployable on both Mainnet and Chain-138. Holds ETH; no ERC20 in v1. + */ +contract PaymentChannelManager is IPaymentChannelManager, ReentrancyGuard { + address public admin; + bool public paused; + + /// Challenge period in seconds (e.g. 24h = 86400) + uint256 public challengeWindowSeconds; + + uint256 private _nextChannelId; + mapping(uint256 => Channel) private _channels; + + /// For enumeration + uint256[] private _channelIds; + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin, uint256 _challengeWindowSeconds) { + require(_admin != address(0), "zero admin"); + require(_challengeWindowSeconds > 0, "zero challenge window"); + admin = _admin; + challengeWindowSeconds = _challengeWindowSeconds; + } + + /// @inheritdoc IPaymentChannelManager + function openChannel(address participantB) external payable whenNotPaused returns (uint256 channelId) { + require(participantB != address(0), "zero participant"); + require(participantB != msg.sender, "self channel"); + require(msg.value > 0, "zero deposit"); + + channelId = _nextChannelId++; + _channels[channelId] = Channel({ + participantA: msg.sender, + participantB: participantB, + depositA: msg.value, + depositB: 0, + status: ChannelStatus.Open, + disputeNonce: 0, + disputeBalanceA: 0, + disputeBalanceB: 0, + disputeDeadline: 0 + }); + _channelIds.push(channelId); + + emit ChannelOpened(channelId, msg.sender, participantB, msg.value, 0); + return channelId; + } + + /// @inheritdoc IPaymentChannelManager + function fundChannel(uint256 channelId) external payable whenNotPaused { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open, "not open"); + require(ch.depositB == 0, "already funded"); + require(msg.sender == ch.participantB, "not participant B"); + require(msg.value > 0, "zero deposit"); + + ch.depositB = msg.value; + emit ChannelOpened(channelId, ch.participantA, ch.participantB, ch.depositA, ch.depositB); + } + + /// @inheritdoc IPaymentChannelManager + function closeChannelCooperative( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external nonReentrant { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open, "not open"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + _verifyStateSignatures(channelId, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + + ch.status = ChannelStatus.Closed; + _transfer(ch.participantA, balanceA); + _transfer(ch.participantB, balanceB); + + emit ChannelClosed(channelId, balanceA, balanceB, true); + } + + /// @inheritdoc IPaymentChannelManager + function submitClose( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open || ch.status == ChannelStatus.Dispute, "wrong status"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + _verifyStateSignatures(channelId, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + + if (ch.status == ChannelStatus.Open) { + ch.status = ChannelStatus.Dispute; + } else { + require(nonce > ch.disputeNonce, "older state"); + } + + ch.disputeNonce = nonce; + ch.disputeBalanceA = balanceA; + ch.disputeBalanceB = balanceB; + ch.disputeDeadline = block.timestamp + challengeWindowSeconds; + + emit ChallengeSubmitted(channelId, nonce, balanceA, balanceB, ch.disputeDeadline); + } + + /// @inheritdoc IPaymentChannelManager + function challengeClose( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Dispute, "not in dispute"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + require(nonce > ch.disputeNonce, "not newer"); + _verifyStateSignatures(channelId, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + + ch.disputeNonce = nonce; + ch.disputeBalanceA = balanceA; + ch.disputeBalanceB = balanceB; + ch.disputeDeadline = block.timestamp + challengeWindowSeconds; + + emit ChallengeSubmitted(channelId, nonce, balanceA, balanceB, ch.disputeDeadline); + } + + /// @inheritdoc IPaymentChannelManager + function finalizeClose(uint256 channelId) external nonReentrant { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Dispute, "not in dispute"); + require(block.timestamp >= ch.disputeDeadline, "window open"); + + ch.status = ChannelStatus.Closed; + _transfer(ch.participantA, ch.disputeBalanceA); + _transfer(ch.participantB, ch.disputeBalanceB); + + emit ChannelClosed(channelId, ch.disputeBalanceA, ch.disputeBalanceB, false); + } + + /// @inheritdoc IPaymentChannelManager + function getChannel(uint256 channelId) external view returns (Channel memory) { + return _channels[channelId]; + } + + /// @inheritdoc IPaymentChannelManager + function getChannelCount() external view returns (uint256) { + return _channelIds.length; + } + + /// Returns first channel id for the pair (0 if none). For multiple channels per pair, enumerate via getChannelCount/getChannel. + function getChannelId(address participantA, address participantB) external view returns (uint256) { + for (uint256 i = 0; i < _channelIds.length; i++) { + Channel storage ch = _channels[_channelIds[i]]; + if ( + (ch.participantA == participantA && ch.participantB == participantB) || + (ch.participantA == participantB && ch.participantB == participantA) + ) { + if (ch.status == ChannelStatus.Open || ch.status == ChannelStatus.Dispute) { + return _channelIds[i]; + } + } + } + return 0; + } + + function getChannelIdByIndex(uint256 index) external view returns (uint256) { + require(index < _channelIds.length, "out of bounds"); + return _channelIds[index]; + } + + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function setChallengeWindow(uint256 newWindow) external onlyAdmin { + require(newWindow > 0, "zero window"); + uint256 old = challengeWindowSeconds; + challengeWindowSeconds = newWindow; + emit ChallengeWindowUpdated(old, newWindow); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } + + function _verifyStateSignatures( + uint256 channelId, + address participantA, + address participantB, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) internal pure { + bytes32 stateHash = keccak256(abi.encodePacked(channelId, nonce, balanceA, balanceB)); + bytes32 ethSigned = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", stateHash)); + + address signerA = ECDSA.recover(ethSigned, vA, rA, sA); + address signerB = ECDSA.recover(ethSigned, vB, rB, sB); + require(signerA == participantA && signerB == participantB, "invalid sigs"); + } + + function _transfer(address to, uint256 amount) internal { + if (amount > 0) { + (bool ok,) = payable(to).call{value: amount}(""); + require(ok, "transfer failed"); + } + } + + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/compliance/ComplianceRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/compliance/ComplianceRegistry.sol new file mode 100644 index 0000000..af75205 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/compliance/ComplianceRegistry.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./LegallyCompliantBase.sol"; + +/** + * @title ComplianceRegistry + * @notice Registry for tracking legal compliance status of contracts + * @dev This registry tracks contracts that inherit from LegallyCompliantBase + * Separate from eMoney ComplianceRegistry which has KYC/AML features + */ +contract ComplianceRegistry is AccessControl { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + + /** + * @notice Compliance status for a contract + */ + struct ContractComplianceStatus { + bool isRegistered; + string legalFrameworkVersion; + string legalJurisdiction; + bytes32 lastLegalNoticeHash; + uint256 registeredAt; + uint256 lastUpdated; + } + + mapping(address => ContractComplianceStatus) private _contractCompliance; + + event ContractRegistered( + address indexed contractAddress, + string legalFrameworkVersion, + string legalJurisdiction, + uint256 timestamp + ); + + event ContractComplianceUpdated( + address indexed contractAddress, + bytes32 lastLegalNoticeHash, + uint256 timestamp + ); + + /** + * @notice Constructor + * @param admin Address that will receive DEFAULT_ADMIN_ROLE + */ + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a contract that inherits from LegallyCompliantBase + * @param contractAddress Address of the compliant contract + * @dev Requires REGISTRAR_ROLE + */ + function registerContract(address contractAddress) external onlyRole(REGISTRAR_ROLE) { + require(contractAddress != address(0), "ComplianceRegistry: zero address"); + require(!_contractCompliance[contractAddress].isRegistered, "ComplianceRegistry: contract already registered"); + + // Get compliance information from the contract + LegallyCompliantBase compliantContract = LegallyCompliantBase(contractAddress); + + _contractCompliance[contractAddress] = ContractComplianceStatus({ + isRegistered: true, + legalFrameworkVersion: compliantContract.LEGAL_FRAMEWORK_VERSION(), + legalJurisdiction: compliantContract.LEGAL_JURISDICTION(), + lastLegalNoticeHash: bytes32(0), + registeredAt: block.timestamp, + lastUpdated: block.timestamp + }); + + emit ContractRegistered( + contractAddress, + compliantContract.LEGAL_FRAMEWORK_VERSION(), + compliantContract.LEGAL_JURISDICTION(), + block.timestamp + ); + } + + /** + * @notice Update compliance status with a new legal notice + * @param contractAddress Address of the compliant contract + * @param newLegalNoticeHash Hash of the new legal notice + * @dev Requires REGISTRAR_ROLE + */ + function updateContractCompliance( + address contractAddress, + bytes32 newLegalNoticeHash + ) external onlyRole(REGISTRAR_ROLE) { + require(_contractCompliance[contractAddress].isRegistered, "ComplianceRegistry: contract not registered"); + + _contractCompliance[contractAddress].lastLegalNoticeHash = newLegalNoticeHash; + _contractCompliance[contractAddress].lastUpdated = block.timestamp; + + emit ContractComplianceUpdated(contractAddress, newLegalNoticeHash, block.timestamp); + } + + /** + * @notice Get compliance status for a contract + * @param contractAddress Address of the contract + * @return Compliance status struct + */ + function getContractComplianceStatus( + address contractAddress + ) external view returns (ContractComplianceStatus memory) { + return _contractCompliance[contractAddress]; + } + + /** + * @notice Check if a contract is registered + * @param contractAddress Address of the contract + * @return True if registered, false otherwise + */ + function isContractRegistered(address contractAddress) external view returns (bool) { + return _contractCompliance[contractAddress].isRegistered; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/compliance/IndyVerifier.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/compliance/IndyVerifier.sol new file mode 100644 index 0000000..9319eda --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/compliance/IndyVerifier.sol @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title IndyVerifier + * @notice Verifies Hyperledger Indy credentials before allowing bridge operations + * @dev Uses zero-knowledge proofs for privacy-preserving credential verification + */ +contract IndyVerifier is AccessControl { + bytes32 public constant VERIFIER_ROLE = keccak256("VERIFIER_ROLE"); + bytes32 public constant ISSUER_ROLE = keccak256("ISSUER_ROLE"); + + enum CredentialType { + KYC, + AccreditedInvestor, + Institution, + Jurisdiction, + Compliance + } + + struct CredentialSchema { + string schemaId; // Indy schema ID + string credDefId; // Credential definition ID + bool required; + CredentialType credType; + uint256 minScore; // Minimum verification score (0-100) + } + + struct VerificationResult { + bool verified; + uint256 score; + uint256 verifiedAt; + string proofId; + } + + mapping(address => mapping(CredentialType => VerificationResult)) public userCredentials; + mapping(CredentialType => CredentialSchema) public schemas; + mapping(string => bool) public verifiedProofs; // proofId => verified + + event CredentialVerified( + address indexed user, + CredentialType credType, + uint256 score, + string proofId + ); + + event CredentialRevoked( + address indexed user, + CredentialType credType + ); + + event SchemaRegistered( + CredentialType credType, + string schemaId, + string credDefId + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(VERIFIER_ROLE, admin); + _grantRole(ISSUER_ROLE, admin); + } + + /** + * @notice Register credential schema + */ + function registerSchema( + CredentialType credType, + string calldata schemaId, + string calldata credDefId, + bool required, + uint256 minScore + ) external onlyRole(ISSUER_ROLE) { + schemas[credType] = CredentialSchema({ + schemaId: schemaId, + credDefId: credDefId, + required: required, + credType: credType, + minScore: minScore + }); + + emit SchemaRegistered(credType, schemaId, credDefId); + } + + /** + * @notice Verify credential proof (called by oracle/agent) + * @dev Off-chain: Verify ZK proof with Indy + * On-chain: Store verification result + */ + function verifyCredentialProof( + address user, + CredentialType credType, + bytes calldata zkProof, + uint256 score, + string calldata proofId + ) external onlyRole(VERIFIER_ROLE) returns (bool) { + require(bytes(schemas[credType].schemaId).length > 0, "Schema not registered"); + require(!verifiedProofs[proofId], "Proof already used"); + require(score >= schemas[credType].minScore, "Score too low"); + + // Mark proof as used (prevent replay) + verifiedProofs[proofId] = true; + + // Store verification result + userCredentials[user][credType] = VerificationResult({ + verified: true, + score: score, + verifiedAt: block.timestamp, + proofId: proofId + }); + + emit CredentialVerified(user, credType, score, proofId); + + return true; + } + + /** + * @notice Check if user has required credential + */ + function hasCredential( + address user, + CredentialType credType + ) external view returns (bool) { + VerificationResult memory result = userCredentials[user][credType]; + if (!result.verified) return false; + + CredentialSchema memory schema = schemas[credType]; + return result.score >= schema.minScore; + } + + /** + * @notice Get credential verification details + */ + function getCredentialDetails( + address user, + CredentialType credType + ) external view returns (VerificationResult memory) { + return userCredentials[user][credType]; + } + + /** + * @notice Revoke credential (for compliance) + */ + function revokeCredential( + address user, + CredentialType credType + ) external onlyRole(VERIFIER_ROLE) { + delete userCredentials[user][credType]; + emit CredentialRevoked(user, credType); + } + + /** + * @notice Batch verify credentials (for efficiency) + */ + function batchVerifyCredentials( + address[] calldata users, + CredentialType[] calldata credTypes, + bytes[] calldata zkProofs, + uint256[] calldata scores, + string[] calldata proofIds + ) external onlyRole(VERIFIER_ROLE) { + require( + users.length == credTypes.length && + credTypes.length == zkProofs.length && + zkProofs.length == scores.length && + scores.length == proofIds.length, + "Array length mismatch" + ); + + for (uint256 i = 0; i < users.length; i++) { + this.verifyCredentialProof(users[i], credTypes[i], zkProofs[i], scores[i], proofIds[i]); + } + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/compliance/LegallyCompliantBase.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/compliance/LegallyCompliantBase.sol new file mode 100644 index 0000000..f2b5801 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/compliance/LegallyCompliantBase.sol @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; + +/** + * @title LegallyCompliantBase + * @notice Base contract for all legally compliant value transfer instruments + * @dev Provides legal framework declarations, ISO standards compliance, ICC compliance, + * and exemption declarations for Travel Rules and regulatory compliance + */ +abstract contract LegallyCompliantBase is AccessControl { + using Strings for uint256; + + // Legal Framework Version + string public constant LEGAL_FRAMEWORK_VERSION = "1.0.0"; + + // Legal Jurisdiction + string public constant LEGAL_JURISDICTION = "International Private Law"; + + // Dispute Resolution + string public constant DISPUTE_RESOLUTION_MECHANISM = "ICC Arbitration (Paris)"; + + // Service of Process Address + string public constant SERVICE_OF_PROCESS_ADDRESS = "0x0000000000000000000000000000000000000000"; + + // ISO Standards Compliance + string public constant ISO_20022_COMPLIANCE = "ISO 20022 (Financial Messaging) - Supported via ISO20022Router"; + string public constant ISO_27001_COMPLIANCE = "ISO 27001 (Information Security) - Architectural Compliance"; + string public constant ISO_3166_COMPLIANCE = "ISO 3166 (Country Codes) - Supported"; + string public constant ISO_8601_COMPLIANCE = "ISO 8601 (Timestamps) - Supported"; + string public constant ISO_4217_COMPLIANCE = "ISO 4217 (Currency Codes) - Supported"; + + // ICC Compliance + string public constant ICC_UNIFORM_RULES_COMPLIANCE = "ICC Uniform Rules for Demand Guarantees (URDG 758) - Applicable by reference"; + string public constant ICC_ARBITRATION_SUPPORT = "ICC Arbitration Rules - Supported for dispute resolution"; + string public constant ICC_TRADE_TERMS_COMPLIANCE = "Incoterms 2020 - Applicable by reference"; + + // Instrument Classification + string public constant INSTRUMENT_CLASSIFICATION = "Private Digital Instrument of Value Transfer"; + + // Transferability Statement + string public constant TRANSFERABILITY_STATEMENT = "This instrument represents a transferable claim or value, subject to contract terms."; + + // Legal Enforceability + string public constant LEGAL_ENFORCEABILITY_STATEMENT = "Enforceable under private international law principles and ICC arbitration."; + + // Travel Rules Exemption + string public constant TRAVEL_RULE_EXEMPTION_STATEMENT = + "This contract is designed for private, peer-to-peer value transfer and is not intended to facilitate transactions subject to FATF Travel Rule (e.g., not a VASP, no originator/beneficiary data collection, no transaction monitoring, no reporting)."; + + // Regulatory Exemption + string public constant REGULATORY_EXEMPTION_STATEMENT = + "This contract is not intended to be a money transmission service, payment service, or regulated financial instrument. It operates as a private instrument of value transfer between consenting parties."; + + // Events + event LegalNotice(bytes32 indexed noticeHash, string message, uint256 timestamp); + event ValueTransferDeclared( + address indexed from, + address indexed to, + uint256 value, + bytes32 legalReferenceHash + ); + event JurisdictionDeclared(string jurisdiction, uint256 timestamp); + event DisputeResolutionMechanismSet(string mechanism, uint256 timestamp); + + /** + * @notice Constructor + * @param admin Address that will receive DEFAULT_ADMIN_ROLE + */ + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + emit JurisdictionDeclared(LEGAL_JURISDICTION, block.timestamp); + emit DisputeResolutionMechanismSet(DISPUTE_RESOLUTION_MECHANISM, block.timestamp); + } + + /** + * @notice Record a legal notice + * @param message The legal notice message + */ + function recordLegalNotice(string calldata message) external onlyRole(DEFAULT_ADMIN_ROLE) { + emit LegalNotice( + keccak256(abi.encodePacked(message, block.timestamp)), + message, + block.timestamp + ); + } + + /** + * @notice Generate a legal reference hash for a value transfer + * @param from Source address + * @param to Destination address + * @param value Transfer amount + * @param additionalData Additional data for the transfer + * @return legalReferenceHash The generated legal reference hash + */ + function _generateLegalReferenceHash( + address from, + address to, + uint256 value, + bytes memory additionalData + ) internal view returns (bytes32) { + return keccak256(abi.encodePacked( + block.timestamp, + block.number, + tx.origin, + from, + to, + value, + additionalData, + LEGAL_FRAMEWORK_VERSION, + LEGAL_JURISDICTION + )); + } + + /** + * @notice Emit a compliant value transfer event + * @param from Source address + * @param to Destination address + * @param value Transfer amount + * @param legalReference Legal reference string + * @param iso20022MessageId ISO 20022 message ID (if applicable) + */ + function _emitCompliantValueTransfer( + address from, + address to, + uint256 value, + string memory legalReference, + bytes32 iso20022MessageId + ) internal { + bytes32 legalRefHash = _generateLegalReferenceHash( + from, + to, + value, + abi.encodePacked(legalReference, iso20022MessageId) + ); + + emit ValueTransferDeclared(from, to, value, legalRefHash); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/config/ConfigurationRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/config/ConfigurationRegistry.sol new file mode 100644 index 0000000..47771a5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/config/ConfigurationRegistry.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title ConfigurationRegistry + * @notice Centralized configuration without hardcoding + * @dev Eliminates hardcoded addresses, enables runtime configuration + */ +contract ConfigurationRegistry is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant CONFIG_ADMIN_ROLE = keccak256("CONFIG_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + mapping(address => mapping(bytes32 => bytes)) private configs; + mapping(address => bytes32[]) private configKeys; + + event ConfigSet(address indexed contractAddr, bytes32 indexed key, bytes value); + event ConfigDeleted(address indexed contractAddr, bytes32 indexed key); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(CONFIG_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + function set(address contractAddr, bytes32 key, bytes calldata value) external onlyRole(CONFIG_ADMIN_ROLE) { + require(contractAddr != address(0), "Zero address"); + require(key != bytes32(0), "Zero key"); + + if (configs[contractAddr][key].length == 0) { + configKeys[contractAddr].push(key); + } + + configs[contractAddr][key] = value; + emit ConfigSet(contractAddr, key, value); + } + + function get(address contractAddr, bytes32 key) external view returns (bytes memory) { + return configs[contractAddr][key]; + } + + function getAddress(address contractAddr, bytes32 key) external view returns (address) { + bytes memory data = configs[contractAddr][key]; + require(data.length == 32, "Invalid data"); + return abi.decode(data, (address)); + } + + function getUint256(address contractAddr, bytes32 key) external view returns (uint256) { + bytes memory data = configs[contractAddr][key]; + require(data.length == 32, "Invalid data"); + return abi.decode(data, (uint256)); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/dex/DODOPMMIntegration.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/dex/DODOPMMIntegration.sol new file mode 100644 index 0000000..42d9adb --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/dex/DODOPMMIntegration.sol @@ -0,0 +1,566 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../reserve/IReserveSystem.sol"; + +/** + * @title DODO PMM Pool Interface + * @notice Simplified interface for DODO Proactive Market Maker pools + * @dev Actual DODO interfaces may vary - this is a simplified version + */ +interface IDODOPMMPool { + function _BASE_TOKEN_() external view returns (address); + function _QUOTE_TOKEN_() external view returns (address); + function sellBase(uint256 amount) external returns (uint256); + function sellQuote(uint256 amount) external returns (uint256); + function buyShares(address to) external returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare); + function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve); + function getMidPrice() external view returns (uint256); + function _QUOTE_RESERVE_() external view returns (uint256); + function _BASE_RESERVE_() external view returns (uint256); +} + +/** + * @title DODO Vending Machine Interface + * @notice Interface for creating DODO Vending Machine (DVM) pools + */ +interface IDODOVendingMachine { + function createDVM( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 i, + uint256 k, + bool isOpenTWAP + ) external returns (address dvm); +} + +/** + * @title DODOPMMIntegration + * @notice Integration contract for DODO PMM pools with CompliantUSDT/USDC + * @dev Manages liquidity pools on DODO and provides swap functionality between + * compliant tokens (cUSDT/cUSDC) and official tokens (USDT/USDC) + * + * This contract facilitates exchangeability between compliant and official tokens + * through DODO's Proactive Market Maker algorithm, which maintains price stability + * and provides efficient liquidity. + */ +contract DODOPMMIntegration is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + bytes32 public constant SWAP_OPERATOR_ROLE = keccak256("SWAP_OPERATOR_ROLE"); + + // DODO contracts + address public immutable dodoVendingMachine; + address public immutable dodoApprove; // DODO's approval contract for gas optimization + + // Token addresses + address public immutable officialUSDT; // Official USDT on destination chain + address public immutable officialUSDC; // Official USDC on destination chain + address public immutable compliantUSDT; // cUSDT on Chain 138 + address public immutable compliantUSDC; // cUSDC on Chain 138 + + // Pool mappings + mapping(address => mapping(address => address)) public pools; // token0 => token1 => pool + mapping(address => bool) public isRegisteredPool; + + // Pool configuration + struct PoolConfig { + address pool; + address baseToken; + address quoteToken; + uint256 lpFeeRate; // Basis points (100 = 1%) + uint256 i; // Initial price (1e18 = $1 for stablecoins) + uint256 k; // Slippage factor (0.5 = 500000000000000000, lower = less slippage) + bool isOpenTWAP; // Enable TWAP oracle for price discovery + uint256 createdAt; + } + + mapping(address => PoolConfig) public poolConfigs; + address[] public allPools; + + /// @notice Optional ReserveSystem for oracle-backed mid price (base/quote in reserve system) + IReserveSystem public reserveSystem; + + event PoolCreated( + address indexed pool, + address indexed baseToken, + address indexed quoteToken, + address creator + ); + event LiquidityAdded( + address indexed pool, + address indexed provider, + uint256 baseAmount, + uint256 quoteAmount, + uint256 lpShares + ); + event SwapExecuted( + address indexed pool, + address indexed tokenIn, + address indexed tokenOut, + uint256 amountIn, + uint256 amountOut, + address trader + ); + event PoolRemoved(address indexed pool); + event ReserveSystemSet(address indexed reserveSystem); + + constructor( + address admin, + address dodoVendingMachine_, + address dodoApprove_, + address officialUSDT_, + address officialUSDC_, + address compliantUSDT_, + address compliantUSDC_ + ) { + require(admin != address(0), "DODOPMMIntegration: zero admin"); + require(dodoVendingMachine_ != address(0), "DODOPMMIntegration: zero DVM"); + require(officialUSDT_ != address(0), "DODOPMMIntegration: zero USDT"); + require(officialUSDC_ != address(0), "DODOPMMIntegration: zero USDC"); + require(compliantUSDT_ != address(0), "DODOPMMIntegration: zero cUSDT"); + require(compliantUSDC_ != address(0), "DODOPMMIntegration: zero cUSDC"); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + _grantRole(SWAP_OPERATOR_ROLE, admin); + + dodoVendingMachine = dodoVendingMachine_; + dodoApprove = dodoApprove_; + officialUSDT = officialUSDT_; + officialUSDC = officialUSDC_; + compliantUSDT = compliantUSDT_; + compliantUSDC = compliantUSDC_; + } + + /** + * @notice Create DODO PMM pool for cUSDT/USDT pair + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage, higher = more slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTUSDTPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][officialUSDT] == address(0), "DODOPMMIntegration: pool exists"); + + // Create DVM pool using DODO Vending Machine + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + officialUSDT, // quoteToken (USDT) + lpFeeRate, // LP fee rate + initialPrice, // Initial price + k, // Slippage factor + isOpenTWAP // Enable TWAP + ); + + // Register pool + pools[compliantUSDT][officialUSDT] = pool; + pools[officialUSDT][compliantUSDT] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDT, + quoteToken: officialUSDT, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDT, officialUSDT, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDC/USDC pair + * @param lpFeeRate Liquidity provider fee rate (basis points) + * @param initialPrice Initial price (1e18 = $1) + * @param k Slippage factor + * @param isOpenTWAP Enable TWAP oracle + */ + function createCUSDCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDC][officialUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDC, + officialUSDC, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[compliantUSDC][officialUSDC] = pool; + pools[officialUSDC][compliantUSDC] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDC, + quoteToken: officialUSDC, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDC, officialUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDT/cUSDC pair (public liquidity per VAULT_SYSTEM_MASTER_TECHNICAL_PLAN §4) + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][compliantUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + compliantUSDC, // quoteToken (cUSDC) + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[compliantUSDT][compliantUSDC] = pool; + pools[compliantUSDC][compliantUSDT] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDT, + quoteToken: compliantUSDC, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDT, compliantUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for any base/quote token pair (generic) + * @param baseToken Base token address + * @param quoteToken Quote token address + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoins) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createPool( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(baseToken != address(0), "DODOPMMIntegration: zero base"); + require(quoteToken != address(0), "DODOPMMIntegration: zero quote"); + require(baseToken != quoteToken, "DODOPMMIntegration: same token"); + require(pools[baseToken][quoteToken] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + baseToken, + quoteToken, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[baseToken][quoteToken] = pool; + pools[quoteToken][baseToken] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: baseToken, + quoteToken: quoteToken, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, baseToken, quoteToken, msg.sender); + } + + /** + * @notice Add liquidity to a DODO PMM pool + * @param pool Pool address + * @param baseAmount Amount of base token to deposit + * @param quoteAmount Amount of quote token to deposit + */ + function addLiquidity( + address pool, + uint256 baseAmount, + uint256 quoteAmount + ) external nonReentrant returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(baseAmount > 0 && quoteAmount > 0, "DODOPMMIntegration: zero amount"); + + PoolConfig memory config = poolConfigs[pool]; + + // Transfer tokens to pool (DODO pools handle their own token management) + IERC20(config.baseToken).safeTransferFrom(msg.sender, pool, baseAmount); + IERC20(config.quoteToken).safeTransferFrom(msg.sender, pool, quoteAmount); + + // Call buyShares on DODO pool to add liquidity + (baseShare, quoteShare, lpShare) = IDODOPMMPool(pool).buyShares(msg.sender); + + emit LiquidityAdded(pool, msg.sender, baseAmount, quoteAmount, lpShare); + } + + /** + * @notice Swap cUSDT for official USDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDT to sell + * @param minAmountOut Minimum amount of USDT to receive (slippage protection) + */ + function swapCUSDTForUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer cUSDT to pool + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell base token) + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDT, officialUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDT for cUSDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDT to sell + * @param minAmountOut Minimum amount of cUSDT to receive + */ + function swapUSDTForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer USDT to pool + IERC20(officialUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell quote token) + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDT, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for official USDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDC to sell + * @param minAmountOut Minimum amount of USDC to receive + */ + function swapCUSDCForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDC, officialUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDC for cUSDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDC to sell + * @param minAmountOut Minimum amount of cUSDC to receive + */ + function swapUSDCForCUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(officialUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDC, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDT for cUSDC via cUSDT/cUSDC DODO PMM pool (public liquidity pair per Master Plan §4) + */ + function swapCUSDTForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(compliantUSDC).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, compliantUSDT, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for cUSDT via cUSDT/cUSDC DODO PMM pool + */ + function swapUSDCForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(compliantUSDT).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, compliantUSDC, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Set optional ReserveSystem for oracle-backed mid price + * @param reserveSystem_ ReserveSystem address (address(0) to disable) + */ + function setReserveSystem(address reserveSystem_) external onlyRole(DEFAULT_ADMIN_ROLE) { + reserveSystem = IReserveSystem(reserveSystem_); + emit ReserveSystemSet(reserveSystem_); + } + + /** + * @notice Get pool price: oracle (ReserveSystem) if configured and available, else pool getMidPrice() + * @param pool Pool address + * @return price Price in 18 decimals (quote per base; 1e18 = $1 for stablecoins) + */ + function getPoolPriceOrOracle(address pool) public view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + if (address(reserveSystem) != address(0)) { + PoolConfig memory config = poolConfigs[pool]; + try reserveSystem.getConversionPrice(config.baseToken, config.quoteToken) returns (uint256 oraclePrice) { + if (oraclePrice > 0) return oraclePrice; + } catch { } + } + return IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get current pool price (pool mid only; use getPoolPriceOrOracle for oracle-backed price) + * @param pool Pool address + * @return price Current mid price (1e18 = $1 for stablecoins) + */ + function getPoolPrice(address pool) external view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + price = IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get pool reserves + * @param pool Pool address + * @return baseReserve Base token reserve + * @return quoteReserve Quote token reserve + */ + function getPoolReserves(address pool) external view returns (uint256 baseReserve, uint256 quoteReserve) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + (baseReserve, quoteReserve) = IDODOPMMPool(pool).getVaultReserve(); + } + + /** + * @notice Get pool configuration + * @param pool Pool address + * @return config Pool configuration struct + */ + function getPoolConfig(address pool) external view returns (PoolConfig memory config) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + config = poolConfigs[pool]; + } + + /** + * @notice Get all registered pools + * @return List of all pool addresses + */ + function getAllPools() external view returns (address[] memory) { + return allPools; + } + + /** + * @notice Remove pool (emergency only) + * @param pool Pool address to remove + */ + function removePool(address pool) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + + PoolConfig memory config = poolConfigs[pool]; + pools[config.baseToken][config.quoteToken] = address(0); + pools[config.quoteToken][config.baseToken] = address(0); + isRegisteredPool[pool] = false; + + delete poolConfigs[pool]; + + emit PoolRemoved(pool); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/dex/PrivatePoolRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/dex/PrivatePoolRegistry.sol new file mode 100644 index 0000000..20ebf0c --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/dex/PrivatePoolRegistry.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title PrivatePoolRegistry + * @notice Registry of private XAU-anchored stabilization pools (Master Plan Phase 2). + * @dev Only the Stabilizer (or whitelisted keeper) should execute swaps for rebalancing. + * Liquidity provision can be restricted via STABILIZER_LP_ROLE when enforced by a wrapper or runbook. + */ +contract PrivatePoolRegistry is AccessControl { + bytes32 public constant STABILIZER_LP_ROLE = keccak256("STABILIZER_LP_ROLE"); + + /// @dev Canonical key: (token0, token1) where token0 < token1 + mapping(address => mapping(address => address)) private _pools; + + event PrivatePoolRegistered( + address indexed tokenA, + address indexed tokenB, + address indexed pool + ); + event PrivatePoolRemoved( + address indexed tokenA, + address indexed tokenB, + address indexed pool + ); + + constructor(address admin) { + require(admin != address(0), "PrivatePoolRegistry: zero admin"); + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + /** + * @notice Register a private pool for a token pair. + * @param tokenA First token (order used for storage; getPrivatePool is order-agnostic) + * @param tokenB Second token + * @param poolAddress DODO pool address (e.g. from DODOPMMIntegration.createPool) + */ + function register( + address tokenA, + address tokenB, + address poolAddress + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(tokenA != address(0) && tokenB != address(0), "PrivatePoolRegistry: zero token"); + require(poolAddress != address(0), "PrivatePoolRegistry: zero pool"); + require(tokenA != tokenB, "PrivatePoolRegistry: same token"); + + (address t0, address t1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); + require(_pools[t0][t1] == address(0), "PrivatePoolRegistry: pool already set"); + + _pools[t0][t1] = poolAddress; + + emit PrivatePoolRegistered(tokenA, tokenB, poolAddress); + } + + /** + * @notice Remove a private pool registration (e.g. migration). + */ + function unregister(address tokenA, address tokenB) external onlyRole(DEFAULT_ADMIN_ROLE) { + (address t0, address t1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); + address pool = _pools[t0][t1]; + require(pool != address(0), "PrivatePoolRegistry: not registered"); + + delete _pools[t0][t1]; + emit PrivatePoolRemoved(tokenA, tokenB, pool); + } + + /** + * @notice Get the private pool for a token pair (order-agnostic). + * @param tokenIn One of the pair + * @param tokenOut The other + * @return pool The registered pool address, or address(0) if none + */ + function getPrivatePool(address tokenIn, address tokenOut) external view returns (address pool) { + if (tokenIn == tokenOut) return address(0); + (address t0, address t1) = tokenIn < tokenOut ? (tokenIn, tokenOut) : (tokenOut, tokenIn); + return _pools[t0][t1]; + } + + /** + * @notice Check if an address is allowed to add liquidity (has STABILIZER_LP_ROLE). + * @dev Use in a wrapper or runbook; DODOPMMIntegration.addLiquidity does not check this. + */ + function isLpAllowed(address account) external view returns (bool) { + return hasRole(STABILIZER_LP_ROLE, account); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/BridgeVault138.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/BridgeVault138.sol new file mode 100644 index 0000000..652effa --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/BridgeVault138.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title BridgeVault138 + * @notice Stub for build; full implementation when emoney module is restored + */ +contract BridgeVault138 is AccessControl { + constructor(address admin, address, address) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/ComplianceRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/ComplianceRegistry.sol new file mode 100644 index 0000000..e481974 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/ComplianceRegistry.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title ComplianceRegistry + * @notice Stub for build; full implementation when emoney module is restored + */ +contract ComplianceRegistry is AccessControl { + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + function canTransfer(address, address, address, uint256) external pure returns (bool) { + return true; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/PolicyManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/PolicyManager.sol new file mode 100644 index 0000000..92e48a6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/PolicyManager.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title PolicyManager + * @notice Stub for build; full implementation when emoney module is restored + */ +contract PolicyManager is AccessControl { + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + function canTransfer(address, address, address, uint256) external pure returns (bool isAuthorized, bytes32 reasonCode) { + return (true, bytes32(0)); + } + + function canTransferWithContext(address, address, address, uint256, bytes memory) external pure returns (bool isAuthorized, bytes32 reasonCode) { + return (true, bytes32(0)); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/TokenFactory138.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/TokenFactory138.sol new file mode 100644 index 0000000..dc92292 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/TokenFactory138.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title TokenFactory138 + * @notice Stub for build; full implementation when emoney module is restored + */ +contract TokenFactory138 is AccessControl { + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/interfaces/IAccountWalletRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/interfaces/IAccountWalletRegistry.sol new file mode 100644 index 0000000..0fa383f --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/interfaces/IAccountWalletRegistry.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IAccountWalletRegistry + * @notice Registry linking account refs to wallet refs + */ +struct WalletLink { + bytes32 walletRefId; + uint64 linkedAt; + bool active; + bytes32 provider; +} + +interface IAccountWalletRegistry { + event AccountWalletLinked(bytes32 indexed accountRefId, bytes32 indexed walletRefId, bytes32 provider, uint64 linkedAt); + event AccountWalletUnlinked(bytes32 indexed accountRefId, bytes32 indexed walletRefId); + + function linkAccountToWallet(bytes32 accountRefId, bytes32 walletRefId, bytes32 provider) external; + function unlinkAccountFromWallet(bytes32 accountRefId, bytes32 walletRefId) external; + function getWallets(bytes32 accountRefId) external view returns (WalletLink[] memory); + function getAccounts(bytes32 walletRefId) external view returns (bytes32[] memory); + function isLinked(bytes32 accountRefId, bytes32 walletRefId) external view returns (bool); + function isActive(bytes32 accountRefId, bytes32 walletRefId) external view returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/interfaces/ITokenFactory138.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/interfaces/ITokenFactory138.sol new file mode 100644 index 0000000..019c012 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/interfaces/ITokenFactory138.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ITokenFactory138 + * @notice Minimal interface for TokenFactory138 (stub for build) + */ +interface ITokenFactory138 { +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/interfaces/IeMoneyToken.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/interfaces/IeMoneyToken.sol new file mode 100644 index 0000000..b5a9b99 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/emoney/interfaces/IeMoneyToken.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IeMoneyToken + * @notice Minimal interface for eMoney tokens (mint/burn with reason) + */ +interface IeMoneyToken { + function mint(address to, uint256 amount, bytes32 reasonHash) external; + function burn(address from, uint256 amount, bytes32 reasonHash) external; +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/governance/GovernanceController.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/governance/GovernanceController.sol new file mode 100644 index 0000000..6df19c3 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/governance/GovernanceController.sol @@ -0,0 +1,391 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../registry/UniversalAssetRegistry.sol"; + +/** + * @title GovernanceController + * @notice Hybrid governance with progressive timelock based on asset risk + * @dev Modes: Admin-only, 1-day timelock, 3-day + voting, 7-day + quorum + */ +contract GovernanceController is + Initializable, + AccessControlUpgradeable, + ReentrancyGuardUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); + bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); + bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + // Governance modes + enum GovernanceMode { + AdminOnly, // Mode 1: Admin can execute immediately + TimelockShort, // Mode 2: 1 day timelock + TimelockModerate, // Mode 3: 3 days + voting required + TimelockLong // Mode 4: 7 days + quorum required + } + + // Proposal states + enum ProposalState { + Pending, + Active, + Canceled, + Defeated, + Succeeded, + Queued, + Expired, + Executed + } + + struct Proposal { + uint256 proposalId; + address proposer; + address[] targets; + uint256[] values; + bytes[] calldatas; + string description; + uint256 startBlock; + uint256 endBlock; + uint256 eta; + GovernanceMode mode; + ProposalState state; + uint256 forVotes; + uint256 againstVotes; + uint256 abstainVotes; + mapping(address => bool) hasVoted; + } + + // Storage + UniversalAssetRegistry public assetRegistry; + mapping(uint256 => Proposal) public proposals; + uint256 public proposalCount; + + // Governance parameters + uint256 public votingDelay; // Blocks to wait before voting starts + uint256 public votingPeriod; // Blocks voting is open + uint256 public quorumNumerator; // Percentage required for quorum + + uint256 public constant TIMELOCK_SHORT = 1 days; + uint256 public constant TIMELOCK_MODERATE = 3 days; + uint256 public constant TIMELOCK_LONG = 7 days; + uint256 public constant GRACE_PERIOD = 14 days; + + // Events + event ProposalCreated( + uint256 indexed proposalId, + address proposer, + address[] targets, + uint256[] values, + string[] signatures, + bytes[] calldatas, + uint256 startBlock, + uint256 endBlock, + string description + ); + + event VoteCast( + address indexed voter, + uint256 proposalId, + uint8 support, + uint256 weight, + string reason + ); + + event ProposalQueued(uint256 indexed proposalId, uint256 eta); + event ProposalExecuted(uint256 indexed proposalId); + event ProposalCanceled(uint256 indexed proposalId); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + address _assetRegistry, + address admin + ) external initializer { + __AccessControl_init(); + __ReentrancyGuard_init(); + __UUPSUpgradeable_init(); + + require(_assetRegistry != address(0), "Zero registry"); + + assetRegistry = UniversalAssetRegistry(_assetRegistry); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(PROPOSER_ROLE, admin); + _grantRole(EXECUTOR_ROLE, admin); + _grantRole(CANCELLER_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + + votingDelay = 1; // 1 block + votingPeriod = 50400; // ~7 days + quorumNumerator = 4; // 4% quorum + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Create a new proposal + */ + function propose( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + string memory description, + GovernanceMode mode + ) external onlyRole(PROPOSER_ROLE) returns (uint256) { + require(targets.length == values.length, "Length mismatch"); + require(targets.length == calldatas.length, "Length mismatch"); + require(targets.length > 0, "Empty proposal"); + + proposalCount++; + uint256 proposalId = proposalCount; + + Proposal storage proposal = proposals[proposalId]; + proposal.proposalId = proposalId; + proposal.proposer = msg.sender; + proposal.targets = targets; + proposal.values = values; + proposal.calldatas = calldatas; + proposal.description = description; + proposal.startBlock = block.number + votingDelay; + proposal.endBlock = proposal.startBlock + votingPeriod; + proposal.mode = mode; + proposal.state = ProposalState.Pending; + + emit ProposalCreated( + proposalId, + msg.sender, + targets, + values, + new string[](targets.length), + calldatas, + proposal.startBlock, + proposal.endBlock, + description + ); + + return proposalId; + } + + /** + * @notice Cast a vote on a proposal + */ + function castVote( + uint256 proposalId, + uint8 support + ) external returns (uint256) { + return _castVote(msg.sender, proposalId, support, ""); + } + + /** + * @notice Cast a vote with reason + */ + function castVoteWithReason( + uint256 proposalId, + uint8 support, + string calldata reason + ) external returns (uint256) { + return _castVote(msg.sender, proposalId, support, reason); + } + + /** + * @notice Internal vote casting + */ + function _castVote( + address voter, + uint256 proposalId, + uint8 support, + string memory reason + ) internal returns (uint256) { + Proposal storage proposal = proposals[proposalId]; + + require(state(proposalId) == ProposalState.Active, "Not active"); + require(!proposal.hasVoted[voter], "Already voted"); + require(support <= 2, "Invalid support"); + + uint256 weight = _getVotes(voter); + + proposal.hasVoted[voter] = true; + + if (support == 0) { + proposal.againstVotes += weight; + } else if (support == 1) { + proposal.forVotes += weight; + } else { + proposal.abstainVotes += weight; + } + + emit VoteCast(voter, proposalId, support, weight, reason); + + return weight; + } + + /** + * @notice Queue a successful proposal + */ + function queue(uint256 proposalId) external { + require(state(proposalId) == ProposalState.Succeeded, "Not succeeded"); + + Proposal storage proposal = proposals[proposalId]; + uint256 delay = _getTimelockDelay(proposal.mode); + uint256 eta = block.timestamp + delay; + + proposal.eta = eta; + proposal.state = ProposalState.Queued; + + emit ProposalQueued(proposalId, eta); + } + + /** + * @notice Execute a queued proposal + */ + function execute(uint256 proposalId) external payable nonReentrant { + require(state(proposalId) == ProposalState.Queued, "Not queued"); + + Proposal storage proposal = proposals[proposalId]; + require(block.timestamp >= proposal.eta, "Timelock not met"); + require(block.timestamp <= proposal.eta + GRACE_PERIOD, "Expired"); + + proposal.state = ProposalState.Executed; + + for (uint256 i = 0; i < proposal.targets.length; i++) { + _executeTransaction( + proposal.targets[i], + proposal.values[i], + proposal.calldatas[i] + ); + } + + emit ProposalExecuted(proposalId); + } + + /** + * @notice Cancel a proposal + */ + function cancel(uint256 proposalId) external onlyRole(CANCELLER_ROLE) { + ProposalState currentState = state(proposalId); + require( + currentState != ProposalState.Executed && + currentState != ProposalState.Canceled, + "Cannot cancel" + ); + + Proposal storage proposal = proposals[proposalId]; + proposal.state = ProposalState.Canceled; + + emit ProposalCanceled(proposalId); + } + + /** + * @notice Get proposal state + */ + function state(uint256 proposalId) public view returns (ProposalState) { + Proposal storage proposal = proposals[proposalId]; + + if (proposal.state == ProposalState.Executed) return ProposalState.Executed; + if (proposal.state == ProposalState.Canceled) return ProposalState.Canceled; + if (proposal.state == ProposalState.Queued) { + if (block.timestamp >= proposal.eta + GRACE_PERIOD) { + return ProposalState.Expired; + } + return ProposalState.Queued; + } + + if (block.number <= proposal.startBlock) return ProposalState.Pending; + if (block.number <= proposal.endBlock) return ProposalState.Active; + + if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) { + return ProposalState.Succeeded; + } else { + return ProposalState.Defeated; + } + } + + /** + * @notice Execute transaction + */ + function _executeTransaction( + address target, + uint256 value, + bytes memory data + ) internal { + (bool success, bytes memory returndata) = target.call{value: value}(data); + + if (!success) { + if (returndata.length > 0) { + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert("Execution failed"); + } + } + } + + /** + * @notice Get timelock delay based on governance mode + */ + function _getTimelockDelay(GovernanceMode mode) internal pure returns (uint256) { + if (mode == GovernanceMode.AdminOnly) return 0; + if (mode == GovernanceMode.TimelockShort) return TIMELOCK_SHORT; + if (mode == GovernanceMode.TimelockModerate) return TIMELOCK_MODERATE; + return TIMELOCK_LONG; + } + + /** + * @notice Check if quorum is reached + */ + function _quorumReached(uint256 proposalId) internal view returns (bool) { + Proposal storage proposal = proposals[proposalId]; + + if (proposal.mode == GovernanceMode.AdminOnly || + proposal.mode == GovernanceMode.TimelockShort) { + return true; // No quorum required + } + + uint256 totalVotes = proposal.forVotes + proposal.againstVotes + proposal.abstainVotes; + uint256 totalSupply = assetRegistry.getValidators().length; + + return (totalVotes * 100) / totalSupply >= quorumNumerator; + } + + /** + * @notice Check if vote succeeded + */ + function _voteSucceeded(uint256 proposalId) internal view returns (bool) { + Proposal storage proposal = proposals[proposalId]; + return proposal.forVotes > proposal.againstVotes; + } + + /** + * @notice Get voting power + */ + function _getVotes(address account) internal view returns (uint256) { + return assetRegistry.isValidator(account) ? 1 : 0; + } + + // Admin functions + + function setVotingDelay(uint256 newVotingDelay) external onlyRole(DEFAULT_ADMIN_ROLE) { + votingDelay = newVotingDelay; + } + + function setVotingPeriod(uint256 newVotingPeriod) external onlyRole(DEFAULT_ADMIN_ROLE) { + votingPeriod = newVotingPeriod; + } + + function setQuorumNumerator(uint256 newQuorumNumerator) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(newQuorumNumerator <= 100, "Invalid quorum"); + quorumNumerator = newQuorumNumerator; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/governance/MultiSig.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/governance/MultiSig.sol new file mode 100644 index 0000000..db2e34e --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/governance/MultiSig.sol @@ -0,0 +1,210 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; + +/** + * @title Multi-Signature Wallet + * @notice Simple multi-sig implementation for admin operations + * @dev For production, consider using Gnosis Safe or similar battle-tested solution + */ +contract MultiSig is Ownable { + address[] public owners; + mapping(address => bool) public isOwner; + uint256 public required; + + struct Transaction { + address to; + uint256 value; + bytes data; + bool executed; + uint256 confirmations; + } + + Transaction[] public transactions; + mapping(uint256 => mapping(address => bool)) public confirmations; + + event Confirmation(address indexed sender, uint256 indexed transactionId); + event Revocation(address indexed sender, uint256 indexed transactionId); + event Submission(uint256 indexed transactionId); + event Execution(uint256 indexed transactionId); + event ExecutionFailure(uint256 indexed transactionId); + event OwnerAddition(address indexed owner); + event OwnerRemoval(address indexed owner); + event RequirementChange(uint256 required); + + modifier onlyWallet() { + require(msg.sender == address(this), "MultiSig: only wallet"); + _; + } + + modifier ownerDoesNotExist(address owner) { + require(!isOwner[owner], "MultiSig: owner exists"); + _; + } + + modifier ownerExists(address owner) { + require(isOwner[owner], "MultiSig: owner does not exist"); + _; + } + + modifier transactionExists(uint256 transactionId) { + require(transactions[transactionId].to != address(0), "MultiSig: transaction does not exist"); + _; + } + + modifier confirmed(uint256 transactionId, address owner) { + require(confirmations[transactionId][owner], "MultiSig: not confirmed"); + _; + } + + modifier notConfirmed(uint256 transactionId, address owner) { + require(!confirmations[transactionId][owner], "MultiSig: already confirmed"); + _; + } + + modifier notExecuted(uint256 transactionId) { + require(!transactions[transactionId].executed, "MultiSig: already executed"); + _; + } + + modifier validRequirement(uint256 ownerCount, uint256 _required) { + require(_required <= ownerCount && _required > 0 && ownerCount > 0, "MultiSig: invalid requirement"); + _; + } + + /** + * @notice Constructor sets initial owners and required confirmations + */ + constructor(address[] memory _owners, uint256 _required) Ownable(msg.sender) validRequirement(_owners.length, _required) { + for (uint256 i = 0; i < _owners.length; i++) { + require(_owners[i] != address(0) && !isOwner[_owners[i]], "MultiSig: invalid owner"); + isOwner[_owners[i]] = true; + owners.push(_owners[i]); + } + required = _required; + } + + /** + * @notice Submit a transaction + */ + function submitTransaction(address to, uint256 value, bytes memory data) external ownerExists(msg.sender) returns (uint256 transactionId) { + transactionId = transactions.length; + transactions.push(Transaction({ + to: to, + value: value, + data: data, + executed: false, + confirmations: 0 + })); + emit Submission(transactionId); + confirmTransaction(transactionId); + return transactionId; + } + + /** + * @notice Confirm a transaction + */ + function confirmTransaction(uint256 transactionId) public ownerExists(msg.sender) transactionExists(transactionId) notConfirmed(transactionId, msg.sender) { + confirmations[transactionId][msg.sender] = true; + transactions[transactionId].confirmations++; + emit Confirmation(msg.sender, transactionId); + } + + /** + * @notice Revoke a confirmation + */ + function revokeConfirmation(uint256 transactionId) external ownerExists(msg.sender) confirmed(transactionId, msg.sender) notExecuted(transactionId) { + confirmations[transactionId][msg.sender] = false; + transactions[transactionId].confirmations--; + emit Revocation(msg.sender, transactionId); + } + + /** + * @notice Execute a confirmed transaction + */ + function executeTransaction(uint256 transactionId) external ownerExists(msg.sender) notExecuted(transactionId) { + require(transactions[transactionId].confirmations >= required, "MultiSig: insufficient confirmations"); + Transaction storage txn = transactions[transactionId]; + txn.executed = true; + + (bool success, ) = txn.to.call{value: txn.value}(txn.data); + if (success) { + emit Execution(transactionId); + } else { + emit ExecutionFailure(transactionId); + txn.executed = false; + } + } + + /** + * @notice Add a new owner + */ + function addOwner(address owner) external onlyWallet ownerDoesNotExist(owner) { + isOwner[owner] = true; + owners.push(owner); + emit OwnerAddition(owner); + } + + /** + * @notice Remove an owner + */ + function removeOwner(address owner) external onlyWallet ownerExists(owner) { + isOwner[owner] = false; + for (uint256 i = 0; i < owners.length - 1; i++) { + if (owners[i] == owner) { + owners[i] = owners[owners.length - 1]; + break; + } + } + owners.pop(); + if (required > owners.length) { + changeRequirement(owners.length); + } + emit OwnerRemoval(owner); + } + + /** + * @notice Change the number of required confirmations + */ + function changeRequirement(uint256 _required) public onlyWallet validRequirement(owners.length, _required) { + required = _required; + emit RequirementChange(_required); + } + + /** + * @notice Get transaction count + */ + function getTransactionCount() external view returns (uint256) { + return transactions.length; + } + + /** + * @notice Get owners + */ + function getOwners() external view returns (address[] memory) { + return owners; + } + + /** + * @notice Get transaction details + */ + function getTransaction(uint256 transactionId) external view returns ( + address to, + uint256 value, + bytes memory data, + bool executed, + uint256 requiredConfirmations + ) { + Transaction storage txn = transactions[transactionId]; + return (txn.to, txn.value, txn.data, txn.executed, txn.confirmations); + } + + /** + * @notice Check if transaction is confirmed + */ + function isConfirmed(uint256 transactionId) public view returns (bool) { + return transactions[transactionId].confirmations >= required; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/governance/Voting.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/governance/Voting.sol new file mode 100644 index 0000000..85c96a4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/governance/Voting.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; + +/** + * @title Voting Contract + * @notice On-chain voting mechanism for governance proposals + * @dev Simple voting implementation with yes/no votes + */ +contract Voting is Ownable { + struct Proposal { + string description; + uint256 yesVotes; + uint256 noVotes; + uint256 startTime; + uint256 endTime; + bool executed; + mapping(address => bool) hasVoted; + } + + Proposal[] public proposals; + mapping(address => bool) public voters; + uint256 public votingPeriod = 7 days; + uint256 public quorum = 50; // 50% of voters + + event ProposalCreated(uint256 indexed proposalId, string description); + event VoteCast(uint256 indexed proposalId, address indexed voter, bool support); + event ProposalExecuted(uint256 indexed proposalId); + + modifier onlyVoter() { + require(voters[msg.sender], "Voting: not a voter"); + _; + } + + constructor() Ownable(msg.sender) {} + + /** + * @notice Add a voter + */ + function addVoter(address voter) external onlyOwner { + voters[voter] = true; + } + + /** + * @notice Remove a voter + */ + function removeVoter(address voter) external onlyOwner { + voters[voter] = false; + } + + /** + * @notice Create a new proposal + */ + function createProposal(string memory description) external onlyVoter returns (uint256) { + uint256 proposalId = proposals.length; + + Proposal storage proposal = proposals.push(); + proposal.description = description; + proposal.startTime = block.timestamp; + proposal.endTime = block.timestamp + votingPeriod; + + emit ProposalCreated(proposalId, description); + return proposalId; + } + + /** + * @notice Vote on a proposal + */ + function vote(uint256 proposalId, bool support) external onlyVoter { + Proposal storage proposal = proposals[proposalId]; + require(block.timestamp >= proposal.startTime, "Voting: not started"); + require(block.timestamp <= proposal.endTime, "Voting: ended"); + require(!proposal.hasVoted[msg.sender], "Voting: already voted"); + + proposal.hasVoted[msg.sender] = true; + + if (support) { + proposal.yesVotes++; + } else { + proposal.noVotes++; + } + + emit VoteCast(proposalId, msg.sender, support); + } + + /** + * @notice Execute a proposal if it passes + */ + function executeProposal(uint256 proposalId) external { + Proposal storage proposal = proposals[proposalId]; + require(block.timestamp > proposal.endTime, "Voting: not ended"); + require(!proposal.executed, "Voting: already executed"); + + uint256 totalVotes = proposal.yesVotes + proposal.noVotes; + require(totalVotes > 0, "Voting: no votes"); + + // Check quorum + uint256 voterCount = _getVoterCount(); + require((totalVotes * 100) / voterCount >= quorum, "Voting: quorum not met"); + + // Check if proposal passed + require(proposal.yesVotes > proposal.noVotes, "Voting: proposal failed"); + + proposal.executed = true; + emit ProposalExecuted(proposalId); + } + + /** + * @notice Get proposal details + */ + function getProposal(uint256 proposalId) external view returns ( + string memory description, + uint256 yesVotes, + uint256 noVotes, + uint256 startTime, + uint256 endTime, + bool executed + ) { + Proposal storage proposal = proposals[proposalId]; + return ( + proposal.description, + proposal.yesVotes, + proposal.noVotes, + proposal.startTime, + proposal.endTime, + proposal.executed + ); + } + + /** + * @notice Get voter count + */ + function _getVoterCount() internal view returns (uint256) { + // Simplified - in production, maintain a count + return 10; // Placeholder + } + + /** + * @notice Update voting period + */ + function setVotingPeriod(uint256 newPeriod) external onlyOwner { + votingPeriod = newPeriod; + } + + /** + * @notice Update quorum + */ + function setQuorum(uint256 newQuorum) external onlyOwner { + require(newQuorum <= 100, "Voting: invalid quorum"); + quorum = newQuorum; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/interfaces/IAggregator.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/interfaces/IAggregator.sol new file mode 100644 index 0000000..11c88e6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/interfaces/IAggregator.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IAggregator + * @notice Interface for oracle aggregator (Chainlink-compatible) + */ +interface IAggregator { + function latestAnswer() external view returns (int256); + + function latestRoundData() + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ); + + function getRoundData(uint80 _roundId) + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ); + + function updateAnswer(uint256 answer) external; + + function decimals() external view returns (uint8); + function description() external view returns (string memory); + function version() external view returns (uint256); + function latestRound() external view returns (uint256); +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/ComplianceGuard.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/ComplianceGuard.sol new file mode 100644 index 0000000..75a34b1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/ComplianceGuard.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./interfaces/IComplianceGuard.sol"; +import "./libraries/ISO4217WCompliance.sol"; + +/** + * @title ComplianceGuard + * @notice Enforces compliance rules for ISO-4217 W tokens + * @dev Hard constraints: m=1.0, GRU isolation, reserve constraints + */ +contract ComplianceGuard is IComplianceGuard, AccessControl { + bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ADMIN_ROLE, admin); + } + + /** + * @notice Validate mint operation + * @param currencyCode ISO-4217 currency code + * @param amount Amount to mint + * @param currentSupply Current token supply + * @param verifiedReserve Verified reserve balance + * @return isValid True if mint is compliant + * @return reasonCode Reason if not compliant + */ + function validateMint( + string memory currencyCode, + uint256 amount, + uint256 currentSupply, + uint256 verifiedReserve + ) external pure override returns (bool isValid, bytes32 reasonCode) { + // Check ISO-4217 format + if (!ISO4217WCompliance.isValidISO4217Format(currencyCode)) { + return (false, keccak256("INVALID_ISO4217_FORMAT")); + } + + // Check GRU isolation + if (ISO4217WCompliance.violatesGRUIsolation(currencyCode)) { + return (false, keccak256("GRU_ISOLATION_VIOLATION")); + } + + // Validate money multiplier = 1.0 + (bool multiplierValid, bytes32 multiplierReason) = ISO4217WCompliance.validateMoneyMultiplier( + verifiedReserve, + currentSupply + ); + if (!multiplierValid) { + return (false, multiplierReason); + } + + // Validate reserve for mint + (bool reserveValid, bytes32 reserveReason) = ISO4217WCompliance.validateReserveForMint( + verifiedReserve, + currentSupply, + amount + ); + if (!reserveValid) { + return (false, reserveReason); + } + + // Event emission removed - this is a pure function for validation only + // Events should be emitted by calling functions if needed + return (true, bytes32(0)); + } + + /** + * @notice Validate that money multiplier = 1.0 + * @dev Hard constraint: m = 1.0 (no fractional reserve) + * @param reserve Reserve balance + * @param supply Token supply + * @return isValid True if multiplier = 1.0 + */ + function validateMoneyMultiplier(uint256 reserve, uint256 supply) external pure override returns (bool isValid) { + (isValid, ) = ISO4217WCompliance.validateMoneyMultiplier(reserve, supply); + } + + /** + * @notice Check if currency is ISO-4217 compliant + * @param currencyCode Currency code to validate + * @return isISO4217 True if ISO-4217 compliant + */ + function isISO4217Compliant(string memory currencyCode) external pure override returns (bool isISO4217) { + return ISO4217WCompliance.isValidISO4217Format(currencyCode) && + !ISO4217WCompliance.violatesGRUIsolation(currencyCode); + } + + /** + * @notice Check if operation violates GRU isolation + * @param currencyCode Currency code + * @return violatesIsolation True if GRU linkage detected + */ + function violatesGRUIsolation(string memory currencyCode) external pure override returns (bool violatesIsolation) { + return ISO4217WCompliance.violatesGRUIsolation(currencyCode); + } + + /** + * @notice Validate reserve sufficiency + * @param reserve Reserve balance + * @param supply Token supply + * @return isSufficient True if reserve >= supply + */ + function isReserveSufficient(uint256 reserve, uint256 supply) external pure override returns (bool isSufficient) { + return ISO4217WCompliance.isReserveSufficient(reserve, supply); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/ISO4217WToken.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/ISO4217WToken.sol new file mode 100644 index 0000000..777641c --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/ISO4217WToken.sol @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "./interfaces/IISO4217WToken.sol"; +import "./libraries/ISO4217WCompliance.sol"; + +/** + * @title ISO4217WToken + * @notice ISO-4217 W token (e.g., USDW, EURW, GBPW) - M1 eMoney token + * @dev Represents 1:1 redeemable digital claim on fiat currency + * + * COMPLIANCE: + * - Classification: M1 eMoney + * - Legal Tender: NO + * - Synthetic / Reserve Unit: NO + * - Commodity-Backed: NO + * - Money Multiplier: m = 1.0 (hard-fixed, no fractional reserve) + * - Backing: 1:1 with fiat currency in segregated custodial accounts + * - GRU Isolation: Direct/indirect GRU conversion prohibited + */ +contract ISO4217WToken is + IISO4217WToken, + Initializable, + ERC20Upgradeable, + AccessControlUpgradeable, + UUPSUpgradeable, + ReentrancyGuardUpgradeable +{ + using ISO4217WCompliance for *; + + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + bytes32 public constant RESERVE_UPDATE_ROLE = keccak256("RESERVE_UPDATE_ROLE"); + + string private _currencyCode; // ISO-4217 code (e.g., "USD") + uint8 private _decimals; // Token decimals (typically 2 for fiat) + uint256 private _verifiedReserve; // Verified reserve balance in base currency units + address private _custodian; + address private _mintController; + address private _burnController; + address private _complianceGuard; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /** + * @notice Initialize the ISO-4217 W token + * @param name Token name (e.g., "USDW Token") + * @param symbol Token symbol (e.g., "USDW") + * @param currencyCode_ ISO-4217 currency code (e.g., "USD") + * @param decimals_ Token decimals (typically 2 for fiat) + * @param custodian_ Custodian address + * @param mintController_ Mint controller address + * @param burnController_ Burn controller address + * @param complianceGuard_ Compliance guard address + * @param admin Admin address + */ + function initialize( + string memory name, + string memory symbol, + string memory currencyCode_, + uint8 decimals_, + address custodian_, + address mintController_, + address burnController_, + address complianceGuard_, + address admin + ) external initializer { + __ERC20_init(name, symbol); + __AccessControl_init(); + __UUPSUpgradeable_init(); + __ReentrancyGuard_init(); + + // Validate ISO-4217 format + require( + ISO4217WCompliance.isValidISO4217Format(currencyCode_), + "ISO4217WToken: invalid ISO-4217 format" + ); + + // Validate token symbol matches W pattern + require( + ISO4217WCompliance.validateTokenSymbol(currencyCode_, symbol), + "ISO4217WToken: token symbol must be W" + ); + + // Validate GRU isolation + require( + !ISO4217WCompliance.violatesGRUIsolation(currencyCode_), + "ISO4217WToken: GRU isolation violation" + ); + + require(custodian_ != address(0), "ISO4217WToken: zero custodian"); + require(mintController_ != address(0), "ISO4217WToken: zero mint controller"); + require(burnController_ != address(0), "ISO4217WToken: zero burn controller"); + require(complianceGuard_ != address(0), "ISO4217WToken: zero compliance guard"); + + _currencyCode = currencyCode_; + _decimals = decimals_; + _custodian = custodian_; + _mintController = mintController_; + _burnController = burnController_; + _complianceGuard = complianceGuard_; + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MINTER_ROLE, mintController_); + _grantRole(BURNER_ROLE, burnController_); + } + + /** + * @notice Get the ISO-4217 currency code this token represents + * @return currencyCode 3-letter ISO-4217 code + */ + function currencyCode() external view override returns (string memory) { + return _currencyCode; + } + + /** + * @notice Override totalSupply to resolve multiple inheritance conflict + * @return Total supply of tokens + */ + function totalSupply() public view override(ERC20Upgradeable, IISO4217WToken) returns (uint256) { + return super.totalSupply(); + } + + /** + * @notice Get verified reserve balance + * @return reserveBalance Reserve balance in base currency units + */ + function verifiedReserve() external view override returns (uint256) { + return _verifiedReserve; + } + + /** + * @notice Check if reserves are sufficient + * @dev Reserve MUST be >= supply (enforcing 1:1 backing) + * @return isSufficient True if verifiedReserve >= totalSupply + */ + function isReserveSufficient() external view override returns (bool) { + return ISO4217WCompliance.isReserveSufficient(_verifiedReserve, totalSupply()); + } + + /** + * @notice Get custodian address + */ + function custodian() external view override returns (address) { + return _custodian; + } + + /** + * @notice Get mint controller address + */ + function mintController() external view override returns (address) { + return _mintController; + } + + /** + * @notice Get burn controller address + */ + function burnController() external view override returns (address) { + return _burnController; + } + + /** + * @notice Get compliance guard address + */ + function complianceGuard() external view override returns (address) { + return _complianceGuard; + } + + /** + * @notice Update verified reserve (oracle/attestation) + * @dev Can only be called by authorized reserve update role + * @param newReserve New reserve balance + */ + function updateVerifiedReserve(uint256 newReserve) external onlyRole(RESERVE_UPDATE_ROLE) { + uint256 currentSupply = totalSupply(); + + // Enforce money multiplier = 1.0 + // Reserve MUST be >= supply (1:1 backing or better) + if (newReserve < currentSupply) { + emit ReserveInsufficient(newReserve, currentSupply); + // Do not revert - allow flagging for monitoring + } + + _verifiedReserve = newReserve; + emit ReserveUpdated(newReserve, block.timestamp); + } + + /** + * @notice Mint tokens (only by mint controller) + * @param to Recipient address + * @param amount Amount to mint + */ + function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) nonReentrant { + require(to != address(0), "ISO4217WToken: zero address"); + require(amount > 0, "ISO4217WToken: zero amount"); + + uint256 currentSupply = totalSupply(); + uint256 newSupply = currentSupply + amount; + + // Enforce money multiplier = 1.0 + // Reserve MUST be >= new supply (1:1 backing) + require( + _verifiedReserve >= newSupply, + "ISO4217WToken: reserve insufficient - money multiplier violation" + ); + + _mint(to, amount); + emit Minted(to, amount, _currencyCode); + } + + /** + * @notice Burn tokens (only by burn controller) + * @param from Source address + * @param amount Amount to burn + */ + function burn(address from, uint256 amount) external onlyRole(BURNER_ROLE) nonReentrant { + require(amount > 0, "ISO4217WToken: zero amount"); + + _burn(from, amount); + emit Burned(from, amount, _currencyCode); + } + + /** + * @notice Override decimals (typically 2 for fiat currencies) + */ + function decimals() public view virtual override returns (uint8) { + return _decimals; + } + + /** + * @notice Authorize upgrade (UUPS) + * @dev Only non-monetary components may be upgraded + */ + function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) { + // In production, add checks to ensure monetary logic is immutable + // Only allow upgrades to non-monetary components + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/TokenFactory.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/TokenFactory.sol new file mode 100644 index 0000000..9a33c40 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/TokenFactory.sol @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import "./ISO4217WToken.sol"; +import "./interfaces/ITokenRegistry.sol"; +import "./interfaces/IComplianceGuard.sol"; +import "./libraries/ISO4217WCompliance.sol"; + +/** + * @title TokenFactory + * @notice Factory for deploying ISO-4217 W tokens + * @dev Creates UUPS upgradeable proxy tokens with proper configuration + */ +contract TokenFactory is AccessControl { + bytes32 public constant DEPLOYER_ROLE = keccak256("DEPLOYER_ROLE"); + + address public immutable tokenImplementation; + ITokenRegistry public tokenRegistry; + IComplianceGuard public complianceGuard; + address public reserveOracle; + address public mintController; + address public burnController; + + event TokenDeployed( + address indexed token, + string indexed currencyCode, + string tokenSymbol, + address indexed custodian + ); + + constructor( + address admin, + address tokenImplementation_, + address tokenRegistry_, + address complianceGuard_, + address reserveOracle_, + address mintController_, + address burnController_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(DEPLOYER_ROLE, admin); + + tokenImplementation = tokenImplementation_; + tokenRegistry = ITokenRegistry(tokenRegistry_); + complianceGuard = IComplianceGuard(complianceGuard_); + reserveOracle = reserveOracle_; + mintController = mintController_; + burnController = burnController_; + } + + /** + * @notice Deploy a new ISO-4217 W token + * @param currencyCode ISO-4217 currency code (e.g., "USD") + * @param name Token name (e.g., "USDW Token") + * @param symbol Token symbol (must be W, e.g., "USDW") + * @param decimals Token decimals (typically 2 for fiat) + * @param custodian Custodian address + * @return token Address of deployed token + */ + function deployToken( + string memory currencyCode, + string memory name, + string memory symbol, + uint8 decimals, + address custodian + ) external onlyRole(DEPLOYER_ROLE) returns (address token) { + // Validate ISO-4217 format + require( + ISO4217WCompliance.isValidISO4217Format(currencyCode), + "TokenFactory: invalid ISO-4217 format" + ); + + // Validate GRU isolation + require( + !ISO4217WCompliance.violatesGRUIsolation(currencyCode), + "TokenFactory: GRU isolation violation" + ); + + // Validate token symbol matches W pattern + require( + ISO4217WCompliance.validateTokenSymbol(currencyCode, symbol), + "TokenFactory: token symbol must be W" + ); + + require(custodian != address(0), "TokenFactory: zero custodian"); + require(bytes(name).length > 0, "TokenFactory: empty name"); + require(bytes(symbol).length > 0, "TokenFactory: empty symbol"); + + // Deploy UUPS proxy + bytes memory initData = abi.encodeWithSelector( + ISO4217WToken.initialize.selector, + name, + symbol, + currencyCode, + decimals, + custodian, + mintController, + burnController, + address(complianceGuard), + msg.sender // Admin + ); + + ERC1967Proxy proxy = new ERC1967Proxy(tokenImplementation, initData); + token = address(proxy); + + // Grant reserve update role to oracle + ISO4217WToken(token).grantRole(keccak256("RESERVE_UPDATE_ROLE"), reserveOracle); + + // Register token in registry + tokenRegistry.registerToken(currencyCode, token, symbol, decimals, custodian); + tokenRegistry.setMintController(currencyCode, mintController); + tokenRegistry.setBurnController(currencyCode, burnController); + + emit TokenDeployed(token, currencyCode, symbol, custodian); + } + + /** + * @notice Set system contract addresses + */ + function setTokenRegistry(address tokenRegistry_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(tokenRegistry_ != address(0), "TokenFactory: zero address"); + tokenRegistry = ITokenRegistry(tokenRegistry_); + } + + function setComplianceGuard(address complianceGuard_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(complianceGuard_ != address(0), "TokenFactory: zero address"); + complianceGuard = IComplianceGuard(complianceGuard_); + } + + function setReserveOracle(address reserveOracle_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(reserveOracle_ != address(0), "TokenFactory: zero address"); + reserveOracle = reserveOracle_; + } + + function setMintController(address mintController_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(mintController_ != address(0), "TokenFactory: zero address"); + mintController = mintController_; + } + + function setBurnController(address burnController_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(burnController_ != address(0), "TokenFactory: zero address"); + burnController = burnController_; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/controllers/BurnController.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/controllers/BurnController.sol new file mode 100644 index 0000000..a73897a --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/controllers/BurnController.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../interfaces/IBurnController.sol"; +import "../interfaces/IISO4217WToken.sol"; + +/** + * @title BurnController + * @notice Controls burning of ISO-4217 W tokens on redemption + * @dev Burn-before-release sequence for on-demand redemption at par + */ +contract BurnController is IBurnController, AccessControl, ReentrancyGuard { + bytes32 public constant REDEEMER_ROLE = keccak256("REDEEMER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + + uint256 private _redemptionCounter; + + mapping(address => bool) public isApprovedToken; + mapping(bytes32 => Redemption) public redemptions; + + struct Redemption { + address token; + address redeemer; + uint256 amount; + uint256 timestamp; + bool processed; + } + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REDEEMER_ROLE, admin); + _grantRole(BURNER_ROLE, admin); + } + + /** + * @notice Redeem tokens (burn and release fiat) + * @param token Token address + * @param from Redeemer address + * @param amount Amount to redeem (in token decimals) + * @return redemptionId Redemption ID for tracking + */ + function redeem( + address token, + address from, + uint256 amount + ) external override nonReentrant onlyRole(REDEEMER_ROLE) returns (bytes32 redemptionId) { + require(isApprovedToken[token], "BurnController: token not approved"); + require(amount > 0, "BurnController: zero amount"); + require(from != address(0), "BurnController: zero address"); + + // Check if redemption is allowed + require(this.canRedeem(token, amount), "BurnController: redemption not allowed"); + + // Burn tokens (atomic burn-before-release sequence) + IISO4217WToken tokenContract = IISO4217WToken(token); + tokenContract.burn(from, amount); + + // Generate redemption ID + _redemptionCounter++; + redemptionId = keccak256(abi.encodePacked(token, from, amount, _redemptionCounter, block.timestamp)); + + // Record redemption + redemptions[redemptionId] = Redemption({ + token: token, + redeemer: from, + amount: amount, + timestamp: block.timestamp, + processed: true + }); + + // Note: Fiat release happens off-chain or via separate payment system + // This contract handles the token burn portion + + emit Redeemed(token, from, amount, redemptionId); + } + + /** + * @notice Burn tokens without redemption (emergency/transfer) + * @param token Token address + * @param from Source address + * @param amount Amount to burn + */ + function burn(address token, address from, uint256 amount) external override nonReentrant onlyRole(BURNER_ROLE) { + require(isApprovedToken[token], "BurnController: token not approved"); + require(amount > 0, "BurnController: zero amount"); + + IISO4217WToken tokenContract = IISO4217WToken(token); + tokenContract.burn(from, amount); + + emit Burned(token, from, amount); + } + + /** + * @notice Check if redemption is allowed + * @param token Token address + * @param amount Amount to redeem + * @return canRedeem True if redemption is allowed + */ + function canRedeem(address token, uint256 amount) external view override returns (bool canRedeem) { + if (!isApprovedToken[token]) { + return false; + } + + IISO4217WToken tokenContract = IISO4217WToken(token); + uint256 totalSupply = tokenContract.totalSupply(); + + // Redemption is allowed if supply >= amount + // Additional checks (e.g., reserve sufficiency) would be added here + return totalSupply >= amount; + } + + /** + * @notice Approve a token for burning/redemption + * @param token Token address + */ + function approveToken(address token) external onlyRole(DEFAULT_ADMIN_ROLE) { + isApprovedToken[token] = true; + } + + /** + * @notice Revoke token approval + * @param token Token address + */ + function revokeToken(address token) external onlyRole(DEFAULT_ADMIN_ROLE) { + isApprovedToken[token] = false; + } + + /** + * @notice Get redemption information + * @param redemptionId Redemption ID + * @return redemption Redemption struct + */ + function getRedemption(bytes32 redemptionId) external view returns (Redemption memory redemption) { + return redemptions[redemptionId]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/controllers/MintController.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/controllers/MintController.sol new file mode 100644 index 0000000..d78ad08 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/controllers/MintController.sol @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../interfaces/IMintController.sol"; +import "../interfaces/IISO4217WToken.sol"; +import {IReserveOracle} from "../interfaces/IReserveOracle.sol"; +import {IComplianceGuard} from "../interfaces/IComplianceGuard.sol"; + +/** + * @title MintController + * @notice Controls minting of ISO-4217 W tokens with reserve verification + * @dev Minting requires: verified fiat settlement, custodian attestation, oracle quorum + */ +contract MintController is IMintController, AccessControl, ReentrancyGuard { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + + IReserveOracle public reserveOracle; + IComplianceGuard public complianceGuard; + + mapping(address => bool) public isApprovedToken; + + constructor(address admin, address reserveOracle_, address complianceGuard_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MINTER_ROLE, admin); + reserveOracle = IReserveOracle(reserveOracle_); + complianceGuard = IComplianceGuard(complianceGuard_); + } + + /** + * @notice Mint tokens (requires reserve verification) + * @param token Token address + * @param to Recipient address + * @param amount Amount to mint (in token decimals) + * @param settlementId Fiat settlement ID for audit trail + */ + function mint( + address token, + address to, + uint256 amount, + bytes32 settlementId + ) external override nonReentrant onlyRole(MINTER_ROLE) { + require(isApprovedToken[token], "MintController: token not approved"); + require(amount > 0, "MintController: zero amount"); + require(to != address(0), "MintController: zero address"); + + IISO4217WToken tokenContract = IISO4217WToken(token); + string memory currencyCode = tokenContract.currencyCode(); + + // Check if minting is allowed + (bool canMint, bytes32 reasonCode) = this.canMint(token, amount); + require(canMint, string(abi.encodePacked("MintController: mint not allowed: ", reasonCode))); + + // Mint tokens + tokenContract.mint(to, amount); + + emit MintExecuted(token, to, amount, settlementId); + } + + /** + * @notice Check if minting is allowed + * @param token Token address + * @param amount Amount to mint + * @return canMint True if minting is allowed + * @return reasonCode Reason if not allowed + */ + function canMint(address token, uint256 amount) external view override returns (bool canMint, bytes32 reasonCode) { + require(isApprovedToken[token], "MintController: token not approved"); + + IISO4217WToken tokenContract = IISO4217WToken(token); + string memory currencyCode = tokenContract.currencyCode(); + + // Check oracle quorum + if (!this.isOracleQuorumMet(token)) { + return (false, keccak256("ORACLE_QUORUM_NOT_MET")); + } + + // Get verified reserve + (uint256 verifiedReserve, ) = reserveOracle.getVerifiedReserve(currencyCode); + uint256 currentSupply = tokenContract.totalSupply(); + + // Validate mint with compliance guard + (bool isValid, bytes32 complianceReason) = complianceGuard.validateMint( + currencyCode, + amount, + currentSupply, + verifiedReserve + ); + + if (!isValid) { + return (false, complianceReason); + } + + return (true, bytes32(0)); + } + + /** + * @notice Check if oracle quorum is met + * @param token Token address + * @return quorumMet True if quorum is met + */ + function isOracleQuorumMet(address token) external view override returns (bool quorumMet) { + IISO4217WToken tokenContract = IISO4217WToken(token); + string memory currencyCode = tokenContract.currencyCode(); + + (quorumMet, ) = reserveOracle.isQuorumMet(currencyCode); + } + + /** + * @notice Approve a token for minting + * @param token Token address + */ + function approveToken(address token) external onlyRole(DEFAULT_ADMIN_ROLE) { + isApprovedToken[token] = true; + } + + /** + * @notice Revoke token approval + * @param token Token address + */ + function revokeToken(address token) external onlyRole(DEFAULT_ADMIN_ROLE) { + isApprovedToken[token] = false; + } + + /** + * @notice Set reserve oracle address + * @param reserveOracle_ New oracle address + */ + function setReserveOracle(address reserveOracle_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(reserveOracle_ != address(0), "MintController: zero address"); + reserveOracle = IReserveOracle(reserveOracle_); + } + + /** + * @notice Set compliance guard address + * @param complianceGuard_ New guard address + */ + function setComplianceGuard(address complianceGuard_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(complianceGuard_ != address(0), "MintController: zero address"); + complianceGuard = IComplianceGuard(complianceGuard_); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IBurnController.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IBurnController.sol new file mode 100644 index 0000000..dddf710 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IBurnController.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IBurnController + * @notice Interface for burning ISO-4217 W tokens on redemption + * @dev Burn-before-release sequence for on-demand redemption at par + */ +interface IBurnController { + /** + * @notice Redeem tokens (burn and release fiat) + * @param token Token address + * @param from Redeemer address + * @param amount Amount to redeem (in token decimals) + * @return redemptionId Redemption ID for tracking + */ + function redeem(address token, address from, uint256 amount) external returns (bytes32 redemptionId); + + /** + * @notice Burn tokens without redemption (emergency/transfer) + * @param token Token address + * @param from Source address + * @param amount Amount to burn + */ + function burn(address token, address from, uint256 amount) external; + + /** + * @notice Check if redemption is allowed + * @param token Token address + * @param amount Amount to redeem + * @return canRedeem True if redemption is allowed + */ + function canRedeem(address token, uint256 amount) external view returns (bool canRedeem); + + event Redeemed( + address indexed token, + address indexed from, + uint256 amount, + bytes32 indexed redemptionId + ); + event Burned(address indexed token, address indexed from, uint256 amount); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IComplianceGuard.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IComplianceGuard.sol new file mode 100644 index 0000000..2df1053 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IComplianceGuard.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IComplianceGuard + * @notice Interface for compliance guard enforcing ISO-4217 W token rules + * @dev Ensures GRU isolation, money multiplier = 1.0, reserve constraints + */ +interface IComplianceGuard { + /** + * @notice Validate mint operation + * @param currencyCode ISO-4217 currency code + * @param amount Amount to mint + * @param currentSupply Current token supply + * @param verifiedReserve Verified reserve balance + * @return isValid True if mint is compliant + * @return reasonCode Reason if not compliant + */ + function validateMint( + string memory currencyCode, + uint256 amount, + uint256 currentSupply, + uint256 verifiedReserve + ) external view returns (bool isValid, bytes32 reasonCode); + + /** + * @notice Validate that money multiplier = 1.0 + * @dev Hard constraint: m = 1.0 (no fractional reserve) + * @param reserve Reserve balance + * @param supply Token supply + * @return isValid True if multiplier = 1.0 + */ + function validateMoneyMultiplier(uint256 reserve, uint256 supply) external pure returns (bool isValid); + + /** + * @notice Check if currency is ISO-4217 compliant + * @param currencyCode Currency code to validate + * @return isISO4217 True if ISO-4217 compliant + */ + function isISO4217Compliant(string memory currencyCode) external pure returns (bool isISO4217); + + /** + * @notice Check if operation violates GRU isolation + * @param currencyCode Currency code + * @return violatesIsolation True if GRU linkage detected + */ + function violatesGRUIsolation(string memory currencyCode) external pure returns (bool violatesIsolation); + + /** + * @notice Validate reserve sufficiency + * @param reserve Reserve balance + * @param supply Token supply + * @return isSufficient True if reserve >= supply + */ + function isReserveSufficient(uint256 reserve, uint256 supply) external pure returns (bool isSufficient); + + event ComplianceCheckPassed(string indexed currencyCode, bytes32 checkType); + event ComplianceCheckFailed(string indexed currencyCode, bytes32 checkType, bytes32 reasonCode); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IISO4217WToken.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IISO4217WToken.sol new file mode 100644 index 0000000..5bb37e6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IISO4217WToken.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IISO4217WToken + * @notice Interface for ISO-4217 W tokens (e.g., USDW, EURW, GBPW) + * @dev M1 eMoney tokens representing 1:1 redeemable digital claims on fiat currency + * + * COMPLIANCE: + * - Classification: M1 eMoney + * - Legal Tender: NO + * - Synthetic / Reserve Unit: NO + * - Commodity-Backed: NO + * - Money Multiplier: m = 1.0 (fixed, no fractional reserve) + */ +interface IISO4217WToken { + /** + * @notice Get the ISO-4217 currency code this token represents + * @return currencyCode 3-letter ISO-4217 code (e.g., "USD") + */ + function currencyCode() external view returns (string memory); + + /** + * @notice Get total supply of tokens + * @return supply Total supply + */ + function totalSupply() external view returns (uint256); + + /** + * @notice Get verified reserve balance for this currency + * @return reserveBalance Reserve balance in base currency units + */ + function verifiedReserve() external view returns (uint256); + + /** + * @notice Check if reserves are sufficient + * @return isSufficient True if verifiedReserve >= totalSupply + */ + function isReserveSufficient() external view returns (bool); + + /** + * @notice Get custodian address + * @return custodian Custodian address + */ + function custodian() external view returns (address); + + /** + * @notice Get mint controller address + * @return mintController Mint controller address + */ + function mintController() external view returns (address); + + /** + * @notice Get burn controller address + * @return burnController Burn controller address + */ + function burnController() external view returns (address); + + /** + * @notice Get compliance guard address + * @return complianceGuard Compliance guard address + */ + function complianceGuard() external view returns (address); + + /** + * @notice Mint tokens to an address + * @param to Address to mint to + * @param amount Amount to mint + */ + function mint(address to, uint256 amount) external; + + /** + * @notice Burn tokens from an address + * @param from Address to burn from + * @param amount Amount to burn + */ + function burn(address from, uint256 amount) external; + + event Minted(address indexed to, uint256 amount, string indexed currencyCode); + event Burned(address indexed from, uint256 amount, string indexed currencyCode); + event ReserveUpdated(uint256 newReserve, uint256 timestamp); + event ReserveInsufficient(uint256 reserve, uint256 supply); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IMintController.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IMintController.sol new file mode 100644 index 0000000..f97f38a --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IMintController.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IMintController + * @notice Interface for minting ISO-4217 W tokens with reserve verification + * @dev Minting requires: verified fiat settlement, custodian attestation, oracle quorum + */ +interface IMintController { + /** + * @notice Mint tokens (requires reserve verification) + * @param token Token address + * @param to Recipient address + * @param amount Amount to mint (in token decimals) + * @param settlementId Fiat settlement ID for audit trail + */ + function mint(address token, address to, uint256 amount, bytes32 settlementId) external; + + /** + * @notice Check if minting is allowed + * @param token Token address + * @param amount Amount to mint + * @return canMint True if minting is allowed + * @return reasonCode Reason if not allowed + */ + function canMint(address token, uint256 amount) external view returns (bool canMint, bytes32 reasonCode); + + /** + * @notice Check if oracle quorum is met + * @param token Token address + * @return quorumMet True if quorum is met + */ + function isOracleQuorumMet(address token) external view returns (bool quorumMet); + + event MintExecuted( + address indexed token, + address indexed to, + uint256 amount, + bytes32 indexed settlementId + ); + event MintRejected(address indexed token, uint256 amount, bytes32 reasonCode); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IReserveOracle.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IReserveOracle.sol new file mode 100644 index 0000000..f95a6fe --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/IReserveOracle.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IReserveOracle + * @notice Interface for reserve verification oracles + * @dev Quorum-based oracle system for verifying fiat reserves + */ +interface IReserveOracle { + struct ReserveReport { + address reporter; + uint256 reserveBalance; + uint256 timestamp; + bytes32 attestationHash; + bool isValid; + } + + /** + * @notice Submit reserve report for a currency + * @param currencyCode ISO-4217 currency code + * @param reserveBalance Reserve balance in base currency units + * @param attestationHash Hash of custodian attestation + */ + function submitReserveReport( + string memory currencyCode, + uint256 reserveBalance, + bytes32 attestationHash + ) external; + + /** + * @notice Get verified reserve balance for a currency + * @param currencyCode ISO-4217 currency code + * @return reserveBalance Verified reserve balance + * @return timestamp Last update timestamp + */ + function getVerifiedReserve(string memory currencyCode) external view returns ( + uint256 reserveBalance, + uint256 timestamp + ); + + /** + * @notice Check if oracle quorum is met for a currency + * @param currencyCode ISO-4217 currency code + * @return quorumMet True if quorum is met + * @return reportCount Number of valid reports + */ + function isQuorumMet(string memory currencyCode) external view returns (bool quorumMet, uint256 reportCount); + + /** + * @notice Get consensus reserve balance (median/average of quorum reports) + * @param currencyCode ISO-4217 currency code + * @return consensusReserve Consensus reserve balance + */ + function getConsensusReserve(string memory currencyCode) external view returns (uint256 consensusReserve); + + event ReserveReportSubmitted( + string indexed currencyCode, + address indexed reporter, + uint256 reserveBalance, + uint256 timestamp + ); + event QuorumMet(string indexed currencyCode, uint256 consensusReserve); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/ITokenRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/ITokenRegistry.sol new file mode 100644 index 0000000..50a74b4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/interfaces/ITokenRegistry.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ITokenRegistry + * @notice Interface for ISO-4217 W token registry + * @dev Canonical registry mapping ISO-4217 codes to token addresses + */ +interface ITokenRegistry { + struct TokenInfo { + address tokenAddress; + string currencyCode; // ISO-4217 code (e.g., "USD") + string tokenSymbol; // Token symbol (e.g., "USDW") + uint8 decimals; + address custodian; + address mintController; + address burnController; + bool isActive; + uint256 createdAt; + } + + /** + * @notice Register a new ISO-4217 W token + * @param currencyCode ISO-4217 currency code (must be valid ISO-4217) + * @param tokenAddress Token contract address + * @param tokenSymbol Token symbol (should be W format) + * @param decimals Token decimals (typically 2 for fiat currencies) + * @param custodian Custodian address + */ + function registerToken( + string memory currencyCode, + address tokenAddress, + string memory tokenSymbol, + uint8 decimals, + address custodian + ) external; + + /** + * @notice Get token address for ISO-4217 code + * @param currencyCode ISO-4217 currency code + * @return tokenAddress Token contract address + */ + function getTokenAddress(string memory currencyCode) external view returns (address tokenAddress); + + /** + * @notice Get token info for ISO-4217 code + * @param currencyCode ISO-4217 currency code + * @return info Token information + */ + function getTokenInfo(string memory currencyCode) external view returns (TokenInfo memory info); + + /** + * @notice Check if currency code is registered + * @param currencyCode ISO-4217 currency code + * @return isRegistered True if registered + */ + function isRegistered(string memory currencyCode) external view returns (bool isRegistered); + + /** + * @notice Deactivate a token (emergency) + * @param currencyCode ISO-4217 currency code + */ + function deactivateToken(string memory currencyCode) external; + + /** + * @notice Set mint controller for a token + * @param currencyCode ISO-4217 currency code + * @param mintController Mint controller address + */ + function setMintController(string memory currencyCode, address mintController) external; + + /** + * @notice Set burn controller for a token + * @param currencyCode ISO-4217 currency code + * @param burnController Burn controller address + */ + function setBurnController(string memory currencyCode, address burnController) external; + + event TokenRegistered( + string indexed currencyCode, + address indexed tokenAddress, + string tokenSymbol, + address indexed custodian + ); + event TokenDeactivated(string indexed currencyCode, uint256 timestamp); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/libraries/ISO4217WCompliance.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/libraries/ISO4217WCompliance.sol new file mode 100644 index 0000000..045e0fd --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/libraries/ISO4217WCompliance.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ISO4217WCompliance + * @notice Compliance library for ISO-4217 W tokens + * @dev Enforces hard constraints: m=1.0, GRU isolation, reserve constraints + * + * MANDATORY CONSTRAINTS: + * - Classification: M1 eMoney (NOT legal tender, NOT synthetic, NOT commodity-backed) + * - Money Multiplier: m = 1.0 (hard-fixed, no fractional reserve) + * - Backing: 1:1 with fiat currency in segregated custodial accounts + * - GRU Isolation: Direct or indirect GRU conversion prohibited + */ +library ISO4217WCompliance { + /** + * @notice Money multiplier constant (hard-fixed at 1.0) + * @dev MANDATORY: m = 1.0 (no fractional reserve) + */ + uint256 public constant MONEY_MULTIPLIER = 1e18; // 1.0 in 18 decimals + uint256 public constant BASIS_POINTS = 10000; + + /** + * @notice Validate money multiplier = 1.0 + * @dev Hard constraint: m MUST equal 1.0 + * @param reserve Reserve balance + * @param supply Token supply + * @return isValid True if reserve >= supply (enforcing m = 1.0) + * @return reasonCode Reason if invalid + */ + function validateMoneyMultiplier(uint256 reserve, uint256 supply) internal pure returns ( + bool isValid, + bytes32 reasonCode + ) { + // Money multiplier m = 1.0 means: reserve >= supply (exactly 1:1 or better) + if (reserve < supply) { + return (false, keccak256("RESERVE_INSUFFICIENT")); + } + + // Allow reserve >= supply (1:1 or better backing) + // Reject any logic that implies m > 1.0 (fractional reserve) + return (true, bytes32(0)); + } + + /** + * @notice Validate reserve sufficiency for minting + * @dev MANDATORY: verifiedReserve >= totalSupply + amount (enforces 1:1 backing) + * @param currentReserve Current verified reserve + * @param currentSupply Current token supply + * @param mintAmount Amount to mint + * @return isValid True if reserve is sufficient + * @return reasonCode Reason if invalid + */ + function validateReserveForMint( + uint256 currentReserve, + uint256 currentSupply, + uint256 mintAmount + ) internal pure returns (bool isValid, bytes32 reasonCode) { + uint256 newSupply = currentSupply + mintAmount; + + // Constraint: verifiedReserve >= totalSupply + amount + if (currentReserve < newSupply) { + return (false, keccak256("RESERVE_INSUFFICIENT_FOR_MINT")); + } + + return (true, bytes32(0)); + } + + /** + * @notice Check if currency code violates GRU isolation + * @dev GRU identifiers are protocol-blacklisted + * @param currencyCode Currency code to check + * @return violatesIsolation True if GRU linkage detected + */ + function violatesGRUIsolation(string memory currencyCode) internal pure returns (bool violatesIsolation) { + bytes32 codeHash = keccak256(bytes(currencyCode)); + + // Blacklist GRU identifiers + return codeHash == keccak256("GRU") || + codeHash == keccak256("M00") || + codeHash == keccak256("M0") || + codeHash == keccak256("M1"); + } + + /** + * @notice Validate ISO-4217 currency code format + * @dev ISO-4217 codes are exactly 3 uppercase letters + * @param currencyCode Currency code to validate + * @return isValid True if valid ISO-4217 format + */ + function isValidISO4217Format(string memory currencyCode) internal pure returns (bool isValid) { + bytes memory codeBytes = bytes(currencyCode); + if (codeBytes.length != 3) { + return false; + } + + for (uint256 i = 0; i < 3; i++) { + uint8 char = uint8(codeBytes[i]); + if (char < 65 || char > 90) { // Not A-Z + return false; + } + } + + return true; + } + + /** + * @notice Validate token symbol matches W pattern + * @dev Token symbol MUST be W (e.g., USDW, EURW) + * @param currencyCode ISO-4217 currency code + * @param tokenSymbol Token symbol + * @return isValid True if symbol matches pattern + */ + function validateTokenSymbol(string memory currencyCode, string memory tokenSymbol) internal pure returns (bool isValid) { + // Check if tokenSymbol is currencyCode + "W" + string memory expectedSymbol = string(abi.encodePacked(currencyCode, "W")); + return keccak256(bytes(tokenSymbol)) == keccak256(bytes(expectedSymbol)); + } + + /** + * @notice Check if reserve is sufficient + * @dev Reserve MUST be >= supply (enforcing 1:1 backing) + * @param reserve Reserve balance + * @param supply Token supply + * @return isSufficient True if reserve >= supply + */ + function isReserveSufficient(uint256 reserve, uint256 supply) internal pure returns (bool isSufficient) { + return reserve >= supply; + } + + /** + * @notice Calculate money multiplier (should always be 1.0) + * @dev For validation/analytics only - MUST NOT influence issuance or pricing + * @param reserve Reserve balance + * @param supply Token supply + * @return multiplier Money multiplier (should be 1.0 in 18 decimals) + */ + function calculateMoneyMultiplier(uint256 reserve, uint256 supply) internal pure returns (uint256 multiplier) { + if (supply == 0) { + return MONEY_MULTIPLIER; // 1.0 + } + + // m = reserve / supply + // Should be >= 1.0 (1:1 or better backing) + return (reserve * 1e18) / supply; + } + + /** + * @notice Require money multiplier = 1.0 (revert if violated) + * @param reserve Reserve balance + * @param supply Token supply + */ + function requireMoneyMultiplier(uint256 reserve, uint256 supply) internal pure { + require(reserve >= supply, "ISO4217WCompliance: money multiplier violation - reserve < supply"); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/oracle/ReserveOracle.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/oracle/ReserveOracle.sol new file mode 100644 index 0000000..a45971e --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/oracle/ReserveOracle.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../interfaces/IReserveOracle.sol"; + +/** + * @title ReserveOracle + * @notice Quorum-based oracle system for verifying fiat reserves + * @dev Requires quorum of oracle reports before accepting reserve values + */ +contract ReserveOracle is IReserveOracle, AccessControl, ReentrancyGuard { + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + uint256 public quorumThreshold; // Number of reports required for quorum (default: 3) + uint256 public stalenessThreshold; // Maximum age of reports in seconds (default: 3600 = 1 hour) + + // Currency code => ReserveReport[] + mapping(string => ReserveReport[]) private _reports; + + // Currency code => verified reserve (consensus value) + mapping(string => uint256) private _verifiedReserves; + mapping(string => uint256) private _lastUpdate; + + // Track valid oracles + mapping(address => bool) public isOracle; + + constructor(address admin, uint256 quorumThreshold_, uint256 stalenessThreshold_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + quorumThreshold = quorumThreshold_; + stalenessThreshold = stalenessThreshold_; + isOracle[admin] = true; + } + + /** + * @notice Submit reserve report for a currency + * @param currencyCode ISO-4217 currency code + * @param reserveBalance Reserve balance in base currency units + * @param attestationHash Hash of custodian attestation + */ + function submitReserveReport( + string memory currencyCode, + uint256 reserveBalance, + bytes32 attestationHash + ) external override onlyRole(ORACLE_ROLE) nonReentrant { + require(isOracle[msg.sender], "ReserveOracle: not authorized oracle"); + require(reserveBalance > 0, "ReserveOracle: zero reserve"); + + // Validate ISO-4217 format (basic check) + bytes memory codeBytes = bytes(currencyCode); + require(codeBytes.length == 3, "ReserveOracle: invalid currency code format"); + + // Remove stale reports + _removeStaleReports(currencyCode); + + // Add new report + _reports[currencyCode].push(ReserveReport({ + reporter: msg.sender, + reserveBalance: reserveBalance, + timestamp: block.timestamp, + attestationHash: attestationHash, + isValid: true + })); + + emit ReserveReportSubmitted(currencyCode, msg.sender, reserveBalance, block.timestamp); + + // Check if quorum is met and update verified reserve + (bool quorumMet, ) = this.isQuorumMet(currencyCode); + if (quorumMet) { + uint256 consensusReserve = this.getConsensusReserve(currencyCode); + _verifiedReserves[currencyCode] = consensusReserve; + _lastUpdate[currencyCode] = block.timestamp; + emit QuorumMet(currencyCode, consensusReserve); + } + } + + /** + * @notice Get verified reserve balance for a currency + * @param currencyCode ISO-4217 currency code + * @return reserveBalance Verified reserve balance + * @return timestamp Last update timestamp + */ + function getVerifiedReserve(string memory currencyCode) external view override returns ( + uint256 reserveBalance, + uint256 timestamp + ) { + return (_verifiedReserves[currencyCode], _lastUpdate[currencyCode]); + } + + /** + * @notice Check if oracle quorum is met for a currency + * @param currencyCode ISO-4217 currency code + * @return quorumMet True if quorum is met + * @return reportCount Number of valid reports + */ + function isQuorumMet(string memory currencyCode) external view override returns (bool quorumMet, uint256 reportCount) { + ReserveReport[] memory reports = _reports[currencyCode]; + uint256 validCount = 0; + + uint256 cutoffTime = block.timestamp > stalenessThreshold ? block.timestamp - stalenessThreshold : 0; + + for (uint256 i = 0; i < reports.length; i++) { + if (reports[i].isValid && reports[i].timestamp >= cutoffTime) { + validCount++; + } + } + + reportCount = validCount; + quorumMet = validCount >= quorumThreshold; + } + + /** + * @notice Get consensus reserve balance (median/average of quorum reports) + * @param currencyCode ISO-4217 currency code + * @return consensusReserve Consensus reserve balance + */ + function getConsensusReserve(string memory currencyCode) external view override returns (uint256 consensusReserve) { + ReserveReport[] memory reports = _reports[currencyCode]; + + // Remove stale and invalid reports + uint256[] memory validReserves = new uint256[](reports.length); + uint256 validCount = 0; + uint256 cutoffTime = block.timestamp > stalenessThreshold ? block.timestamp - stalenessThreshold : 0; + + for (uint256 i = 0; i < reports.length; i++) { + if (reports[i].isValid && reports[i].timestamp >= cutoffTime) { + validReserves[validCount] = reports[i].reserveBalance; + validCount++; + } + } + + if (validCount == 0) { + return 0; + } + + // Sort and calculate median (simple average if count is even) + // For simplicity, calculate average (in production, use median for robustness) + uint256 sum = 0; + for (uint256 i = 0; i < validCount; i++) { + sum += validReserves[i]; + } + + consensusReserve = sum / validCount; + } + + /** + * @notice Remove stale reports for a currency + * @param currencyCode ISO-4217 currency code + */ + function _removeStaleReports(string memory currencyCode) internal { + ReserveReport[] storage reports = _reports[currencyCode]; + uint256 cutoffTime = block.timestamp > stalenessThreshold ? block.timestamp - stalenessThreshold : 0; + + // Mark stale reports as invalid + for (uint256 i = 0; i < reports.length; i++) { + if (reports[i].timestamp < cutoffTime) { + reports[i].isValid = false; + } + } + } + + /** + * @notice Add oracle + * @param oracle Oracle address + */ + function addOracle(address oracle) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(oracle != address(0), "ReserveOracle: zero address"); + isOracle[oracle] = true; + _grantRole(ORACLE_ROLE, oracle); + } + + /** + * @notice Remove oracle + * @param oracle Oracle address + */ + function removeOracle(address oracle) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isOracle[oracle], "ReserveOracle: not an oracle"); + isOracle[oracle] = false; + _revokeRole(ORACLE_ROLE, oracle); + } + + /** + * @notice Set quorum threshold + * @param threshold New quorum threshold + */ + function setQuorumThreshold(uint256 threshold) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(threshold > 0, "ReserveOracle: zero threshold"); + quorumThreshold = threshold; + } + + /** + * @notice Set staleness threshold + * @param threshold New staleness threshold in seconds + */ + function setStalenessThreshold(uint256 threshold) external onlyRole(DEFAULT_ADMIN_ROLE) { + stalenessThreshold = threshold; + } + + /** + * @notice Get reports for a currency + * @param currencyCode ISO-4217 currency code + * @return reports Array of reserve reports + */ + function getReports(string memory currencyCode) external view returns (ReserveReport[] memory reports) { + return _reports[currencyCode]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/registry/TokenRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/registry/TokenRegistry.sol new file mode 100644 index 0000000..15caa3c --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/iso4217w/registry/TokenRegistry.sol @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interfaces/ITokenRegistry.sol"; +import "../libraries/ISO4217WCompliance.sol"; + +/** + * @title TokenRegistry + * @notice Canonical registry mapping ISO-4217 codes to W token addresses + * @dev Registry is immutable once published (tokens can be deactivated but not removed) + */ +contract TokenRegistry is ITokenRegistry, AccessControl { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + + // Currency code => TokenInfo + mapping(string => TokenInfo) private _tokens; + + // Track all registered currency codes + string[] private _registeredCurrencies; + mapping(string => bool) private _isRegistered; + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a new ISO-4217 W token + * @param currencyCode ISO-4217 currency code (must be valid ISO-4217) + * @param tokenAddress Token contract address + * @param tokenSymbol Token symbol (should be W format) + * @param decimals Token decimals (typically 2 for fiat currencies) + * @param custodian Custodian address + */ + function registerToken( + string memory currencyCode, + address tokenAddress, + string memory tokenSymbol, + uint8 decimals, + address custodian + ) external override onlyRole(REGISTRAR_ROLE) { + require(tokenAddress != address(0), "TokenRegistry: zero token address"); + require(custodian != address(0), "TokenRegistry: zero custodian"); + require(!_isRegistered[currencyCode], "TokenRegistry: already registered"); + + // Validate ISO-4217 format + require( + ISO4217WCompliance.isValidISO4217Format(currencyCode), + "TokenRegistry: invalid ISO-4217 format" + ); + + // Validate GRU isolation + require( + !ISO4217WCompliance.violatesGRUIsolation(currencyCode), + "TokenRegistry: GRU isolation violation" + ); + + // Validate token symbol matches W pattern + require( + ISO4217WCompliance.validateTokenSymbol(currencyCode, tokenSymbol), + "TokenRegistry: token symbol must be W" + ); + + // Create token info + TokenInfo memory info = TokenInfo({ + tokenAddress: tokenAddress, + currencyCode: currencyCode, + tokenSymbol: tokenSymbol, + decimals: decimals, + custodian: custodian, + mintController: address(0), // Set separately + burnController: address(0), // Set separately + isActive: true, + createdAt: block.timestamp + }); + + _tokens[currencyCode] = info; + _registeredCurrencies.push(currencyCode); + _isRegistered[currencyCode] = true; + + emit TokenRegistered(currencyCode, tokenAddress, tokenSymbol, custodian); + } + + /** + * @notice Set mint controller for a currency + * @param currencyCode ISO-4217 currency code + * @param mintController Mint controller address + */ + function setMintController(string memory currencyCode, address mintController) external onlyRole(REGISTRAR_ROLE) { + require(_isRegistered[currencyCode], "TokenRegistry: not registered"); + require(mintController != address(0), "TokenRegistry: zero address"); + _tokens[currencyCode].mintController = mintController; + } + + /** + * @notice Set burn controller for a currency + * @param currencyCode ISO-4217 currency code + * @param burnController Burn controller address + */ + function setBurnController(string memory currencyCode, address burnController) external onlyRole(REGISTRAR_ROLE) { + require(_isRegistered[currencyCode], "TokenRegistry: not registered"); + require(burnController != address(0), "TokenRegistry: zero address"); + _tokens[currencyCode].burnController = burnController; + } + + /** + * @notice Get token address for ISO-4217 code + * @param currencyCode ISO-4217 currency code + * @return tokenAddress Token contract address + */ + function getTokenAddress(string memory currencyCode) external view override returns (address tokenAddress) { + require(_isRegistered[currencyCode], "TokenRegistry: not registered"); + return _tokens[currencyCode].tokenAddress; + } + + /** + * @notice Get token info for ISO-4217 code + * @param currencyCode ISO-4217 currency code + * @return info Token information + */ + function getTokenInfo(string memory currencyCode) external view override returns (TokenInfo memory info) { + require(_isRegistered[currencyCode], "TokenRegistry: not registered"); + return _tokens[currencyCode]; + } + + /** + * @notice Check if currency code is registered + * @param currencyCode ISO-4217 currency code + * @return isRegistered True if registered + */ + function isRegistered(string memory currencyCode) external view override returns (bool isRegistered) { + return _isRegistered[currencyCode]; + } + + /** + * @notice Deactivate a token (emergency) + * @param currencyCode ISO-4217 currency code + */ + function deactivateToken(string memory currencyCode) external override onlyRole(REGISTRAR_ROLE) { + require(_isRegistered[currencyCode], "TokenRegistry: not registered"); + require(_tokens[currencyCode].isActive, "TokenRegistry: already inactive"); + + _tokens[currencyCode].isActive = false; + emit TokenDeactivated(currencyCode, block.timestamp); + } + + /** + * @notice Get all registered currency codes + * @return currencies Array of registered currency codes + */ + function getRegisteredCurrencies() external view returns (string[] memory currencies) { + return _registeredCurrencies; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/LiquidityManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/LiquidityManager.sol new file mode 100644 index 0000000..0536b49 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/LiquidityManager.sol @@ -0,0 +1,264 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "./interfaces/ILiquidityProvider.sol"; + +/** + * @title LiquidityManager + * @notice Orchestrates liquidity across multiple sources (DODO, Uniswap, Curve) + * @dev Implements per-asset configuration for PMM usage + */ +contract LiquidityManager is + Initializable, + AccessControlUpgradeable, + ReentrancyGuardUpgradeable, + UUPSUpgradeable +{ + using SafeERC20 for IERC20; + + bytes32 public constant LIQUIDITY_ADMIN_ROLE = keccak256("LIQUIDITY_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + struct LiquidityConfig { + uint256 minAmountForPMM; // Below this, don't use PMM + uint256 maxSlippageBps; // Max acceptable slippage + uint256 timeout; // Max wait time for liquidity + bool autoCreate; // Auto-create pools if needed + bool enabled; // PMM enabled for this asset + } + + struct ProviderInfo { + address providerContract; + bool active; + uint256 priority; // Higher priority = checked first + uint256 totalVolume; + uint256 successfulSwaps; + uint256 failedSwaps; + } + + struct LiquidityReservation { + bytes32 messageId; + address token; + uint256 amount; + uint256 reservedAt; + bool released; + } + + // Storage + mapping(address => LiquidityConfig) public assetConfigs; + ILiquidityProvider[] public providers; + mapping(address => ProviderInfo) public providerInfo; + mapping(bytes32 => LiquidityReservation) public reservations; + + event LiquidityProvided( + bytes32 indexed messageId, + address indexed token, + uint256 amount, + address provider + ); + + event ProviderAdded(address indexed provider, uint256 priority); + event ProviderRemoved(address indexed provider); + event AssetConfigured(address indexed token, LiquidityConfig config); + event LiquidityReserved(bytes32 indexed messageId, address token, uint256 amount); + event LiquidityReleased(bytes32 indexed messageId); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __ReentrancyGuard_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(LIQUIDITY_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Get best liquidity quote across all providers + */ + function getBestQuote( + address tokenIn, + address tokenOut, + uint256 amountIn + ) external view returns ( + address bestProvider, + uint256 bestAmountOut, + uint256 bestSlippageBps + ) { + uint256 bestAmount = 0; + uint256 bestSlippage = type(uint256).max; + + for (uint256 i = 0; i < providers.length; i++) { + if (!providerInfo[address(providers[i])].active) continue; + + try providers[i].supportsTokenPair(tokenIn, tokenOut) returns (bool supported) { + if (!supported) continue; + + try providers[i].getQuote(tokenIn, tokenOut, amountIn) returns ( + uint256 amountOut, + uint256 slippageBps + ) { + // Select provider with best output and lowest slippage + if (amountOut > bestAmount || + (amountOut == bestAmount && slippageBps < bestSlippage)) { + bestProvider = address(providers[i]); + bestAmount = amountOut; + bestSlippage = slippageBps; + } + } catch { + // Provider failed, skip + continue; + } + } catch { + continue; + } + } + + return (bestProvider, bestAmount, bestSlippage); + } + + /** + * @notice Provide liquidity for bridge operation + */ + function provideLiquidity( + address token, + uint256 amount, + bytes calldata strategyParams + ) external nonReentrant returns (uint256 liquidityProvided) { + LiquidityConfig memory config = assetConfigs[token]; + + // Check if PMM enabled for this asset + if (!config.enabled || amount < config.minAmountForPMM) { + return 0; + } + + // Find best provider + // In production, this would execute actual liquidity provision + // For now, return the amount as-is + + liquidityProvided = amount; + + return liquidityProvided; + } + + /** + * @notice Reserve liquidity for pending bridge + */ + function reserveLiquidity( + bytes32 messageId, + address token, + uint256 amount + ) external onlyRole(LIQUIDITY_ADMIN_ROLE) { + require(messageId != bytes32(0), "Invalid message ID"); + require(reservations[messageId].reservedAt == 0, "Already reserved"); + + reservations[messageId] = LiquidityReservation({ + messageId: messageId, + token: token, + amount: amount, + reservedAt: block.timestamp, + released: false + }); + + emit LiquidityReserved(messageId, token, amount); + } + + /** + * @notice Release reserved liquidity + */ + function releaseLiquidity(bytes32 messageId) external onlyRole(LIQUIDITY_ADMIN_ROLE) { + LiquidityReservation storage reservation = reservations[messageId]; + require(reservation.reservedAt > 0, "Not reserved"); + require(!reservation.released, "Already released"); + + reservation.released = true; + + emit LiquidityReleased(messageId); + } + + /** + * @notice Add liquidity provider + */ + function addProvider( + address provider, + uint256 priority + ) external onlyRole(LIQUIDITY_ADMIN_ROLE) { + require(provider != address(0), "Zero address"); + require(!providerInfo[provider].active, "Already added"); + + providers.push(ILiquidityProvider(provider)); + providerInfo[provider] = ProviderInfo({ + providerContract: provider, + active: true, + priority: priority, + totalVolume: 0, + successfulSwaps: 0, + failedSwaps: 0 + }); + + emit ProviderAdded(provider, priority); + } + + /** + * @notice Remove liquidity provider + */ + function removeProvider(address provider) external onlyRole(LIQUIDITY_ADMIN_ROLE) { + providerInfo[provider].active = false; + + emit ProviderRemoved(provider); + } + + /** + * @notice Configure asset liquidity settings + */ + function configureAsset( + address token, + uint256 minAmountForPMM, + uint256 maxSlippageBps, + uint256 timeout, + bool autoCreate, + bool enabled + ) external onlyRole(LIQUIDITY_ADMIN_ROLE) { + assetConfigs[token] = LiquidityConfig({ + minAmountForPMM: minAmountForPMM, + maxSlippageBps: maxSlippageBps, + timeout: timeout, + autoCreate: autoCreate, + enabled: enabled + }); + + emit AssetConfigured(token, assetConfigs[token]); + } + + // View functions + + function getAssetConfig(address token) external view returns (LiquidityConfig memory) { + return assetConfigs[token]; + } + + function getProviderCount() external view returns (uint256) { + return providers.length; + } + + function getProvider(uint256 index) external view returns (address) { + return address(providers[index]); + } + + function getReservation(bytes32 messageId) external view returns (LiquidityReservation memory) { + return reservations[messageId]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/PoolManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/PoolManager.sol new file mode 100644 index 0000000..efa40f4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/PoolManager.sol @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../registry/UniversalAssetRegistry.sol"; + +/** + * @title PoolManager + * @notice Manages pool creation, configuration, and lifecycle + * @dev Auto-creates pools when new assets are registered + */ +contract PoolManager is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant POOL_ADMIN_ROLE = keccak256("POOL_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + struct PoolInfo { + address pool; + address provider; // DODO, Uniswap, etc. + address tokenA; + address tokenB; + uint256 liquidityUSD; + uint256 volume24h; + uint256 createdAt; + uint256 lastUpdateTime; + bool isActive; + } + + // Storage + UniversalAssetRegistry public assetRegistry; + mapping(address => PoolInfo[]) public tokenPools; // token => pools + mapping(address => PoolInfo) public poolRegistry; // pool address => info + address[] public allPools; + + // Provider addresses + address public dodoProvider; + address public uniswapV3Provider; + address public curveProvider; + + event PoolCreated( + address indexed pool, + address indexed token, + address provider, + UniversalAssetRegistry.AssetType assetType + ); + + event PoolHealthChecked( + address indexed pool, + bool isHealthy, + string reason + ); + + event PoolLiquidityUpdated( + address indexed pool, + uint256 newLiquidityUSD + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + address _assetRegistry, + address admin + ) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + require(_assetRegistry != address(0), "Zero registry"); + + assetRegistry = UniversalAssetRegistry(_assetRegistry); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Auto-create pool when new asset registered + */ + function onAssetRegistered( + address token, + UniversalAssetRegistry.AssetType assetType + ) external onlyRole(POOL_ADMIN_ROLE) returns (address pool) { + // Determine optimal pool type based on asset type + if (assetType == UniversalAssetRegistry.AssetType.Stablecoin || + assetType == UniversalAssetRegistry.AssetType.ISO4217W) { + // Create DODO PMM pool (optimal for stable pairs) + pool = _createDODOPool(token); + } else if (assetType == UniversalAssetRegistry.AssetType.ERC20Standard || + assetType == UniversalAssetRegistry.AssetType.GovernanceToken) { + // Create Uniswap V3 pool (optimal for volatile pairs) + pool = _createUniswapV3Pool(token); + } else { + // For other types (GRU, Security, Commodity), manual pool creation + return address(0); + } + + emit PoolCreated(pool, token, dodoProvider, assetType); + + return pool; + } + + /** + * @notice Create DODO PMM pool + */ + function _createDODOPool(address token) internal returns (address) { + // In production, this would call DODOPMMIntegration to create actual pool + // For now, placeholder + return address(0); + } + + /** + * @notice Create Uniswap V3 pool + */ + function _createUniswapV3Pool(address token) internal returns (address) { + // In production, this would deploy Uniswap V3 pool + // For now, placeholder + return address(0); + } + + /** + * @notice Register existing pool + */ + function registerPool( + address pool, + address provider, + address tokenA, + address tokenB, + uint256 liquidityUSD + ) external onlyRole(POOL_ADMIN_ROLE) { + require(pool != address(0), "Zero address"); + require(!poolRegistry[pool].isActive, "Already registered"); + + PoolInfo memory info = PoolInfo({ + pool: pool, + provider: provider, + tokenA: tokenA, + tokenB: tokenB, + liquidityUSD: liquidityUSD, + volume24h: 0, + createdAt: block.timestamp, + lastUpdateTime: block.timestamp, + isActive: true + }); + + poolRegistry[pool] = info; + tokenPools[tokenA].push(info); + if (tokenB != tokenA) { + tokenPools[tokenB].push(info); + } + allPools.push(pool); + } + + /** + * @notice Check pool health + */ + function checkPoolHealth(address pool) external view returns ( + bool isHealthy, + string memory reason + ) { + PoolInfo memory info = poolRegistry[pool]; + + if (!info.isActive) { + return (false, "Pool inactive"); + } + + if (info.liquidityUSD < 1000e18) { + return (false, "Insufficient liquidity"); + } + + if (block.timestamp - info.lastUpdateTime > 7 days) { + return (false, "Stale data"); + } + + return (true, "Healthy"); + } + + /** + * @notice Update pool liquidity + */ + function updatePoolLiquidity( + address pool, + uint256 liquidityUSD + ) external onlyRole(POOL_ADMIN_ROLE) { + require(poolRegistry[pool].isActive, "Pool not registered"); + + poolRegistry[pool].liquidityUSD = liquidityUSD; + poolRegistry[pool].lastUpdateTime = block.timestamp; + + emit PoolLiquidityUpdated(pool, liquidityUSD); + } + + /** + * @notice Set provider addresses + */ + function setProviders( + address _dodoProvider, + address _uniswapV3Provider, + address _curveProvider + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + dodoProvider = _dodoProvider; + uniswapV3Provider = _uniswapV3Provider; + curveProvider = _curveProvider; + } + + // View functions + + function getPoolsForToken(address token) external view returns (PoolInfo[] memory) { + return tokenPools[token]; + } + + function getPoolInfo(address pool) external view returns (PoolInfo memory) { + return poolRegistry[pool]; + } + + function getAllPools() external view returns (address[] memory) { + return allPools; + } + + function getPoolCount() external view returns (uint256) { + return allPools.length; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/interfaces/ILiquidityProvider.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/interfaces/ILiquidityProvider.sol new file mode 100644 index 0000000..4d63902 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/interfaces/ILiquidityProvider.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +interface ILiquidityProvider { + function getQuote(address tokenIn, address tokenOut, uint256 amountIn) + external view returns (uint256 amountOut, uint256 slippageBps); + function executeSwap(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut) + external returns (uint256 amountOut); + function supportsTokenPair(address tokenIn, address tokenOut) external view returns (bool); + function providerName() external pure returns (string memory); + function estimateGas(address tokenIn, address tokenOut, uint256 amountIn) external view returns (uint256); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/providers/DODOPMMProvider.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/providers/DODOPMMProvider.sol new file mode 100644 index 0000000..34741b4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/liquidity/providers/DODOPMMProvider.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "../interfaces/ILiquidityProvider.sol"; +import "../../dex/DODOPMMIntegration.sol"; + +/** + * @title DODOPMMProvider + * @notice Wrapper for DODO PMM with extended functionality + * @dev Implements ILiquidityProvider for multi-provider liquidity system + */ +contract DODOPMMProvider is ILiquidityProvider, AccessControl { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + + DODOPMMIntegration public dodoIntegration; + + // Pool tracking + mapping(address => mapping(address => address)) public pools; // tokenIn => tokenOut => pool + mapping(address => bool) public isKnownPool; + + event PoolCreated(address indexed tokenIn, address indexed tokenOut, address pool); + event PoolOptimized(address indexed pool, uint256 newK, uint256 newI); + + constructor(address _dodoIntegration, address admin) { + require(_dodoIntegration != address(0), "Zero address"); + + dodoIntegration = DODOPMMIntegration(_dodoIntegration); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + } + + /** + * @notice Get quote from DODO PMM + */ + function getQuote( + address tokenIn, + address tokenOut, + uint256 amountIn + ) external view override returns (uint256 amountOut, uint256 slippageBps) { + address pool = pools[tokenIn][tokenOut]; + + if (pool == address(0)) { + return (0, 10000); // No pool, 100% slippage + } + + try dodoIntegration.getPoolPriceOrOracle(pool) returns (uint256 price) { + // Simple calculation (in production, would use actual DODO math) + amountOut = (amountIn * price) / 1e18; + slippageBps = 30; // 0.3% typical for stablecoin pools + return (amountOut, slippageBps); + } catch { + return (0, 10000); + } + } + + /** + * @notice Execute swap via DODO PMM + */ + function executeSwap( + address tokenIn, + address tokenOut, + uint256 amountIn, + uint256 minAmountOut + ) external override returns (uint256 amountOut) { + // Get pool for token pair + address pool = pools[tokenIn][tokenOut]; + require(pool != address(0), "Pool not found"); + + // Transfer tokens from caller + IERC20(tokenIn).safeTransferFrom(msg.sender, address(this), amountIn); + + // Route to appropriate swap method based on token pair + // This is a simplified version - in production, you'd want a more generic approach + if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.officialUSDT()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapCUSDTForUSDT(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.officialUSDT() && tokenOut == dodoIntegration.compliantUSDT()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapUSDTForCUSDT(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.officialUSDC()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapCUSDCForUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.officialUSDC() && tokenOut == dodoIntegration.compliantUSDC()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapUSDCForCUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.compliantUSDC()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapCUSDTForUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.compliantUSDT()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapUSDCForCUSDT(pool, amountIn, minAmountOut); + } else { + revert("Unsupported token pair"); + } + + // Transfer output tokens to caller + IERC20(tokenOut).safeTransfer(msg.sender, amountOut); + + return amountOut; + } + + /** + * @notice Check if provider supports token pair + */ + function supportsTokenPair( + address tokenIn, + address tokenOut + ) external view override returns (bool) { + return pools[tokenIn][tokenOut] != address(0); + } + + /** + * @notice Get provider name + */ + function providerName() external pure override returns (string memory) { + return "DODO PMM"; + } + + /** + * @notice Estimate gas for swap + */ + function estimateGas( + address, + address, + uint256 + ) external pure override returns (uint256) { + return 150000; // Typical gas for DODO swap + } + + /** + * @notice Ensure pool exists for token pair + */ + function ensurePoolExists(address tokenIn, address tokenOut) external onlyRole(POOL_MANAGER_ROLE) { + if (pools[tokenIn][tokenOut] == address(0)) { + _createOptimalPool(tokenIn, tokenOut); + } + } + + /// @dev Default params for stablecoin pairs: 0.03% fee, 1:1 price, k=0.5e18 + uint256 private constant DEFAULT_LP_FEE = 3; + uint256 private constant DEFAULT_I = 1e18; + uint256 private constant DEFAULT_K = 0.5e18; + + /** + * @notice Create optimal DODO pool via DODOPMMIntegration + * @dev Requires DODOPMMIntegration to grant POOL_MANAGER_ROLE to this contract + */ + function _createOptimalPool(address tokenIn, address tokenOut) internal { + address pool = dodoIntegration.createPool( + tokenIn, + tokenOut, + DEFAULT_LP_FEE, + DEFAULT_I, + DEFAULT_K, + false // isOpenTWAP - disable for stablecoins + ); + pools[tokenIn][tokenOut] = pool; + pools[tokenOut][tokenIn] = pool; + isKnownPool[pool] = true; + emit PoolCreated(tokenIn, tokenOut, pool); + } + + /** + * @notice Register existing pool + */ + function registerPool( + address tokenIn, + address tokenOut, + address pool + ) external onlyRole(POOL_MANAGER_ROLE) { + require(pool != address(0), "Zero address"); + + pools[tokenIn][tokenOut] = pool; + isKnownPool[pool] = true; + + emit PoolCreated(tokenIn, tokenOut, pool); + } + + /** + * @notice Optimize pool parameters (K, I) + * @dev DODO PMM parameters are typically oracle-driven; DVM pools may expose + * setK/setI. Emits for off-chain monitoring. If the pool supports + * parameter updates, extend this to call the pool's update functions. + */ + function optimizePoolParameters( + address pool, + uint256 newK, + uint256 newI + ) external onlyRole(POOL_MANAGER_ROLE) { + require(isKnownPool[pool], "Unknown pool"); + // DODO DVM/PMM: parameters set at creation; oracle-driven rebalancing. + // Emit for observability; integrate pool.setK/setI when supported. + emit PoolOptimized(pool, newK, newI); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/mirror/MirrorManager.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/mirror/MirrorManager.sol new file mode 100644 index 0000000..5fb22f4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/mirror/MirrorManager.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title MirrorManager + * @notice Registry of mirrored token/contract addresses across chains with replay protection and pausability + */ +contract MirrorManager { + address public admin; + bool public paused; + + // mapping: (sourceChain, sourceAddress) => (destChain => destAddress) + mapping(uint64 => mapping(address => mapping(uint64 => address))) public mirrors; + mapping(bytes32 => bool) public processed; // optional replay protection for off-chain message ids + + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + event MirrorSet(uint64 indexed srcChain, address indexed src, uint64 indexed dstChain, address dst); + event MirrorRemoved(uint64 indexed srcChain, address indexed src, uint64 indexed dstChain); + event Processed(bytes32 indexed id); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin) { + require(_admin != address(0), "zero admin"); + admin = _admin; + } + + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } + + function setMirror(uint64 srcChain, address src, uint64 dstChain, address dst) external onlyAdmin whenNotPaused { + require(src != address(0) && dst != address(0), "zero addr"); + mirrors[srcChain][src][dstChain] = dst; + emit MirrorSet(srcChain, src, dstChain, dst); + } + + function removeMirror(uint64 srcChain, address src, uint64 dstChain) external onlyAdmin whenNotPaused { + delete mirrors[srcChain][src][dstChain]; + emit MirrorRemoved(srcChain, src, dstChain); + } + + function getMirror(uint64 srcChain, address src, uint64 dstChain) external view returns (address) { + return mirrors[srcChain][src][dstChain]; + } + + function markProcessed(bytes32 id) external onlyAdmin { + processed[id] = true; + emit Processed(id); + } +} + + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/mirror/MirrorRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/mirror/MirrorRegistry.sol new file mode 100644 index 0000000..3635f17 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/mirror/MirrorRegistry.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title MirrorRegistry + * @notice Stores Merkle commitment roots for DBIS/Alltra transaction mirroring to public mainnets. + * @dev submitCommit(chainId, startBlock, endBlock, root, uri, ts) + event CommitSubmitted. + * Publisher allowlist and optional rate limiting. + */ +contract MirrorRegistry { + address public admin; + bool public paused; + + mapping(address => bool) public publishers; + uint256 public commitsCount; + uint256 public constant MAX_COMMITS_PER_BLOCK = 5; + uint256 public commitsThisBlock; + uint256 public lastBlock; + + event CommitSubmitted( + uint256 indexed sourceChainId, + uint64 startBlock, + uint64 endBlock, + bytes32 root, + string uri, + uint64 ts + ); + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + event PublisherSet(address indexed publisher, bool allowed); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + modifier onlyPublisher() { + require(publishers[msg.sender], "not publisher"); + _; + } + + constructor(address _admin) { + require(_admin != address(0), "zero admin"); + admin = _admin; + publishers[_admin] = true; + } + + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } + + function setPublisher(address publisher, bool allowed) external onlyAdmin { + publishers[publisher] = allowed; + emit PublisherSet(publisher, allowed); + } + + /** + * @notice Submit a Merkle commitment for a block range on source chain (138 or 651940). + * @param sourceChainId Chain ID (e.g. 138, 651940). + * @param startBlock Start block (inclusive). + * @param endBlock End block (inclusive). + * @param root Merkle root of leaves (tx_hash, block_number, receipt_root, payload_hash, sal_hash). + * @param uri URI to leaf set (e.g. S3 or API). + * @param ts Timestamp of commit (epoch seconds). + */ + function submitCommit( + uint256 sourceChainId, + uint64 startBlock, + uint64 endBlock, + bytes32 root, + string calldata uri, + uint64 ts + ) external onlyPublisher whenNotPaused { + require(startBlock <= endBlock, "invalid range"); + require(root != bytes32(0), "zero root"); + + if (block.number != lastBlock) { + lastBlock = block.number; + commitsThisBlock = 0; + } + require(commitsThisBlock < MAX_COMMITS_PER_BLOCK, "rate limit"); + commitsThisBlock++; + commitsCount++; + + emit CommitSubmitted(sourceChainId, startBlock, endBlock, root, uri, ts); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/mirror/TransactionMirror.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/mirror/TransactionMirror.sol new file mode 100644 index 0000000..37b5096 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/mirror/TransactionMirror.sol @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title TransactionMirror + * @notice Mirrors Chain-138 transactions to Ethereum Mainnet for Etherscan visibility + * @dev Logs all Chain-138 transactions as events on Mainnet, making them searchable + * and viewable on Etherscan. This provides transparency and auditability. + */ +contract TransactionMirror { + address public admin; + bool public paused; + + // Chain-138 chain ID + uint64 public constant CHAIN_138 = 138; + + // Maximum batch size to prevent gas limit issues + uint256 public constant MAX_BATCH_SIZE = 100; + + // Transaction structure + struct MirroredTransaction { + bytes32 txHash; // Chain-138 transaction hash + address from; // Sender address + address to; // Recipient address (or contract) + uint256 value; // Value transferred + uint256 blockNumber; // Chain-138 block number + uint256 blockTimestamp; // Block timestamp + uint256 gasUsed; // Gas used + bool success; // Transaction success status + bytes data; // Transaction data (if any) + bytes32 indexedHash; // Indexed hash for searchability + } + + // Mapping: txHash => MirroredTransaction + mapping(bytes32 => MirroredTransaction) public transactions; + + // Array of all mirrored transaction hashes + bytes32[] public mirroredTxHashes; + + // Mapping: txHash => bool (replay protection) + mapping(bytes32 => bool) public processed; + + // Events (indexed for Etherscan searchability) + event TransactionMirrored( + bytes32 indexed txHash, + address indexed from, + address indexed to, + uint256 value, + uint256 blockNumber, + uint256 blockTimestamp, + uint256 gasUsed, + bool success + ); + + event BatchTransactionsMirrored( + uint256 count, + uint256 startBlock, + uint256 endBlock + ); + + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin) { + require(_admin != address(0), "zero admin"); + admin = _admin; + } + + /** + * @notice Mirror a single Chain-138 transaction to Mainnet + * @param txHash Chain-138 transaction hash + * @param from Sender address + * @param to Recipient address + * @param value Value transferred + * @param blockNumber Chain-138 block number + * @param blockTimestamp Block timestamp + * @param gasUsed Gas used + * @param success Transaction success status + * @param data Transaction data (optional) + */ + function mirrorTransaction( + bytes32 txHash, + address from, + address to, + uint256 value, + uint256 blockNumber, + uint256 blockTimestamp, + uint256 gasUsed, + bool success, + bytes calldata data + ) external onlyAdmin whenNotPaused { + require(txHash != bytes32(0), "invalid hash"); + require(!processed[txHash], "already mirrored"); + + bytes32 indexedHash = keccak256(abi.encodePacked(CHAIN_138, txHash)); + + transactions[txHash] = MirroredTransaction({ + txHash: txHash, + from: from, + to: to, + value: value, + blockNumber: blockNumber, + blockTimestamp: blockTimestamp, + gasUsed: gasUsed, + success: success, + data: data, + indexedHash: indexedHash + }); + + mirroredTxHashes.push(txHash); + processed[txHash] = true; + + emit TransactionMirrored( + txHash, + from, + to, + value, + blockNumber, + blockTimestamp, + gasUsed, + success + ); + } + + /** + * @notice Mirror multiple Chain-138 transactions in a batch + * @param txHashes Array of transaction hashes + * @param froms Array of sender addresses + * @param tos Array of recipient addresses + * @param values Array of values + * @param blockNumbers Array of block numbers + * @param blockTimestamps Array of timestamps + * @param gasUseds Array of gas used + * @param successes Array of success statuses + * @param datas Array of transaction data + */ + function mirrorBatchTransactions( + bytes32[] calldata txHashes, + address[] calldata froms, + address[] calldata tos, + uint256[] calldata values, + uint256[] calldata blockNumbers, + uint256[] calldata blockTimestamps, + uint256[] calldata gasUseds, + bool[] calldata successes, + bytes[] calldata datas + ) external onlyAdmin whenNotPaused { + uint256 count = txHashes.length; + require(count > 0, "empty batch"); + require(count <= MAX_BATCH_SIZE, "batch too large"); + require( + count == froms.length && + count == tos.length && + count == values.length && + count == blockNumbers.length && + count == blockTimestamps.length && + count == gasUseds.length && + count == successes.length && + count == datas.length, + "array length mismatch" + ); + + uint256 startBlock = blockNumbers[0]; + uint256 endBlock = blockNumbers[count - 1]; + + // Process transactions in batches to avoid stack too deep + for (uint256 i = 0; i < count; i++) { + bytes32 txHash = txHashes[i]; + require(txHash != bytes32(0), "invalid hash"); + require(!processed[txHash], "already mirrored"); + + bytes32 indexedHash = keccak256(abi.encodePacked(CHAIN_138, txHash)); + + transactions[txHash] = MirroredTransaction({ + txHash: txHash, + from: froms[i], + to: tos[i], + value: values[i], + blockNumber: blockNumbers[i], + blockTimestamp: blockTimestamps[i], + gasUsed: gasUseds[i], + success: successes[i], + data: datas[i], + indexedHash: indexedHash + }); + + mirroredTxHashes.push(txHash); + processed[txHash] = true; + + emit TransactionMirrored( + txHash, + froms[i], + tos[i], + values[i], + blockNumbers[i], + blockTimestamps[i], + gasUseds[i], + successes[i] + ); + } + + emit BatchTransactionsMirrored(count, startBlock, endBlock); + } + + + /** + * @notice Get mirrored transaction details + * @param txHash Chain-138 transaction hash + * @return mirroredTx Mirrored transaction structure + */ + function getTransaction(bytes32 txHash) external view returns (MirroredTransaction memory mirroredTx) { + require(processed[txHash], "not mirrored"); + return transactions[txHash]; + } + + /** + * @notice Check if a transaction is mirrored + * @param txHash Chain-138 transaction hash + * @return true if mirrored + */ + function isMirrored(bytes32 txHash) external view returns (bool) { + return processed[txHash]; + } + + /** + * @notice Get total number of mirrored transactions + * @return count Number of mirrored transactions + */ + function getMirroredTransactionCount() external view returns (uint256) { + return mirroredTxHashes.length; + } + + /** + * @notice Get mirrored transaction hash at index + * @param index Index in mirroredTxHashes array + * @return txHash Transaction hash + */ + function getMirroredTransaction(uint256 index) external view returns (bytes32) { + require(index < mirroredTxHashes.length, "out of bounds"); + return mirroredTxHashes[index]; + } + + /** + * @notice Admin functions + */ + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/nft/GRUFormulasNFT.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/nft/GRUFormulasNFT.sol new file mode 100644 index 0000000..aea24f6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/nft/GRUFormulasNFT.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Base64.sol"; + +/** + * @title GRUFormulasNFT + * @notice ERC-721 NFT depicting the three GRU-related monetary formulas as on-chain SVG graphics + * @dev Token IDs: 0 = Money Supply (GRU M00/M0/M1), 1 = Money Velocity (M×V=P×Y), 2 = Money Multiplier (m=1.0) + */ +contract GRUFormulasNFT is ERC721, ERC721URIStorage, AccessControl { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + + uint256 public constant TOKEN_ID_MONEY_SUPPLY = 0; + uint256 public constant TOKEN_ID_MONEY_VELOCITY = 1; + uint256 public constant TOKEN_ID_MONEY_MULTIPLIER = 2; + uint256 public constant MAX_TOKEN_ID = 2; + + constructor(address admin) ERC721("GRU Formulas", "GRUF") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MINTER_ROLE, admin); + } + + /** + * @notice Mint one of the three formula NFTs (tokenId 0, 1, or 2) + * @param to Recipient + * @param tokenId 0 = Money Supply, 1 = Money Velocity, 2 = Money Multiplier + */ + function mint(address to, uint256 tokenId) external onlyRole(MINTER_ROLE) { + require(tokenId <= MAX_TOKEN_ID, "GRUFormulasNFT: invalid tokenId"); + _safeMint(to, tokenId); + } + + function _baseURI() internal pure override returns (string memory) { + return ""; + } + + /** + * @notice Returns metadata URI with on-chain SVG image for the formula + * @param tokenId 0 = Money Supply, 1 = Money Velocity, 2 = Money Multiplier + */ + function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { + require(_ownerOf(tokenId) != address(0), "ERC721: invalid token ID"); + (string memory name, string memory description, string memory svg) = _formulaData(tokenId); + string memory imageData = string.concat("data:image/svg+xml;base64,", Base64.encode(bytes(svg))); + string memory json = string.concat( + '{"name":"', name, + '","description":"', description, + '","image":"', imageData, + '"}' + ); + return string.concat("data:application/json;base64,", Base64.encode(bytes(json))); + } + + function _formulaData(uint256 tokenId) internal pure returns (string memory name, string memory description, string memory svg) { + if (tokenId == TOKEN_ID_MONEY_SUPPLY) { + name = "GRU Money Supply (M)"; + description = "GRU monetary layers: 1 M00 = 5 M0 = 25 M1 (base, collateral, credit). Non-ISO synthetic unit of account."; + svg = _svgMoneySupply(); + } else if (tokenId == TOKEN_ID_MONEY_VELOCITY) { + name = "Money Velocity (V)"; + description = "Equation of exchange: M x V = P x Y (money supply, velocity, price level, output)."; + svg = _svgMoneyVelocity(); + } else if (tokenId == TOKEN_ID_MONEY_MULTIPLIER) { + name = "Money Multiplier (m)"; + description = "m = Reserve / Supply; GRU and ISO4217W enforce m = 1.0 (no fractional reserve)."; + svg = _svgMoneyMultiplier(); + } else { + revert("GRUFormulasNFT: invalid tokenId"); + } + } + + function _svgMoneySupply() internal pure returns (string memory) { + return string.concat( + "", + "", + "Money Supply (M) - GRU layers", + "1 M00 = 5 M0 = 25 M1", + "M00 base | M0 collateral | M1 credit", + "" + ); + } + + function _svgMoneyVelocity() internal pure returns (string memory) { + return string.concat( + "", + "", + "Money Velocity (V)", + "M * V = P * Y", + "Equation of exchange", + "" + ); + } + + function _svgMoneyMultiplier() internal pure returns (string memory) { + return string.concat( + "", + "", + "Money Multiplier (m)", + "m = Reserve / Supply = 1.0", + "No fractional reserve (GRU / ISO4217W)", + "" + ); + } + + function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721URIStorage, AccessControl) returns (bool) { + return super.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/Aggregator.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/Aggregator.sol new file mode 100644 index 0000000..6729ca4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/Aggregator.sol @@ -0,0 +1,263 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Oracle Aggregator + * @notice Chainlink-compatible oracle aggregator for price feeds + * @dev Implements round-based oracle updates with access control + */ +contract Aggregator { + struct Round { + uint256 answer; + uint256 startedAt; + uint256 updatedAt; + uint256 answeredInRound; + address transmitter; + } + + uint8 public constant decimals = 8; + string public description; + + uint256 public version = 1; + uint256 public latestRound; + + mapping(uint256 => Round) public rounds; + + // Access control + address public admin; + address[] public transmitters; + mapping(address => bool) public isTransmitter; + + // Round parameters + uint256 public heartbeat; + uint256 public deviationThreshold; // in basis points (e.g., 50 = 0.5%) + bool public paused; + + event AnswerUpdated( + int256 indexed current, + uint256 indexed roundId, + uint256 updatedAt + ); + event NewRound( + uint256 indexed roundId, + address indexed startedBy, + uint256 startedAt + ); + event TransmitterAdded(address indexed transmitter); + event TransmitterRemoved(address indexed transmitter); + event AdminChanged(address indexed oldAdmin, address indexed newAdmin); + event HeartbeatUpdated(uint256 oldHeartbeat, uint256 newHeartbeat); + event DeviationThresholdUpdated(uint256 oldThreshold, uint256 newThreshold); + event Paused(address account); + event Unpaused(address account); + + modifier onlyAdmin() { + require(msg.sender == admin, "Aggregator: only admin"); + _; + } + + modifier onlyTransmitter() { + require(isTransmitter[msg.sender], "Aggregator: only transmitter"); + _; + } + + modifier whenNotPaused() { + require(!paused, "Aggregator: paused"); + _; + } + + constructor( + string memory _description, + address _admin, + uint256 _heartbeat, + uint256 _deviationThreshold + ) { + description = _description; + admin = _admin; + heartbeat = _heartbeat; + deviationThreshold = _deviationThreshold; + } + + /** + * @notice Update the answer for the current round + * @param answer New answer value + */ + function updateAnswer(uint256 answer) external virtual onlyTransmitter whenNotPaused { + uint256 currentRound = latestRound; + Round storage round = rounds[currentRound]; + + // Check if we need to start a new round + if (round.updatedAt == 0 || + block.timestamp >= round.startedAt + heartbeat || + shouldUpdate(answer, round.answer)) { + currentRound = latestRound + 1; + latestRound = currentRound; + + rounds[currentRound] = Round({ + answer: answer, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: currentRound, + transmitter: msg.sender + }); + + emit NewRound(currentRound, msg.sender, block.timestamp); + } else { + // Update existing round (median or weighted average logic can be added) + round.updatedAt = block.timestamp; + round.transmitter = msg.sender; + } + + emit AnswerUpdated(int256(answer), currentRound, block.timestamp); + } + + /** + * @notice Check if answer should be updated based on deviation threshold + */ + function shouldUpdate(uint256 newAnswer, uint256 oldAnswer) internal view returns (bool) { + if (oldAnswer == 0) return true; + + uint256 deviation = newAnswer > oldAnswer + ? ((newAnswer - oldAnswer) * 10000) / oldAnswer + : ((oldAnswer - newAnswer) * 10000) / oldAnswer; + + return deviation >= deviationThreshold; + } + + /** + * @notice Get the latest answer + */ + function latestAnswer() external view returns (int256) { + return int256(rounds[latestRound].answer); + } + + /** + * @notice Get the latest round data + */ + function latestRoundData() + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ) + { + Round storage round = rounds[latestRound]; + return ( + uint80(latestRound), + int256(round.answer), + round.startedAt, + round.updatedAt, + uint80(round.answeredInRound) + ); + } + + /** + * @notice Get round data for a specific round + */ + function getRoundData(uint80 _roundId) + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ) + { + Round storage round = rounds[_roundId]; + require(round.updatedAt > 0, "Aggregator: round not found"); + return ( + _roundId, + int256(round.answer), + round.startedAt, + round.updatedAt, + uint80(round.answeredInRound) + ); + } + + /** + * @notice Add a transmitter + */ + function addTransmitter(address transmitter) external onlyAdmin { + require(!isTransmitter[transmitter], "Aggregator: already transmitter"); + isTransmitter[transmitter] = true; + transmitters.push(transmitter); + emit TransmitterAdded(transmitter); + } + + /** + * @notice Remove a transmitter + */ + function removeTransmitter(address transmitter) external onlyAdmin { + require(isTransmitter[transmitter], "Aggregator: not transmitter"); + isTransmitter[transmitter] = false; + + // Remove from array + for (uint256 i = 0; i < transmitters.length; i++) { + if (transmitters[i] == transmitter) { + transmitters[i] = transmitters[transmitters.length - 1]; + transmitters.pop(); + break; + } + } + + emit TransmitterRemoved(transmitter); + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "Aggregator: zero address"); + address oldAdmin = admin; + admin = newAdmin; + emit AdminChanged(oldAdmin, newAdmin); + } + + /** + * @notice Update heartbeat + */ + function updateHeartbeat(uint256 newHeartbeat) external onlyAdmin { + uint256 oldHeartbeat = heartbeat; + heartbeat = newHeartbeat; + emit HeartbeatUpdated(oldHeartbeat, newHeartbeat); + } + + /** + * @notice Update deviation threshold + */ + function updateDeviationThreshold(uint256 newThreshold) external onlyAdmin { + uint256 oldThreshold = deviationThreshold; + deviationThreshold = newThreshold; + emit DeviationThresholdUpdated(oldThreshold, newThreshold); + } + + /** + * @notice Pause the aggregator + */ + function pause() external onlyAdmin { + paused = true; + emit Paused(msg.sender); + } + + /** + * @notice Unpause the aggregator + */ + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(msg.sender); + } + + /** + * @notice Get list of transmitters + */ + function getTransmitters() external view returns (address[] memory) { + return transmitters; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/IAggregator.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/IAggregator.sol new file mode 100644 index 0000000..5859842 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/IAggregator.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IAggregator Interface + * @notice Interface for Chainlink-compatible oracle aggregator + * @dev Based on Chainlink AggregatorV3Interface + */ +interface IAggregator { + /** + * @notice Get the latest answer + * @return answer Latest answer + */ + function latestAnswer() external view returns (int256); + + /** + * @notice Get the latest round data + * @return roundId Round ID + * @return answer Answer + * @return startedAt Started at timestamp + * @return updatedAt Updated at timestamp + * @return answeredInRound Answered in round + */ + function latestRoundData() + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ); + + /** + * @notice Get round data for a specific round + * @param _roundId Round ID + * @return roundId Round ID + * @return answer Answer + * @return startedAt Started at timestamp + * @return updatedAt Updated at timestamp + * @return answeredInRound Answered in round + */ + function getRoundData(uint80 _roundId) + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ); + + /** + * @notice Update the answer (for transmitters) + * @param answer New answer value + */ + function updateAnswer(uint256 answer) external; + + /** + * @notice Get decimals + * @return decimals Number of decimals + */ + function decimals() external view returns (uint8); + + /** + * @notice Get description + * @return description Description + */ + function description() external view returns (string memory); + + /** + * @notice Get version + * @return version Version + */ + function version() external view returns (uint256); +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/OracleWithCCIP.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/OracleWithCCIP.sol new file mode 100644 index 0000000..be23ffc --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/OracleWithCCIP.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./Aggregator.sol"; +import "../ccip/CCIPSender.sol"; + +/** + * @title Oracle Aggregator with CCIP Integration + * @notice Extends Aggregator with CCIP cross-chain messaging capabilities + * @dev Automatically sends oracle updates to other chains via CCIP when updates occur + */ +contract OracleWithCCIP is Aggregator { + CCIPSender public ccipSender; + bool public ccipEnabled; + + // Destination chain configurations (using CCIPSender's destinations) + uint64[] public ccipDestinationChains; + + event CCIPUpdateSent( + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + uint256 answer, + uint256 roundId + ); + event CCIPEnabled(bool enabled); + event CCIPSenderUpdated(address oldSender, address newSender); + + constructor( + string memory _description, + address _admin, + uint256 _heartbeat, + uint256 _deviationThreshold, + address _ccipSender + ) Aggregator(_description, _admin, _heartbeat, _deviationThreshold) { + require(_ccipSender != address(0), "OracleWithCCIP: zero sender address"); + ccipSender = CCIPSender(_ccipSender); + ccipEnabled = true; + } + + /** + * @notice Update the answer and send to CCIP destinations + * @param answer New answer value + */ + function updateAnswer(uint256 answer) external override onlyTransmitter whenNotPaused { + uint256 currentRound = latestRound; + Round storage round = rounds[currentRound]; + + // Check if we need to start a new round + if (round.updatedAt == 0 || + block.timestamp >= round.startedAt + heartbeat || + shouldUpdate(answer, round.answer)) { + currentRound = latestRound + 1; + latestRound = currentRound; + + rounds[currentRound] = Round({ + answer: answer, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: currentRound, + transmitter: msg.sender + }); + + emit NewRound(currentRound, msg.sender, block.timestamp); + + // Send to CCIP destinations if enabled + if (ccipEnabled) { + _sendToCCIP(currentRound, answer); + } + } else { + // Update existing round + round.updatedAt = block.timestamp; + round.transmitter = msg.sender; + } + + emit AnswerUpdated(int256(answer), currentRound, block.timestamp); + } + + /** + * @notice Send oracle update to all CCIP destinations + */ + function _sendToCCIP(uint256 roundId, uint256 answer) internal { + uint64[] memory destinations = ccipSender.getDestinationChains(); + + for (uint256 i = 0; i < destinations.length; i++) { + uint64 chainSelector = destinations[i]; + + try ccipSender.sendOracleUpdate( + chainSelector, + answer, + roundId, + block.timestamp + ) returns (bytes32 messageId) { + emit CCIPUpdateSent(messageId, chainSelector, answer, roundId); + } catch { + // Log error but don't revert + // In production, consider adding error tracking + } + } + } + + /** + * @notice Enable/disable CCIP + */ + function setCCIPEnabled(bool enabled) external { + require(msg.sender == admin, "OracleWithCCIP: only admin"); + ccipEnabled = enabled; + emit CCIPEnabled(enabled); + } + + /** + * @notice Update CCIP sender + */ + function updateCCIPSender(address newSender) external { + require(msg.sender == admin, "OracleWithCCIP: only admin"); + require(newSender != address(0), "OracleWithCCIP: zero address"); + + address oldSender = address(ccipSender); + ccipSender = CCIPSender(newSender); + + emit CCIPSenderUpdated(oldSender, newSender); + } + + /** + * @notice Get CCIP destinations + */ + function getCCIPDestinations() external view returns (uint64[] memory) { + return ccipSender.getDestinationChains(); + } + + /** + * @notice Get fee for sending to CCIP destination + */ + function getCCIPFee(uint64 chainSelector) external view returns (uint256) { + bytes memory data = abi.encode(uint256(0), uint256(0), uint256(0)); + return ccipSender.calculateFee(chainSelector, data); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/Proxy.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/Proxy.sol new file mode 100644 index 0000000..6681cfb --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/oracle/Proxy.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Transparent Proxy + * @notice Transparent proxy pattern for upgradeable oracle contracts + * @dev Based on OpenZeppelin's transparent proxy pattern + */ +contract Proxy { + address public implementation; + address public admin; + + event Upgraded(address indexed implementation); + event AdminChanged(address indexed oldAdmin, address indexed newAdmin); + + modifier onlyAdmin() { + require(msg.sender == admin, "Proxy: only admin"); + _; + } + + constructor(address _implementation, address _admin) { + implementation = _implementation; + admin = _admin; + } + + /** + * @notice Upgrade the implementation + */ + function upgrade(address newImplementation) external onlyAdmin { + require(newImplementation != address(0), "Proxy: zero address"); + implementation = newImplementation; + emit Upgraded(newImplementation); + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "Proxy: zero address"); + address oldAdmin = admin; + admin = newAdmin; + emit AdminChanged(oldAdmin, newAdmin); + } + + /** + * @notice Delegate call to implementation + */ + fallback() external payable { + address impl = implementation; + assembly { + calldatacopy(0, 0, calldatasize()) + let result := delegatecall(gas(), impl, 0, calldatasize(), 0, 0) + returndatacopy(0, 0, returndatasize()) + switch result + case 0 { revert(0, returndatasize()) } + default { return(0, returndatasize()) } + } + } + + receive() external payable {} +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/plugins/PluginRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/plugins/PluginRegistry.sol new file mode 100644 index 0000000..4c09fa5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/plugins/PluginRegistry.sol @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title PluginRegistry + * @notice Central registry for all pluggable components + * @dev Enables adding new asset types, liquidity providers, compliance modules without redeployment + */ +contract PluginRegistry is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant PLUGIN_ADMIN_ROLE = keccak256("PLUGIN_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + enum PluginType { + AssetTypeHandler, + LiquidityProvider, + ComplianceModule, + OracleProvider, + VaultStrategy + } + + struct Plugin { + address implementation; + string version; + bool active; + uint256 registeredAt; + string description; + } + + // Storage + mapping(PluginType => mapping(bytes32 => Plugin)) public plugins; + mapping(PluginType => bytes32[]) public pluginsByType; + + // Plugin metadata + mapping(address => bool) public isRegisteredPlugin; + mapping(PluginType => uint256) public pluginCount; + + event PluginRegistered( + PluginType indexed pluginType, + bytes32 indexed identifier, + address implementation, + string version + ); + + event PluginActivated(PluginType indexed pluginType, bytes32 indexed identifier); + event PluginDeactivated(PluginType indexed pluginType, bytes32 indexed identifier); + event PluginUpgraded( + PluginType indexed pluginType, + bytes32 indexed identifier, + address oldImplementation, + address newImplementation + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(PLUGIN_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Register new plugin + */ + function registerPlugin( + PluginType pluginType, + bytes32 identifier, + address implementation, + string calldata version, + string calldata description + ) external onlyRole(PLUGIN_ADMIN_ROLE) { + require(implementation != address(0), "Zero address"); + require(implementation.code.length > 0, "Not a contract"); + require(plugins[pluginType][identifier].implementation == address(0), "Already registered"); + + plugins[pluginType][identifier] = Plugin({ + implementation: implementation, + version: version, + active: true, + registeredAt: block.timestamp, + description: description + }); + + pluginsByType[pluginType].push(identifier); + isRegisteredPlugin[implementation] = true; + pluginCount[pluginType]++; + + emit PluginRegistered(pluginType, identifier, implementation, version); + } + + /** + * @notice Upgrade plugin to new implementation + */ + function upgradePlugin( + PluginType pluginType, + bytes32 identifier, + address newImplementation, + string calldata newVersion + ) external onlyRole(PLUGIN_ADMIN_ROLE) { + require(newImplementation != address(0), "Zero address"); + require(newImplementation.code.length > 0, "Not a contract"); + + Plugin storage plugin = plugins[pluginType][identifier]; + require(plugin.implementation != address(0), "Plugin not found"); + + address oldImplementation = plugin.implementation; + plugin.implementation = newImplementation; + plugin.version = newVersion; + isRegisteredPlugin[newImplementation] = true; + + emit PluginUpgraded(pluginType, identifier, oldImplementation, newImplementation); + } + + /** + * @notice Activate plugin + */ + function activatePlugin( + PluginType pluginType, + bytes32 identifier + ) external onlyRole(PLUGIN_ADMIN_ROLE) { + Plugin storage plugin = plugins[pluginType][identifier]; + require(plugin.implementation != address(0), "Plugin not found"); + + plugin.active = true; + + emit PluginActivated(pluginType, identifier); + } + + /** + * @notice Deactivate plugin + */ + function deactivatePlugin( + PluginType pluginType, + bytes32 identifier + ) external onlyRole(PLUGIN_ADMIN_ROLE) { + Plugin storage plugin = plugins[pluginType][identifier]; + require(plugin.implementation != address(0), "Plugin not found"); + + plugin.active = false; + + emit PluginDeactivated(pluginType, identifier); + } + + // View functions + + function getPlugin( + PluginType pluginType, + bytes32 identifier + ) external view returns (address implementation) { + Plugin memory plugin = plugins[pluginType][identifier]; + require(plugin.active, "Plugin not active"); + return plugin.implementation; + } + + function getPluginInfo( + PluginType pluginType, + bytes32 identifier + ) external view returns (Plugin memory) { + return plugins[pluginType][identifier]; + } + + function getAllPlugins(PluginType pluginType) external view returns (bytes32[] memory) { + return pluginsByType[pluginType]; + } + + function getPluginCount(PluginType pluginType) external view returns (uint256) { + return pluginCount[pluginType]; + } + + function isPluginActive( + PluginType pluginType, + bytes32 identifier + ) external view returns (bool) { + return plugins[pluginType][identifier].active; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/registry/ChainRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/ChainRegistry.sol new file mode 100644 index 0000000..b543dac --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/ChainRegistry.sol @@ -0,0 +1,320 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title ChainRegistry + * @notice Central registry for all supported blockchains (EVM and non-EVM) + * @dev Maps chain identifiers to adapter contracts and metadata + */ +contract ChainRegistry is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant REGISTRY_ADMIN_ROLE = keccak256("REGISTRY_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + enum ChainType { + EVM, // Ethereum, Polygon, Arbitrum, etc. + XRPL, // XRP Ledger + XDC, // XDC Network (EVM-compatible but different address format) + Stellar, // Stellar Network + Algorand, // Algorand + Hedera, // Hedera Hashgraph + Tron, // Tron + TON, // The Open Network + Cosmos, // Cosmos Hub + Solana, // Solana + Fabric, // Hyperledger Fabric + Corda, // R3 Corda + Indy, // Hyperledger Indy + Firefly, // Hyperledger Firefly + Cacti, // Hyperledger Cacti + Other // Custom/unknown + } + + struct ChainMetadata { + uint256 chainId; // For EVM chains (0 for non-EVM) + string chainIdentifier; // For non-EVM (e.g., "XRPL", "Fabric-Channel1") + ChainType chainType; + address adapter; // Bridge adapter contract address + bool isActive; + uint256 minConfirmations; // Required confirmations + uint256 avgBlockTime; // Average block time in seconds + bool requiresOracle; // Non-EVM chains need oracle + string rpcEndpoint; // RPC endpoint (encrypted or public) + string explorerUrl; // Block explorer URL + bytes additionalData; // Chain-specific config + uint256 addedAt; + uint256 lastUpdated; + } + + // EVM chains: chainId => metadata + mapping(uint256 => ChainMetadata) public evmChains; + + // Non-EVM chains: identifier => metadata + mapping(string => ChainMetadata) public nonEvmChains; + + // All registered chain identifiers + uint256[] public registeredEVMChainIds; + string[] public registeredNonEVMIdentifiers; + + // Adapter validation + mapping(address => bool) public isValidAdapter; + mapping(address => ChainType) public adapterToChainType; + + event ChainRegistered( + uint256 indexed chainId, + string indexed chainIdentifier, + ChainType chainType, + address adapter + ); + + event ChainUpdated( + uint256 indexed chainId, + string indexed chainIdentifier, + bool isActive + ); + + event ChainDeactivated( + uint256 indexed chainId, + string indexed chainIdentifier + ); + + event AdapterUpdated( + uint256 indexed chainId, + string indexed chainIdentifier, + address oldAdapter, + address newAdapter + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRY_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Register an EVM chain + */ + function registerEVMChain( + uint256 chainId, + address adapter, + string calldata explorerUrl, + uint256 minConfirmations, + uint256 avgBlockTime, + bytes calldata additionalData + ) external onlyRole(REGISTRY_ADMIN_ROLE) { + require(chainId != 0, "Invalid chain ID"); + require(adapter != address(0), "Zero adapter"); + require(adapter.code.length > 0, "Not a contract"); + + ChainMetadata storage chain = evmChains[chainId]; + + // If new chain, add to list + if (chain.addedAt == 0) { + registeredEVMChainIds.push(chainId); + } + + chain.chainId = chainId; + chain.chainIdentifier = string(abi.encodePacked("EVM-", chainId)); + chain.chainType = ChainType.EVM; + chain.adapter = adapter; + chain.isActive = true; + chain.minConfirmations = minConfirmations; + chain.avgBlockTime = avgBlockTime; + chain.requiresOracle = false; + chain.explorerUrl = explorerUrl; + chain.additionalData = additionalData; + chain.lastUpdated = block.timestamp; + + if (chain.addedAt == 0) { + chain.addedAt = block.timestamp; + } + + isValidAdapter[adapter] = true; + adapterToChainType[adapter] = ChainType.EVM; + + emit ChainRegistered(chainId, chain.chainIdentifier, ChainType.EVM, adapter); + } + + /** + * @notice Register a non-EVM chain + */ + function registerNonEVMChain( + string calldata chainIdentifier, + ChainType chainType, + address adapter, + string calldata explorerUrl, + uint256 minConfirmations, + uint256 avgBlockTime, + bool requiresOracle, + bytes calldata additionalData + ) external onlyRole(REGISTRY_ADMIN_ROLE) { + require(bytes(chainIdentifier).length > 0, "Empty identifier"); + require(adapter != address(0), "Zero adapter"); + require(adapter.code.length > 0, "Not a contract"); + require(chainType != ChainType.EVM, "Use registerEVMChain"); + + ChainMetadata storage chain = nonEvmChains[chainIdentifier]; + + // If new chain, add to list + if (chain.addedAt == 0) { + registeredNonEVMIdentifiers.push(chainIdentifier); + } + + chain.chainId = 0; + chain.chainIdentifier = chainIdentifier; + chain.chainType = chainType; + chain.adapter = adapter; + chain.isActive = true; + chain.minConfirmations = minConfirmations; + chain.avgBlockTime = avgBlockTime; + chain.requiresOracle = requiresOracle; + chain.explorerUrl = explorerUrl; + chain.additionalData = additionalData; + chain.lastUpdated = block.timestamp; + + if (chain.addedAt == 0) { + chain.addedAt = block.timestamp; + } + + isValidAdapter[adapter] = true; + adapterToChainType[adapter] = chainType; + + emit ChainRegistered(0, chainIdentifier, chainType, adapter); + } + + /** + * @notice Update chain adapter + */ + function updateAdapter( + uint256 chainId, + string calldata chainIdentifier, + address newAdapter + ) external onlyRole(REGISTRY_ADMIN_ROLE) { + require(newAdapter != address(0), "Zero adapter"); + require(newAdapter.code.length > 0, "Not a contract"); + + address oldAdapter; + + if (chainId != 0) { + ChainMetadata storage chain = evmChains[chainId]; + require(chain.addedAt != 0, "Chain not registered"); + oldAdapter = chain.adapter; + chain.adapter = newAdapter; + chain.lastUpdated = block.timestamp; + } else { + ChainMetadata storage chain = nonEvmChains[chainIdentifier]; + require(chain.addedAt != 0, "Chain not registered"); + oldAdapter = chain.adapter; + chain.adapter = newAdapter; + chain.lastUpdated = block.timestamp; + } + + isValidAdapter[oldAdapter] = false; + isValidAdapter[newAdapter] = true; + + emit AdapterUpdated(chainId, chainIdentifier, oldAdapter, newAdapter); + } + + /** + * @notice Enable/disable chain + */ + function setChainActive( + uint256 chainId, + string calldata chainIdentifier, + bool active + ) external onlyRole(REGISTRY_ADMIN_ROLE) { + if (chainId != 0) { + ChainMetadata storage chain = evmChains[chainId]; + require(chain.addedAt != 0, "Chain not registered"); + chain.isActive = active; + chain.lastUpdated = block.timestamp; + } else { + ChainMetadata storage chain = nonEvmChains[chainIdentifier]; + require(chain.addedAt != 0, "Chain not registered"); + chain.isActive = active; + chain.lastUpdated = block.timestamp; + } + + emit ChainUpdated(chainId, chainIdentifier, active); + + if (!active) { + emit ChainDeactivated(chainId, chainIdentifier); + } + } + + // View functions + + function getEVMChain(uint256 chainId) + external view returns (ChainMetadata memory) { + return evmChains[chainId]; + } + + function getNonEVMChain(string calldata chainIdentifier) + external view returns (ChainMetadata memory) { + return nonEvmChains[chainIdentifier]; + } + + function getAdapter(uint256 chainId, string calldata chainIdentifier) + external view returns (address) { + if (chainId != 0) { + return evmChains[chainId].adapter; + } else { + return nonEvmChains[chainIdentifier].adapter; + } + } + + function isChainActive(uint256 chainId, string calldata chainIdentifier) + external view returns (bool) { + if (chainId != 0) { + return evmChains[chainId].isActive; + } else { + return nonEvmChains[chainIdentifier].isActive; + } + } + + function getAllEVMChains() + external view returns (uint256[] memory, ChainMetadata[] memory) { + uint256 length = registeredEVMChainIds.length; + ChainMetadata[] memory chains = new ChainMetadata[](length); + + for (uint256 i = 0; i < length; i++) { + chains[i] = evmChains[registeredEVMChainIds[i]]; + } + + return (registeredEVMChainIds, chains); + } + + function getAllNonEVMChains() + external view returns (string[] memory, ChainMetadata[] memory) { + uint256 length = registeredNonEVMIdentifiers.length; + ChainMetadata[] memory chains = new ChainMetadata[](length); + + for (uint256 i = 0; i < length; i++) { + chains[i] = nonEvmChains[registeredNonEVMIdentifiers[i]]; + } + + return (registeredNonEVMIdentifiers, chains); + } + + function getTotalChains() external view returns (uint256, uint256) { + return (registeredEVMChainIds.length, registeredNonEVMIdentifiers.length); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/registry/UniversalAssetRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/UniversalAssetRegistry.sol new file mode 100644 index 0000000..f204451 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/UniversalAssetRegistry.sol @@ -0,0 +1,420 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title UniversalAssetRegistry + * @notice Central registry for all asset types with governance and compliance + * @dev Supports 10+ asset types with hybrid governance based on risk levels + */ +contract UniversalAssetRegistry is + Initializable, + AccessControlUpgradeable, + ReentrancyGuardUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); + bytes32 public constant VALIDATOR_ROLE = keccak256("VALIDATOR_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + // Asset classification types + enum AssetType { + ERC20Standard, // Standard tokens + ISO4217W, // eMoney/CBDCs + GRU, // Global Reserve Units (M00/M0/M1) + Commodity, // Gold, oil, etc. + Security, // Tokenized securities + RealWorldAsset, // Real estate, art, etc. + Synthetic, // Derivatives, futures + Stablecoin, // USDT, USDC, etc. + GovernanceToken, // DAO tokens + NFTBacked // NFT-collateralized tokens + } + + // Compliance levels + enum ComplianceLevel { + Public, // No restrictions + KYC, // KYC required + Accredited, // Accredited investors only + Institutional, // Institutions only + Sovereign // Central banks/governments only + } + + // Proposal types + enum ProposalType { + AddAsset, + RemoveAsset, + UpdateRiskParams, + UpdateCompliance, + EmergencyPause + } + + struct UniversalAsset { + address tokenAddress; + AssetType assetType; + ComplianceLevel complianceLevel; + + // Metadata + string name; + string symbol; + uint8 decimals; + string jurisdiction; + + // Risk parameters + uint8 volatilityScore; // 0-100 + uint256 minBridgeAmount; + uint256 maxBridgeAmount; + uint256 dailyVolumeLimit; + + // PMM liquidity + address pmmPool; + bool hasLiquidity; + uint256 liquidityReserveUSD; + + // Governance + bool requiresGovernance; + address[] validators; + uint256 validationThreshold; + + // Status + bool isActive; + uint256 registeredAt; + uint256 lastUpdated; + } + + struct PendingAssetProposal { + bytes32 proposalId; + ProposalType proposalType; + address proposer; + uint256 proposedAt; + uint256 executeAfter; + uint256 votesFor; + uint256 votesAgainst; + bool executed; + bool cancelled; + + // Proposal data + address tokenAddress; + AssetType assetType; + ComplianceLevel complianceLevel; + string name; + string symbol; + uint8 decimals; + string jurisdiction; + uint8 volatilityScore; + uint256 minBridgeAmount; + uint256 maxBridgeAmount; + } + + // Storage + mapping(address => UniversalAsset) public assets; + mapping(AssetType => address[]) public assetsByType; + mapping(bytes32 => PendingAssetProposal) public proposals; + mapping(bytes32 => mapping(address => bool)) public hasVoted; + + // Governance parameters + uint256 public constant TIMELOCK_STANDARD = 1 days; + uint256 public constant TIMELOCK_MODERATE = 3 days; + uint256 public constant TIMELOCK_HIGH = 7 days; + uint256 public quorumPercentage; + + // Validator set + address[] public validators; + mapping(address => bool) public isValidator; + + // Events + event AssetProposed( + bytes32 indexed proposalId, + address indexed token, + AssetType assetType, + address proposer + ); + + event AssetApproved( + address indexed token, + AssetType assetType, + ComplianceLevel complianceLevel + ); + + event AssetRemoved(address indexed token, AssetType assetType); + + event ValidatorAdded(address indexed validator); + event ValidatorRemoved(address indexed validator); + + event ProposalVoted( + bytes32 indexed proposalId, + address indexed voter, + bool support + ); + + event ProposalExecuted(bytes32 indexed proposalId); + event ProposalCancelled(bytes32 indexed proposalId); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __ReentrancyGuard_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + _grantRole(PROPOSER_ROLE, admin); + _grantRole(VALIDATOR_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + + quorumPercentage = 51; // 51% quorum + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Propose new asset with timelock governance + */ + function proposeAsset( + address tokenAddress, + AssetType assetType, + ComplianceLevel complianceLevel, + string calldata name, + string calldata symbol, + uint8 decimals, + string calldata jurisdiction, + uint8 volatilityScore, + uint256 minBridge, + uint256 maxBridge + ) external onlyRole(PROPOSER_ROLE) returns (bytes32 proposalId) { + require(tokenAddress != address(0), "Zero address"); + require(!assets[tokenAddress].isActive, "Already registered"); + require(volatilityScore <= 100, "Invalid volatility"); + require(maxBridge >= minBridge, "Invalid limits"); + + proposalId = keccak256(abi.encode( + tokenAddress, + assetType, + block.timestamp, + msg.sender + )); + + uint256 timelockPeriod = _getTimelockPeriod(assetType, complianceLevel); + + PendingAssetProposal storage proposal = proposals[proposalId]; + proposal.proposalId = proposalId; + proposal.proposalType = ProposalType.AddAsset; + proposal.proposer = msg.sender; + proposal.proposedAt = block.timestamp; + proposal.executeAfter = block.timestamp + timelockPeriod; + proposal.tokenAddress = tokenAddress; + proposal.assetType = assetType; + proposal.complianceLevel = complianceLevel; + proposal.name = name; + proposal.symbol = symbol; + proposal.decimals = decimals; + proposal.jurisdiction = jurisdiction; + proposal.volatilityScore = volatilityScore; + proposal.minBridgeAmount = minBridge; + proposal.maxBridgeAmount = maxBridge; + + emit AssetProposed(proposalId, tokenAddress, assetType, msg.sender); + + return proposalId; + } + + /** + * @notice Vote on asset proposal + */ + function voteOnProposal( + bytes32 proposalId, + bool support + ) external onlyRole(VALIDATOR_ROLE) { + PendingAssetProposal storage proposal = proposals[proposalId]; + require(!proposal.executed, "Already executed"); + require(!proposal.cancelled, "Cancelled"); + require(!hasVoted[proposalId][msg.sender], "Already voted"); + + hasVoted[proposalId][msg.sender] = true; + + if (support) { + proposal.votesFor++; + } else { + proposal.votesAgainst++; + } + + emit ProposalVoted(proposalId, msg.sender, support); + } + + /** + * @notice Execute proposal after timelock + */ + function executeProposal(bytes32 proposalId) external nonReentrant { + PendingAssetProposal storage proposal = proposals[proposalId]; + + require(!proposal.executed, "Already executed"); + require(!proposal.cancelled, "Cancelled"); + require(block.timestamp >= proposal.executeAfter, "Timelock active"); + + // Check quorum + uint256 totalVotes = proposal.votesFor + proposal.votesAgainst; + uint256 requiredVotes = (validators.length * quorumPercentage) / 100; + require(totalVotes >= requiredVotes, "Quorum not met"); + require(proposal.votesFor > proposal.votesAgainst, "Rejected"); + + // Execute based on proposal type + if (proposal.proposalType == ProposalType.AddAsset) { + _registerAsset(proposal); + } + + proposal.executed = true; + emit ProposalExecuted(proposalId); + } + + /** + * @notice Internal asset registration + */ + function _registerAsset(PendingAssetProposal storage proposal) internal { + UniversalAsset storage asset = assets[proposal.tokenAddress]; + + asset.tokenAddress = proposal.tokenAddress; + asset.assetType = proposal.assetType; + asset.complianceLevel = proposal.complianceLevel; + asset.name = proposal.name; + asset.symbol = proposal.symbol; + asset.decimals = proposal.decimals; + asset.jurisdiction = proposal.jurisdiction; + asset.volatilityScore = proposal.volatilityScore; + asset.minBridgeAmount = proposal.minBridgeAmount; + asset.maxBridgeAmount = proposal.maxBridgeAmount; + asset.dailyVolumeLimit = proposal.maxBridgeAmount * 10; + asset.requiresGovernance = _requiresGovernance( + proposal.assetType, + proposal.complianceLevel + ); + asset.isActive = true; + asset.registeredAt = block.timestamp; + asset.lastUpdated = block.timestamp; + + assetsByType[proposal.assetType].push(proposal.tokenAddress); + + emit AssetApproved( + proposal.tokenAddress, + proposal.assetType, + proposal.complianceLevel + ); + } + + /** + * @notice Add validator + */ + function addValidator(address validator) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(validator != address(0), "Zero address"); + require(!isValidator[validator], "Already validator"); + + validators.push(validator); + isValidator[validator] = true; + _grantRole(VALIDATOR_ROLE, validator); + + emit ValidatorAdded(validator); + } + + /** + * @notice Remove validator + */ + function removeValidator(address validator) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isValidator[validator], "Not validator"); + + isValidator[validator] = false; + _revokeRole(VALIDATOR_ROLE, validator); + + // Remove from array + for (uint256 i = 0; i < validators.length; i++) { + if (validators[i] == validator) { + validators[i] = validators[validators.length - 1]; + validators.pop(); + break; + } + } + + emit ValidatorRemoved(validator); + } + + /** + * @notice Update PMM pool for asset + */ + function updatePMMPool( + address token, + address pmmPool + ) external onlyRole(REGISTRAR_ROLE) { + require(assets[token].isActive, "Not registered"); + + assets[token].pmmPool = pmmPool; + assets[token].hasLiquidity = pmmPool != address(0); + assets[token].lastUpdated = block.timestamp; + } + + /** + * @notice Get timelock period based on asset type and compliance + */ + function _getTimelockPeriod( + AssetType assetType, + ComplianceLevel complianceLevel + ) internal pure returns (uint256) { + if (assetType == AssetType.Security || + assetType == AssetType.ISO4217W || + complianceLevel >= ComplianceLevel.Institutional) { + return TIMELOCK_HIGH; + } else if (assetType == AssetType.Commodity || + assetType == AssetType.RealWorldAsset || + complianceLevel >= ComplianceLevel.Accredited) { + return TIMELOCK_MODERATE; + } else { + return TIMELOCK_STANDARD; + } + } + + /** + * @notice Check if asset type requires governance + */ + function _requiresGovernance( + AssetType assetType, + ComplianceLevel complianceLevel + ) internal pure returns (bool) { + return assetType == AssetType.Security || + assetType == AssetType.ISO4217W || + assetType == AssetType.Commodity || + complianceLevel >= ComplianceLevel.Accredited; + } + + // View functions + + function getAsset(address token) external view returns (UniversalAsset memory) { + return assets[token]; + } + + function getAssetType(address token) external view returns (AssetType) { + return assets[token].assetType; + } + + function getAssetsByType(AssetType assetType) external view returns (address[] memory) { + return assetsByType[assetType]; + } + + function getValidators() external view returns (address[] memory) { + return validators; + } + + function getProposal(bytes32 proposalId) external view returns (PendingAssetProposal memory) { + return proposals[proposalId]; + } + + function isAssetActive(address token) external view returns (bool) { + return assets[token].isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/CommodityHandler.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/CommodityHandler.sol new file mode 100644 index 0000000..0cfac6b --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/CommodityHandler.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../interfaces/IAssetTypeHandler.sol"; + +/** + * @title CommodityHandler + * @notice Handler for commodity-backed tokens (gold, oil, etc.) with certificate validation + */ +contract CommodityHandler is IAssetTypeHandler { + // Certificate registry for commodity authenticity + mapping(address => mapping(bytes32 => bool)) public validCertificates; + + // Custodian registry + mapping(address => address) public custodians; + + function validateAsset(address token) external view override returns (bool) { + if (token.code.length == 0) return false; + + // Verify custodian is registered + return custodians[token] != address(0); + } + + function getRequiredCompliance() external pure override returns (UniversalAssetRegistry.ComplianceLevel) { + return UniversalAssetRegistry.ComplianceLevel.KYC; + } + + function getDefaultLimits() external pure override returns (uint256 min, uint256 max) { + return (1e15, 1000000e18); // 0.001 to 1M units + } + + function preTransferHook(address, address, uint256 amount) external pure override { + require(amount > 0, "Invalid amount"); + // Certificate validation would happen here in production + } + + function postTransferHook(address, address, uint256) external pure override { + // Post-transfer custodian notification if needed + } + + // Admin functions + function registerCustodian(address token, address custodian) external { + custodians[token] = custodian; + } + + function registerCertificate(address token, bytes32 certificateHash) external { + validCertificates[token][certificateHash] = true; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/ERC20Handler.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/ERC20Handler.sol new file mode 100644 index 0000000..a41b343 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/ERC20Handler.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../interfaces/IAssetTypeHandler.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title ERC20Handler + * @notice Handler for standard ERC-20 tokens + */ +contract ERC20Handler is IAssetTypeHandler { + function validateAsset(address token) external view override returns (bool) { + if (token.code.length == 0) return false; + + try IERC20(token).totalSupply() returns (uint256) { + return true; + } catch { + return false; + } + } + + function getRequiredCompliance() external pure override returns (UniversalAssetRegistry.ComplianceLevel) { + return UniversalAssetRegistry.ComplianceLevel.Public; + } + + function getDefaultLimits() external pure override returns (uint256 min, uint256 max) { + return (1e15, 1000000e18); // 0.001 to 1M tokens + } + + function preTransferHook(address, address, uint256) external pure override { + // No pre-transfer checks for standard ERC-20 + } + + function postTransferHook(address, address, uint256) external pure override { + // No post-transfer hooks for standard ERC-20 + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/GRUHandler.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/GRUHandler.sol new file mode 100644 index 0000000..a61998e --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/GRUHandler.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../interfaces/IAssetTypeHandler.sol"; +import "../../vault/libraries/GRUConstants.sol"; + +/** + * @title GRUHandler + * @notice Handler for Global Reserve Unit (GRU) tokens with layer validation + */ +contract GRUHandler is IAssetTypeHandler { + using GRUConstants for *; + + function validateAsset(address token) external view override returns (bool) { + if (token.code.length == 0) return false; + + // Additional GRU-specific validation could be added here + // For now, basic contract existence check + return true; + } + + function getRequiredCompliance() external pure override returns (UniversalAssetRegistry.ComplianceLevel) { + return UniversalAssetRegistry.ComplianceLevel.Institutional; + } + + function getDefaultLimits() external pure override returns (uint256 min, uint256 max) { + return (1e18, 10000000e18); // 1 to 10M GRU + } + + function preTransferHook(address, address, uint256) external pure override { + // GRU layer validation happens in the token contract itself + } + + function postTransferHook(address, address, uint256) external pure override { + // Post-transfer hooks for GRU if needed + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/ISO4217WHandler.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/ISO4217WHandler.sol new file mode 100644 index 0000000..75db2fb --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/ISO4217WHandler.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../interfaces/IAssetTypeHandler.sol"; +import "../../iso4217w/interfaces/IISO4217WToken.sol"; + +/** + * @title ISO4217WHandler + * @notice Handler for ISO-4217W eMoney/CBDC tokens with compliance checks + */ +contract ISO4217WHandler is IAssetTypeHandler { + function validateAsset(address token) external view override returns (bool) { + if (token.code.length == 0) return false; + + try IISO4217WToken(token).currencyCode() returns (string memory code) { + // Verify it follows ISO-4217W format (e.g., USDW, EURW) + bytes memory codeBytes = bytes(code); + return codeBytes.length >= 4 && codeBytes[codeBytes.length - 1] == 'W'; + } catch { + return false; + } + } + + function getRequiredCompliance() external pure override returns (UniversalAssetRegistry.ComplianceLevel) { + return UniversalAssetRegistry.ComplianceLevel.KYC; + } + + function getDefaultLimits() external pure override returns (uint256 min, uint256 max) { + return (100e18, 1000000e18); // 100 to 1M units + } + + function preTransferHook(address from, address to, uint256 amount) external view override { + // Compliance checks would go here + // In practice, this would integrate with ComplianceGuard + require(from != address(0) && to != address(0), "Invalid addresses"); + require(amount > 0, "Invalid amount"); + } + + function postTransferHook(address, address, uint256) external pure override { + // Post-transfer compliance tracking if needed + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/SecurityHandler.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/SecurityHandler.sol new file mode 100644 index 0000000..11e9223 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/handlers/SecurityHandler.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../interfaces/IAssetTypeHandler.sol"; + +/** + * @title SecurityHandler + * @notice Handler for tokenized securities with accredited investor requirements + */ +contract SecurityHandler is IAssetTypeHandler { + // In production, this would integrate with accredited investor registry + mapping(address => bool) public accreditedInvestors; + + function validateAsset(address token) external view override returns (bool) { + if (token.code.length == 0) return false; + + // Additional security token validation + // Could check for compliance with standards like ERC-3643 (T-REX) + return true; + } + + function getRequiredCompliance() external pure override returns (UniversalAssetRegistry.ComplianceLevel) { + return UniversalAssetRegistry.ComplianceLevel.Accredited; + } + + function getDefaultLimits() external pure override returns (uint256 min, uint256 max) { + return (1e18, 100000e18); // 1 to 100K securities + } + + function preTransferHook(address from, address to, uint256 amount) external view override { + // Verify accredited investor status + if (from != address(0)) { + require(accreditedInvestors[from], "Sender not accredited"); + } + if (to != address(0)) { + require(accreditedInvestors[to], "Recipient not accredited"); + } + require(amount > 0, "Invalid amount"); + } + + function postTransferHook(address, address, uint256) external pure override { + // Post-transfer compliance tracking (e.g., T+2 settlement) + } + + // Admin function to set accredited status (in production, would be permissioned) + function setAccreditedStatus(address investor, bool status) external { + accreditedInvestors[investor] = status; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/registry/interfaces/IAssetTypeHandler.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/interfaces/IAssetTypeHandler.sol new file mode 100644 index 0000000..62ad4fc --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/registry/interfaces/IAssetTypeHandler.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../UniversalAssetRegistry.sol"; + +/** + * @title IAssetTypeHandler + * @notice Interface for asset-specific validation and hooks + */ +interface IAssetTypeHandler { + function validateAsset(address token) external view returns (bool); + function getRequiredCompliance() external view returns (UniversalAssetRegistry.ComplianceLevel); + function getDefaultLimits() external view returns (uint256 min, uint256 max); + function preTransferHook(address from, address to, uint256 amount) external; + function postTransferHook(address from, address to, uint256 amount) external; +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/relay/CCIPRelayBridge.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/relay/CCIPRelayBridge.sol new file mode 100644 index 0000000..aa4b2d5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/relay/CCIPRelayBridge.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "../ccip/IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title CCIP Relay Bridge + * @notice Bridge that accepts messages from a relay router + * @dev Modified version of CCIPWETH9Bridge that accepts relay router + */ +contract CCIPRelayBridge is AccessControl { + bytes32 public constant ROUTER_ROLE = keccak256("ROUTER_ROLE"); + + address public immutable weth9; + address public relayRouter; + + // Track cross-chain transfers for replay protection + mapping(bytes32 => bool) public processedTransfers; + mapping(address => uint256) public nonces; + + event CrossChainTransferCompleted( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed recipient, + uint256 amount + ); + + constructor(address _weth9, address _relayRouter) { + require(_weth9 != address(0), "CCIPRelayBridge: zero WETH9"); + require(_relayRouter != address(0), "CCIPRelayBridge: zero router"); + + weth9 = _weth9; + relayRouter = _relayRouter; + _grantRole(ROUTER_ROLE, _relayRouter); + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + } + + /** + * @notice Update relay router address + */ + function updateRelayRouter(address newRelayRouter) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(newRelayRouter != address(0), "CCIPRelayBridge: zero address"); + _revokeRole(ROUTER_ROLE, relayRouter); + relayRouter = newRelayRouter; + _grantRole(ROUTER_ROLE, newRelayRouter); + } + + /** + * @notice Receive WETH9 tokens from another chain via relay + * @param message The CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRole(ROUTER_ROLE) { + // Replay protection + require(!processedTransfers[message.messageId], "CCIPRelayBridge: transfer already processed"); + processedTransfers[message.messageId] = true; + + // Validate token amounts + require(message.tokenAmounts.length > 0, "CCIPRelayBridge: no tokens"); + require(message.tokenAmounts[0].token == weth9, "CCIPRelayBridge: invalid token"); + + uint256 amount = message.tokenAmounts[0].amount; + require(amount > 0, "CCIPRelayBridge: invalid amount"); + + // Decode transfer data (recipient, amount, sender, nonce) + (address recipient, , , ) = abi.decode( + message.data, + (address, uint256, address, uint256) + ); + + require(recipient != address(0), "CCIPRelayBridge: zero recipient"); + + // Transfer WETH9 to recipient + require(IERC20(weth9).transfer(recipient, amount), "CCIPRelayBridge: transfer failed"); + + emit CrossChainTransferCompleted( + message.messageId, + message.sourceChainSelector, + recipient, + amount + ); + } + + /** + * @notice Get user nonce + */ + function getUserNonce(address user) external view returns (uint256) { + return nonces[user]; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/relay/CCIPRelayRouter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/relay/CCIPRelayRouter.sol new file mode 100644 index 0000000..9b1ce8b --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/relay/CCIPRelayRouter.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "../ccip/IRouterClient.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title CCIP Relay Router + * @notice Relay router that forwards CCIP messages from off-chain relay to bridge contracts + * @dev This contract acts as a relay endpoint on the destination chain + */ +contract CCIPRelayRouter is AccessControl { + bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE"); + + // Mapping of bridge contracts that can receive messages + mapping(address => bool) public authorizedBridges; + + event MessageRelayed( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed bridge, + address recipient, + uint256 amount + ); + + event BridgeAuthorized(address indexed bridge); + event BridgeRevoked(address indexed bridge); + + constructor() { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + } + + /** + * @notice Authorize a bridge contract to receive relayed messages + */ + function authorizeBridge(address bridge) external onlyRole(DEFAULT_ADMIN_ROLE) { + authorizedBridges[bridge] = true; + emit BridgeAuthorized(bridge); + } + + /** + * @notice Revoke authorization for a bridge contract + */ + function revokeBridge(address bridge) external onlyRole(DEFAULT_ADMIN_ROLE) { + authorizedBridges[bridge] = false; + emit BridgeRevoked(bridge); + } + + /** + * @notice Grant relayer role to an address + */ + function grantRelayerRole(address relayer) external onlyRole(DEFAULT_ADMIN_ROLE) { + _grantRole(RELAYER_ROLE, relayer); + } + + /** + * @notice Revoke relayer role from an address + */ + function revokeRelayerRole(address relayer) external onlyRole(DEFAULT_ADMIN_ROLE) { + _revokeRole(RELAYER_ROLE, relayer); + } + + /** + * @notice Relay a CCIP message to a bridge contract + * @param bridge The bridge contract address to receive the message + * @param message The CCIP message to relay + */ + function relayMessage( + address bridge, + IRouterClient.Any2EVMMessage calldata message + ) external onlyRole(RELAYER_ROLE) { + require(authorizedBridges[bridge], "CCIPRelayRouter: bridge not authorized"); + + // Call bridge's ccipReceive function using low-level call + // This ensures proper ABI encoding for the struct parameter + // The call will revert with the actual error if it fails + (bool success, bytes memory returnData) = bridge.call( + abi.encodeWithSignature("ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))", message) + ); + require(success, "CCIPRelayRouter: ccipReceive failed"); + + // If we get here, the call succeeded + // Decode recipient and amount from message data + (address recipient, uint256 amount, , ) = abi.decode( + message.data, + (address, uint256, address, uint256) + ); + + emit MessageRelayed( + message.messageId, + message.sourceChainSelector, + bridge, + recipient, + amount + ); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/IReserveSystem.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/IReserveSystem.sol new file mode 100644 index 0000000..c23f819 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/IReserveSystem.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IReserveSystem + * @notice Interface for the GRU Reserve System + * @dev Defines the core functionality for reserve management, conversion, and redemption + */ +interface IReserveSystem { + // ============ Events ============ + + event ReserveDeposited( + address indexed asset, + uint256 amount, + address indexed depositor, + bytes32 indexed reserveId + ); + + event ReserveWithdrawn( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed reserveId + ); + + event ConversionExecuted( + address indexed sourceAsset, + address indexed targetAsset, + uint256 sourceAmount, + uint256 targetAmount, + bytes32 indexed conversionId, + uint256 fees + ); + + event RedemptionExecuted( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed redemptionId + ); + + event PriceFeedUpdated( + address indexed asset, + uint256 price, + uint256 timestamp + ); + + // ============ Reserve Management ============ + + /** + * @notice Deposit assets into the reserve system + * @param asset Address of the asset to deposit + * @param amount Amount to deposit + * @return reserveId Unique identifier for this reserve deposit + */ + function depositReserve( + address asset, + uint256 amount + ) external returns (bytes32 reserveId); + + /** + * @notice Withdraw assets from the reserve system + * @param asset Address of the asset to withdraw + * @param amount Amount to withdraw + * @param recipient Address to receive the withdrawn assets + * @return reserveId Unique identifier for this reserve withdrawal + */ + function withdrawReserve( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 reserveId); + + /** + * @notice Get the total reserve balance for an asset + * @param asset Address of the asset + * @return balance Total reserve balance + */ + function getReserveBalance(address asset) external view returns (uint256 balance); + + /** + * @notice Get reserve balance for a specific reserve ID + * @param reserveId Unique identifier for the reserve + * @return asset Address of the asset + * @return balance Reserve balance + */ + function getReserveById(bytes32 reserveId) external view returns (address asset, uint256 balance); + + // ============ Conversion ============ + + /** + * @notice Convert assets using optimal path (XAU triangulation) + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return conversionId Unique identifier for this conversion + * @return targetAmount Amount received after conversion + * @return fees Total fees charged + */ + function convertAssets( + address sourceAsset, + address targetAsset, + uint256 amount + ) external returns ( + bytes32 conversionId, + uint256 targetAmount, + uint256 fees + ); + + /** + * @notice Calculate conversion amount without executing + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return targetAmount Expected amount after conversion + * @return fees Expected fees + * @return path Optimal conversion path + */ + function calculateConversion( + address sourceAsset, + address targetAsset, + uint256 amount + ) external view returns ( + uint256 targetAmount, + uint256 fees, + address[] memory path + ); + + // ============ Redemption ============ + + /** + * @notice Redeem assets from the reserve system + * @param asset Address of the asset to redeem + * @param amount Amount to redeem + * @param recipient Address to receive the redeemed assets + * @return redemptionId Unique identifier for this redemption + */ + function redeem( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 redemptionId); + + // ============ Price Feeds ============ + + /** + * @notice Update price feed for an asset + * @param asset Address of the asset + * @param price Current price + * @param timestamp Price timestamp + */ + function updatePriceFeed( + address asset, + uint256 price, + uint256 timestamp + ) external; + + /** + * @notice Get current price for an asset + * @param asset Address of the asset + * @return price Current price + * @return timestamp Price timestamp + */ + function getPrice(address asset) external view returns (uint256 price, uint256 timestamp); + + /** + * @notice Get price for conversion between two assets + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @return price Conversion price (target per source) + */ + function getConversionPrice( + address sourceAsset, + address targetAsset + ) external view returns (uint256 price); +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/MockPriceFeed.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/MockPriceFeed.sol new file mode 100644 index 0000000..d0497a0 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/MockPriceFeed.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "../oracle/IAggregator.sol"; + +/** + * @title MockPriceFeed + * @notice Mock price feed for testing and development + * @dev Implements IAggregator interface for Chainlink compatibility + */ +contract MockPriceFeed is IAggregator, Ownable { + int256 private _latestAnswer; + uint256 private _latestTimestamp; + uint8 private _decimals; + + event PriceUpdated(int256 newPrice, uint256 timestamp); + + constructor(int256 initialPrice, uint8 decimals_) Ownable(msg.sender) { + _latestAnswer = initialPrice; + _latestTimestamp = block.timestamp; + _decimals = decimals_; + } + + /** + * @notice Update price (owner only) + * @param newPrice New price value + */ + function updatePrice(int256 newPrice) external onlyOwner { + require(newPrice > 0, "MockPriceFeed: price must be positive"); + _latestAnswer = newPrice; + _latestTimestamp = block.timestamp; + emit PriceUpdated(newPrice, block.timestamp); + } + + /** + * @notice Update price with custom timestamp + * @param newPrice New price value + * @param timestamp Custom timestamp + */ + function updatePriceWithTimestamp(int256 newPrice, uint256 timestamp) external onlyOwner { + require(newPrice > 0, "MockPriceFeed: price must be positive"); + require(timestamp <= block.timestamp, "MockPriceFeed: future timestamp"); + _latestAnswer = newPrice; + _latestTimestamp = timestamp; + emit PriceUpdated(newPrice, timestamp); + } + + /** + * @notice Get latest answer + * @return answer Latest price answer + */ + function latestAnswer() external view override returns (int256) { + return _latestAnswer; + } + + /** + * @notice Get latest timestamp + * @return timestamp Latest price timestamp + */ + function latestTimestamp() external view returns (uint256) { + return _latestTimestamp; + } + + /** + * @notice Get decimals + * @return decimals Number of decimals + */ + function decimals() external view override returns (uint8) { + return _decimals; + } + + /** + * @notice Get latest round data + * @return roundId Round ID (mock: always 1) + * @return answer Latest price answer + * @return startedAt Start timestamp (mock: same as latestTimestamp) + * @return updatedAt Latest timestamp + * @return answeredInRound Round ID (mock: always 1) + */ + function latestRoundData() external view override returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ) { + return ( + 1, + _latestAnswer, + _latestTimestamp, + _latestTimestamp, + 1 + ); + } + + /** + * @notice Get round data (mock: always returns latest) + * @param roundId Round ID (ignored in mock) + * @return roundId Round ID + * @return answer Latest price answer + * @return startedAt Start timestamp + * @return updatedAt Latest timestamp + * @return answeredInRound Round ID + */ + function getRoundData(uint80 roundId) external view override returns ( + uint80, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ) { + return ( + roundId, + _latestAnswer, + _latestTimestamp, + _latestTimestamp, + roundId + ); + } + + /** + * @notice Get description + * @return description Price feed description + */ + function description() external pure override returns (string memory) { + return "Mock Price Feed"; + } + + /** + * @notice Update answer (for testing) + * @param answer New answer value + */ + function updateAnswer(uint256 answer) external override onlyOwner { + require(answer > 0, "MockPriceFeed: answer must be positive"); + _latestAnswer = int256(answer); + _latestTimestamp = block.timestamp; + emit PriceUpdated(int256(answer), block.timestamp); + } + + /** + * @notice Get version + * @return version Version number + */ + function version() external pure override returns (uint256) { + return 1; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/OraclePriceFeed.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/OraclePriceFeed.sol new file mode 100644 index 0000000..64a8560 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/OraclePriceFeed.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../oracle/IAggregator.sol"; +import "./IReserveSystem.sol"; + +/** + * @title OraclePriceFeed + * @notice Integrates Reserve System with Chainlink-compatible oracle aggregators + * @dev Provides price feeds from multiple sources with aggregation and validation + */ +contract OraclePriceFeed is AccessControl { + bytes32 public constant PRICE_FEED_UPDATER_ROLE = keccak256("PRICE_FEED_UPDATER_ROLE"); + + IReserveSystem public reserveSystem; + + // Asset to aggregator mapping + mapping(address => address) public aggregators; + // Asset to price multiplier (for decimals conversion) + mapping(address => uint256) public priceMultipliers; + + // Price feed update interval (seconds) + uint256 public updateInterval = 30; + + // Last update timestamp per asset + mapping(address => uint256) public lastUpdateTime; + + event AggregatorSet(address indexed asset, address indexed aggregator, uint256 multiplier); + event PriceFeedUpdated(address indexed asset, uint256 price, uint256 timestamp); + + constructor(address admin, address reserveSystem_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(PRICE_FEED_UPDATER_ROLE, admin); + + reserveSystem = IReserveSystem(reserveSystem_); + } + + /** + * @notice Set aggregator for an asset + * @param asset Address of the asset + * @param aggregator Address of the Chainlink aggregator + * @param multiplier Price multiplier for decimals conversion (e.g., 1e10 for 8-decimal aggregator to 18 decimals) + */ + function setAggregator( + address asset, + address aggregator, + uint256 multiplier + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(asset != address(0), "OraclePriceFeed: zero asset"); + require(aggregator != address(0), "OraclePriceFeed: zero aggregator"); + require(multiplier > 0, "OraclePriceFeed: zero multiplier"); + + aggregators[asset] = aggregator; + priceMultipliers[asset] = multiplier; + + emit AggregatorSet(asset, aggregator, multiplier); + } + + /** + * @notice Update price feed from aggregator + * @param asset Address of the asset + */ + function updatePriceFeed(address asset) public onlyRole(PRICE_FEED_UPDATER_ROLE) { + address aggregator = aggregators[asset]; + require(aggregator != address(0), "OraclePriceFeed: aggregator not set"); + + IAggregator agg = IAggregator(aggregator); + (, int256 answer, , uint256 updatedAt, ) = agg.latestRoundData(); + + require(answer > 0, "OraclePriceFeed: invalid price"); + require(updatedAt > 0, "OraclePriceFeed: invalid timestamp"); + require(block.timestamp - updatedAt <= updateInterval * 2, "OraclePriceFeed: stale price"); + + uint256 price = uint256(answer) * priceMultipliers[asset]; + + reserveSystem.updatePriceFeed(asset, price, updatedAt); + + lastUpdateTime[asset] = block.timestamp; + + emit PriceFeedUpdated(asset, price, updatedAt); + } + + /** + * @notice Update multiple price feeds + * @param assets Array of asset addresses + */ + function updateMultiplePriceFeeds(address[] calldata assets) external onlyRole(PRICE_FEED_UPDATER_ROLE) { + for (uint256 i = 0; i < assets.length; i++) { + updatePriceFeed(assets[i]); + } + } + + /** + * @notice Get current price from aggregator and update reserve system + * @param asset Address of the asset + * @return price Current price + * @return timestamp Price timestamp + */ + function getAndUpdatePrice(address asset) external returns (uint256 price, uint256 timestamp) { + updatePriceFeed(asset); + return reserveSystem.getPrice(asset); + } + + /** + * @notice Set update interval + * @param interval New update interval in seconds + */ + function setUpdateInterval(uint256 interval) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(interval > 0, "OraclePriceFeed: zero interval"); + updateInterval = interval; + } + + /** + * @notice Check if price feed needs update + * @param asset Address of the asset + * @return updateNeeded True if update is needed + */ + function needsUpdate(address asset) external view returns (bool updateNeeded) { + uint256 lastUpdate = lastUpdateTime[asset]; + if (lastUpdate == 0) { + return true; + } + return block.timestamp - lastUpdate >= updateInterval; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/PriceFeedKeeper.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/PriceFeedKeeper.sol new file mode 100644 index 0000000..72a71ad --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/PriceFeedKeeper.sol @@ -0,0 +1,260 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./OraclePriceFeed.sol"; + +/** + * @title PriceFeedKeeper + * @notice Keeper contract for automated price feed updates + * @dev Can be called by external keepers (Chainlink Keepers, Gelato, etc.) to update price feeds + */ +contract PriceFeedKeeper is AccessControl, ReentrancyGuard { + bytes32 public constant KEEPER_ROLE = keccak256("KEEPER_ROLE"); + bytes32 public constant UPKEEPER_ROLE = keccak256("UPKEEPER_ROLE"); // Can update keeper addresses + + OraclePriceFeed public oraclePriceFeed; + + // Asset tracking + address[] public trackedAssets; + mapping(address => bool) public isTracked; + + // Update configuration + uint256 public updateInterval = 30; // seconds + mapping(address => uint256) public lastUpdateTime; + + // Keeper configuration + uint256 public maxUpdatesPerCall = 10; // Maximum assets to update per call + uint256 public gasBuffer = 50000; // Gas buffer for keeper operations + + event AssetTracked(address indexed asset); + event AssetUntracked(address indexed asset); + event PriceFeedsUpdated(address[] assets, uint256 timestamp); + event UpdateIntervalChanged(uint256 oldInterval, uint256 newInterval); + event MaxUpdatesPerCallChanged(uint256 oldMax, uint256 newMax); + + constructor(address admin, address oraclePriceFeed_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(KEEPER_ROLE, admin); + _grantRole(UPKEEPER_ROLE, admin); + + oraclePriceFeed = OraclePriceFeed(oraclePriceFeed_); + } + + /** + * @notice Add asset to tracking list + * @param asset Address of the asset to track + */ + function trackAsset(address asset) external onlyRole(UPKEEPER_ROLE) { + require(asset != address(0), "PriceFeedKeeper: zero address"); + require(!isTracked[asset], "PriceFeedKeeper: already tracked"); + + trackedAssets.push(asset); + isTracked[asset] = true; + + emit AssetTracked(asset); + } + + /** + * @notice Remove asset from tracking list + * @param asset Address of the asset to untrack + */ + function untrackAsset(address asset) external onlyRole(UPKEEPER_ROLE) { + require(isTracked[asset], "PriceFeedKeeper: not tracked"); + + // Remove from array + for (uint256 i = 0; i < trackedAssets.length; i++) { + if (trackedAssets[i] == asset) { + trackedAssets[i] = trackedAssets[trackedAssets.length - 1]; + trackedAssets.pop(); + break; + } + } + + isTracked[asset] = false; + delete lastUpdateTime[asset]; + + emit AssetUntracked(asset); + } + + /** + * @notice Check if any assets need updating + * @return updateNeeded True if any assets need updating + * @return assets Array of assets that need updating + */ + function checkUpkeep() public view returns (bool updateNeeded, address[] memory assets) { + address[] memory needsUpdateList = new address[](trackedAssets.length); + uint256 count = 0; + + for (uint256 i = 0; i < trackedAssets.length; i++) { + address asset = trackedAssets[i]; + if (_needsUpdate(asset)) { + needsUpdateList[count] = asset; + count++; + } + } + + if (count > 0) { + // Resize array + assets = new address[](count); + for (uint256 i = 0; i < count; i++) { + assets[i] = needsUpdateList[i]; + } + updateNeeded = true; + } else { + assets = new address[](0); + updateNeeded = false; + } + } + + /** + * @notice Perform upkeep - update price feeds that need updating + * @return success True if updates were successful + * @return updatedAssets Array of assets that were updated + */ + function performUpkeep() external onlyRole(KEEPER_ROLE) nonReentrant returns ( + bool success, + address[] memory updatedAssets + ) { + address[] memory needsUpdateList = new address[](trackedAssets.length); + uint256 count = 0; + + // Collect assets that need updating + for (uint256 i = 0; i < trackedAssets.length; i++) { + address asset = trackedAssets[i]; + if (_needsUpdate(asset) && count < maxUpdatesPerCall) { + needsUpdateList[count] = asset; + count++; + } + } + + if (count == 0) { + return (true, new address[](0)); + } + + // Resize array + updatedAssets = new address[](count); + for (uint256 i = 0; i < count; i++) { + updatedAssets[i] = needsUpdateList[i]; + } + + // Update price feeds + try oraclePriceFeed.updateMultiplePriceFeeds(updatedAssets) { + // Update last update time + uint256 currentTime = block.timestamp; + for (uint256 i = 0; i < count; i++) { + lastUpdateTime[updatedAssets[i]] = currentTime; + } + + emit PriceFeedsUpdated(updatedAssets, currentTime); + success = true; + } catch { + success = false; + } + } + + /** + * @notice Update specific assets + * @param assets Array of asset addresses to update + */ + function updateAssets(address[] calldata assets) external onlyRole(KEEPER_ROLE) nonReentrant { + require(assets.length > 0, "PriceFeedKeeper: empty array"); + require(assets.length <= maxUpdatesPerCall, "PriceFeedKeeper: too many assets"); + + // Verify all assets are tracked + for (uint256 i = 0; i < assets.length; i++) { + require(isTracked[assets[i]], "PriceFeedKeeper: asset not tracked"); + } + + oraclePriceFeed.updateMultiplePriceFeeds(assets); + + uint256 currentTime = block.timestamp; + for (uint256 i = 0; i < assets.length; i++) { + lastUpdateTime[assets[i]] = currentTime; + } + + emit PriceFeedsUpdated(assets, currentTime); + } + + /** + * @notice Check if a specific asset needs updating + * @param asset Address of the asset + * @return needsUpdate True if asset needs updating + */ + function needsUpdate(address asset) external view returns (bool) { + return _needsUpdate(asset); + } + + /** + * @notice Get all tracked assets + * @return assets Array of tracked asset addresses + */ + function getTrackedAssets() external view returns (address[] memory) { + return trackedAssets; + } + + /** + * @notice Set update interval + * @param interval New update interval in seconds + */ + function setUpdateInterval(uint256 interval) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(interval > 0, "PriceFeedKeeper: zero interval"); + uint256 oldInterval = updateInterval; + updateInterval = interval; + emit UpdateIntervalChanged(oldInterval, interval); + } + + /** + * @notice Set maximum updates per call + * @param max New maximum updates per call + */ + function setMaxUpdatesPerCall(uint256 max) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(max > 0, "PriceFeedKeeper: zero max"); + uint256 oldMax = maxUpdatesPerCall; + maxUpdatesPerCall = max; + emit MaxUpdatesPerCallChanged(oldMax, max); + } + + /** + * @notice Set oracle price feed address + * @param oraclePriceFeed_ New oracle price feed address + */ + function setOraclePriceFeed(address oraclePriceFeed_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(oraclePriceFeed_ != address(0), "PriceFeedKeeper: zero address"); + oraclePriceFeed = OraclePriceFeed(oraclePriceFeed_); + } + + /** + * @notice Internal function to check if asset needs update + * @param asset Address of the asset + * @return True if asset needs updating + */ + function _needsUpdate(address asset) internal view returns (bool) { + if (!isTracked[asset]) { + return false; + } + + uint256 lastUpdate = lastUpdateTime[asset]; + if (lastUpdate == 0) { + return true; // Never updated + } + + return block.timestamp - lastUpdate >= updateInterval; + } + + /** + * @notice Get gas estimate for upkeep + * @return gasEstimate Estimated gas needed for upkeep + */ + function getUpkeepGasEstimate() external view returns (uint256 gasEstimate) { + (bool needsUpdate_, address[] memory assets) = checkUpkeep(); + if (!needsUpdate_ || assets.length == 0) { + return 0; + } + + // Base gas + gas per asset update + gasEstimate = 50000 + (assets.length * 30000) + gasBuffer; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/ReserveSystem.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/ReserveSystem.sol new file mode 100644 index 0000000..4afb2c4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/ReserveSystem.sol @@ -0,0 +1,326 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./IReserveSystem.sol"; + +/** + * @title ReserveSystem + * @notice Core implementation of the GRU Reserve System + * @dev Manages reserves in multiple asset classes (XAU, digital assets, sovereign instruments) + * Implements XAU triangulation conversion algorithm and redemption mechanisms + */ +contract ReserveSystem is IReserveSystem, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + // ============ Constants ============ + + bytes32 public constant RESERVE_MANAGER_ROLE = keccak256("RESERVE_MANAGER_ROLE"); + bytes32 public constant PRICE_FEED_ROLE = keccak256("PRICE_FEED_ROLE"); + bytes32 public constant CONVERSION_OPERATOR_ROLE = keccak256("CONVERSION_OPERATOR_ROLE"); + + // Conversion fee parameters (basis points: 10000 = 100%) + uint256 public constant BASE_FEE_BPS = 10; // 0.1% + uint256 public constant SLIPPAGE_FEE_BPS = 50; // 0.5% per 1% slippage + uint256 public constant LARGE_TRANSACTION_THRESHOLD = 1_000_000 * 1e18; // $1M + uint256 public constant LARGE_TRANSACTION_FEE_BPS = 5; // 0.05% + + // Price staleness threshold (30 seconds) + uint256 public constant PRICE_STALENESS_THRESHOLD = 30; + + // Maximum slippage (0.5% for liquid, 1.0% for less liquid) + uint256 public constant MAX_SLIPPAGE_BPS = 50; // 0.5% + + // ============ Storage ============ + + struct Reserve { + address asset; + uint256 balance; + uint256 lastUpdated; + } + + struct PriceFeed { + uint256 price; + uint256 timestamp; + bool isValid; + } + + struct Conversion { + address sourceAsset; + address targetAsset; + uint256 sourceAmount; + uint256 targetAmount; + uint256 fees; + address[] path; + uint256 timestamp; + } + + // Reserve tracking + mapping(address => uint256) public reserveBalances; + mapping(bytes32 => Reserve) public reserves; + bytes32[] public reserveIds; + + // Price feeds + mapping(address => PriceFeed) public priceFeeds; + address[] public supportedAssets; + + // Conversion tracking + mapping(bytes32 => Conversion) public conversions; + bytes32[] public conversionIds; + + // Asset metadata + mapping(address => bool) public isSupportedAsset; + mapping(address => bool) public isLiquidAsset; // For slippage calculation + + // ============ Constructor ============ + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(RESERVE_MANAGER_ROLE, admin); + _grantRole(PRICE_FEED_ROLE, admin); + _grantRole(CONVERSION_OPERATOR_ROLE, admin); + } + + // ============ Reserve Management ============ + + function depositReserve( + address asset, + uint256 amount + ) external override onlyRole(RESERVE_MANAGER_ROLE) nonReentrant returns (bytes32 reserveId) { + require(asset != address(0), "ReserveSystem: zero address"); + require(amount > 0, "ReserveSystem: zero amount"); + require(isSupportedAsset[asset], "ReserveSystem: unsupported asset"); + + IERC20(asset).safeTransferFrom(msg.sender, address(this), amount); + + reserveId = keccak256(abi.encodePacked(asset, amount, block.timestamp, reserveIds.length)); + reserves[reserveId] = Reserve({ + asset: asset, + balance: amount, + lastUpdated: block.timestamp + }); + reserveIds.push(reserveId); + reserveBalances[asset] += amount; + + emit ReserveDeposited(asset, amount, msg.sender, reserveId); + } + + function withdrawReserve( + address asset, + uint256 amount, + address recipient + ) external override onlyRole(RESERVE_MANAGER_ROLE) nonReentrant returns (bytes32 reserveId) { + require(asset != address(0), "ReserveSystem: zero address"); + require(recipient != address(0), "ReserveSystem: zero recipient"); + require(amount > 0, "ReserveSystem: zero amount"); + require(reserveBalances[asset] >= amount, "ReserveSystem: insufficient reserve"); + + reserveBalances[asset] -= amount; + + IERC20(asset).safeTransfer(recipient, amount); + + reserveId = keccak256(abi.encodePacked(asset, amount, block.timestamp, reserveIds.length)); + + emit ReserveWithdrawn(asset, amount, recipient, reserveId); + } + + function getReserveBalance(address asset) external view override returns (uint256) { + return reserveBalances[asset]; + } + + function getReserveById(bytes32 reserveId) external view override returns (address asset, uint256 balance) { + Reserve memory reserve = reserves[reserveId]; + return (reserve.asset, reserve.balance); + } + + // ============ Conversion ============ + + function convertAssets( + address sourceAsset, + address targetAsset, + uint256 amount + ) external override onlyRole(CONVERSION_OPERATOR_ROLE) nonReentrant returns ( + bytes32 conversionId, + uint256 targetAmount, + uint256 fees + ) { + require(sourceAsset != address(0), "ReserveSystem: zero source asset"); + require(targetAsset != address(0), "ReserveSystem: zero target asset"); + require(amount > 0, "ReserveSystem: zero amount"); + require(isSupportedAsset[sourceAsset], "ReserveSystem: unsupported source asset"); + require(isSupportedAsset[targetAsset], "ReserveSystem: unsupported target asset"); + + // Calculate conversion + (uint256 calculatedAmount, uint256 calculatedFees, address[] memory path) = + calculateConversion(sourceAsset, targetAsset, amount); + + require(reserveBalances[targetAsset] >= calculatedAmount, "ReserveSystem: insufficient target reserve"); + + // Transfer source asset + IERC20(sourceAsset).safeTransferFrom(msg.sender, address(this), amount); + reserveBalances[sourceAsset] += amount; + + // Transfer target asset + reserveBalances[targetAsset] -= calculatedAmount; + IERC20(targetAsset).safeTransfer(msg.sender, calculatedAmount); + + conversionId = keccak256(abi.encodePacked(sourceAsset, targetAsset, amount, block.timestamp, conversionIds.length)); + conversions[conversionId] = Conversion({ + sourceAsset: sourceAsset, + targetAsset: targetAsset, + sourceAmount: amount, + targetAmount: calculatedAmount, + fees: calculatedFees, + path: path, + timestamp: block.timestamp + }); + conversionIds.push(conversionId); + + emit ConversionExecuted(sourceAsset, targetAsset, amount, calculatedAmount, conversionId, calculatedFees); + + return (conversionId, calculatedAmount, calculatedFees); + } + + function calculateConversion( + address sourceAsset, + address targetAsset, + uint256 amount + ) public view override returns ( + uint256 targetAmount, + uint256 fees, + address[] memory path + ) { + require(sourceAsset != address(0), "ReserveSystem: zero source asset"); + require(targetAsset != address(0), "ReserveSystem: zero target asset"); + require(amount > 0, "ReserveSystem: zero amount"); + + // Get prices + (uint256 sourcePrice, uint256 sourceTimestamp) = getPrice(sourceAsset); + (uint256 targetPrice, uint256 targetTimestamp) = getPrice(targetAsset); + + require(sourceTimestamp > 0 && targetTimestamp > 0, "ReserveSystem: price feed not available"); + require(block.timestamp - sourceTimestamp <= PRICE_STALENESS_THRESHOLD, "ReserveSystem: stale source price"); + require(block.timestamp - targetTimestamp <= PRICE_STALENESS_THRESHOLD, "ReserveSystem: stale target price"); + + // Direct conversion + targetAmount = (amount * targetPrice) / sourcePrice; + + // Calculate fees + fees = calculateFees(targetAmount, 0); // No slippage for direct conversion + + // Simple path (direct conversion) + path = new address[](2); + path[0] = sourceAsset; + path[1] = targetAsset; + + return (targetAmount, fees, path); + } + + function calculateFees(uint256 amount, uint256 slippageBps) internal pure returns (uint256) { + uint256 baseFee = (amount * BASE_FEE_BPS) / 10000; + uint256 slippageFee = 0; + + if (slippageBps > 10) { // 0.1% threshold + slippageFee = (amount * slippageBps * SLIPPAGE_FEE_BPS) / 1000000; + } + + uint256 largeTransactionFee = 0; + if (amount >= LARGE_TRANSACTION_THRESHOLD) { + largeTransactionFee = (amount * LARGE_TRANSACTION_FEE_BPS) / 10000; + } + + return baseFee + slippageFee + largeTransactionFee; + } + + // ============ Redemption ============ + + function redeem( + address asset, + uint256 amount, + address recipient + ) external override onlyRole(RESERVE_MANAGER_ROLE) nonReentrant returns (bytes32 redemptionId) { + require(asset != address(0), "ReserveSystem: zero address"); + require(recipient != address(0), "ReserveSystem: zero recipient"); + require(amount > 0, "ReserveSystem: zero amount"); + require(reserveBalances[asset] >= amount, "ReserveSystem: insufficient reserve"); + + reserveBalances[asset] -= amount; + IERC20(asset).safeTransfer(recipient, amount); + + redemptionId = keccak256(abi.encodePacked(asset, amount, block.timestamp, conversionIds.length)); + + emit RedemptionExecuted(asset, amount, recipient, redemptionId); + } + + // ============ Price Feeds ============ + + function updatePriceFeed( + address asset, + uint256 price, + uint256 timestamp + ) external override onlyRole(PRICE_FEED_ROLE) { + require(asset != address(0), "ReserveSystem: zero address"); + require(price > 0, "ReserveSystem: zero price"); + require(timestamp <= block.timestamp, "ReserveSystem: future timestamp"); + + if (!isSupportedAsset[asset]) { + isSupportedAsset[asset] = true; + supportedAssets.push(asset); + } + + priceFeeds[asset] = PriceFeed({ + price: price, + timestamp: timestamp, + isValid: true + }); + + emit PriceFeedUpdated(asset, price, timestamp); + } + + function getPrice(address asset) public view override returns (uint256 price, uint256 timestamp) { + PriceFeed memory feed = priceFeeds[asset]; + require(feed.isValid, "ReserveSystem: price feed not available"); + return (feed.price, feed.timestamp); + } + + function getConversionPrice( + address sourceAsset, + address targetAsset + ) external view override returns (uint256) { + (uint256 sourcePrice,) = getPrice(sourceAsset); + (uint256 targetPrice,) = getPrice(targetAsset); + return (targetPrice * 1e18) / sourcePrice; // Price in 18 decimals + } + + // ============ Admin Functions ============ + + function addSupportedAsset(address asset, bool isLiquid) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(asset != address(0), "ReserveSystem: zero address"); + isSupportedAsset[asset] = true; + isLiquidAsset[asset] = isLiquid; + if (!_isInArray(asset, supportedAssets)) { + supportedAssets.push(asset); + } + } + + function removeSupportedAsset(address asset) external onlyRole(DEFAULT_ADMIN_ROLE) { + isSupportedAsset[asset] = false; + } + + function _isInArray(address item, address[] memory array) internal pure returns (bool) { + for (uint256 i = 0; i < array.length; i++) { + if (array[i] == item) { + return true; + } + } + return false; + } + + function getSupportedAssets() external view returns (address[] memory) { + return supportedAssets; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/ReserveTokenIntegration.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/ReserveTokenIntegration.sol new file mode 100644 index 0000000..07a85a1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/ReserveTokenIntegration.sol @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../emoney/interfaces/IeMoneyToken.sol"; +import "../emoney/interfaces/ITokenFactory138.sol"; +import "./IReserveSystem.sol"; + +/** + * @title ReserveTokenIntegration + * @notice Integrates Reserve System with eMoney Token Factory + * @dev Enables eMoney tokens to be backed by reserves and converted via the reserve system + */ +contract ReserveTokenIntegration is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant INTEGRATION_OPERATOR_ROLE = keccak256("INTEGRATION_OPERATOR_ROLE"); + + IReserveSystem public reserveSystem; + ITokenFactory138 public tokenFactory; + + // Token to reserve asset mapping + mapping(address => address) public tokenReserveAsset; + // Reserve asset to token mapping + mapping(address => address) public reserveAssetToken; + + // Reserve backing ratio (basis points: 10000 = 100%) + mapping(address => uint256) public reserveBackingRatio; + + event TokenBackedByReserve( + address indexed token, + address indexed reserveAsset, + uint256 backingRatio + ); + + event ReserveBackingUpdated( + address indexed token, + address indexed reserveAsset, + uint256 newBackingRatio + ); + + event TokenConvertedViaReserve( + address indexed sourceToken, + address indexed targetToken, + uint256 sourceAmount, + uint256 targetAmount, + bytes32 conversionId + ); + + constructor( + address admin, + address reserveSystem_, + address tokenFactory_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(INTEGRATION_OPERATOR_ROLE, admin); + + reserveSystem = IReserveSystem(reserveSystem_); + tokenFactory = ITokenFactory138(tokenFactory_); + } + + /** + * @notice Set reserve asset backing for an eMoney token + * @param token Address of the eMoney token + * @param reserveAsset Address of the reserve asset + * @param backingRatio Backing ratio in basis points (10000 = 100%) + */ + function setTokenBacking( + address token, + address reserveAsset, + uint256 backingRatio + ) external onlyRole(INTEGRATION_OPERATOR_ROLE) { + require(token != address(0), "ReserveTokenIntegration: zero token"); + require(reserveAsset != address(0), "ReserveTokenIntegration: zero reserve asset"); + require(backingRatio <= 10000, "ReserveTokenIntegration: invalid backing ratio"); + + tokenReserveAsset[token] = reserveAsset; + reserveAssetToken[reserveAsset] = token; + reserveBackingRatio[token] = backingRatio; + + emit TokenBackedByReserve(token, reserveAsset, backingRatio); + } + + /** + * @notice Update reserve backing ratio for a token + * @param token Address of the eMoney token + * @param newBackingRatio New backing ratio in basis points + */ + function updateBackingRatio( + address token, + uint256 newBackingRatio + ) external onlyRole(INTEGRATION_OPERATOR_ROLE) { + require(token != address(0), "ReserveTokenIntegration: zero token"); + require(newBackingRatio <= 10000, "ReserveTokenIntegration: invalid backing ratio"); + require(tokenReserveAsset[token] != address(0), "ReserveTokenIntegration: token not backed"); + + address reserveAsset = tokenReserveAsset[token]; + reserveBackingRatio[token] = newBackingRatio; + + emit ReserveBackingUpdated(token, reserveAsset, newBackingRatio); + } + + /** + * @notice Convert eMoney tokens via reserve system + * @param sourceToken Address of the source eMoney token + * @param targetToken Address of the target eMoney token + * @param amount Amount of source tokens to convert + * @return targetAmount Amount of target tokens received + * @return conversionId Conversion ID from reserve system + */ + function convertTokensViaReserve( + address sourceToken, + address targetToken, + uint256 amount + ) external nonReentrant returns (uint256 targetAmount, bytes32 conversionId) { + require(sourceToken != address(0), "ReserveTokenIntegration: zero source token"); + require(targetToken != address(0), "ReserveTokenIntegration: zero target token"); + require(amount > 0, "ReserveTokenIntegration: zero amount"); + + address sourceReserveAsset = tokenReserveAsset[sourceToken]; + address targetReserveAsset = tokenReserveAsset[targetToken]; + + require(sourceReserveAsset != address(0), "ReserveTokenIntegration: source not backed"); + require(targetReserveAsset != address(0), "ReserveTokenIntegration: target not backed"); + + // Burn source tokens + IeMoneyToken(sourceToken).burn(msg.sender, amount, "0x00"); + + // Calculate reserve asset amount based on backing ratio + uint256 sourceReserveAmount = (amount * reserveBackingRatio[sourceToken]) / 10000; + + // Convert via reserve system + uint256 targetReserveAmount; + uint256 fees; + (conversionId, targetReserveAmount, fees) = reserveSystem.convertAssets( + sourceReserveAsset, + targetReserveAsset, + sourceReserveAmount + ); + + // Calculate target token amount based on backing ratio + targetAmount = (targetReserveAmount * 10000) / reserveBackingRatio[targetToken]; + + // Mint target tokens + IeMoneyToken(targetToken).mint(msg.sender, targetAmount, bytes32(0)); + + emit TokenConvertedViaReserve(sourceToken, targetToken, amount, targetAmount, conversionId); + + return (targetAmount, conversionId); + } + + /** + * @notice Get reserve backing information for a token + * @param token Address of the eMoney token + * @return reserveAsset Address of the reserve asset + * @return backingRatio Backing ratio in basis points + * @return reserveBalance Current reserve balance + */ + function getTokenBacking(address token) external view returns ( + address reserveAsset, + uint256 backingRatio, + uint256 reserveBalance + ) { + reserveAsset = tokenReserveAsset[token]; + backingRatio = reserveBackingRatio[token]; + if (reserveAsset != address(0)) { + reserveBalance = reserveSystem.getReserveBalance(reserveAsset); + } + } + + /** + * @notice Check if token has adequate reserve backing + * @param token Address of the eMoney token + * @return isAdequate True if reserves are adequate + * @return requiredReserve Required reserve amount + * @return currentReserve Current reserve amount + */ + function checkReserveAdequacy(address token) external view returns ( + bool isAdequate, + uint256 requiredReserve, + uint256 currentReserve + ) { + address reserveAsset = tokenReserveAsset[token]; + require(reserveAsset != address(0), "ReserveTokenIntegration: token not backed"); + + uint256 totalSupply = IERC20(token).totalSupply(); + uint256 backingRatio = reserveBackingRatio[token]; + + requiredReserve = (totalSupply * backingRatio) / 10000; + currentReserve = reserveSystem.getReserveBalance(reserveAsset); + + isAdequate = currentReserve >= requiredReserve; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/StablecoinReserveVault.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/StablecoinReserveVault.sol new file mode 100644 index 0000000..5cc3f1e --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/reserve/StablecoinReserveVault.sol @@ -0,0 +1,253 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../tokens/CompliantUSDT.sol"; +import "../tokens/CompliantUSDC.sol"; + +/** + * @title StablecoinReserveVault + * @notice 1:1 backing mechanism for CompliantUSDT and CompliantUSDC with official tokens + * @dev Locks official USDT/USDC, mints cUSDT/cUSDC 1:1. Can be deployed on Ethereum Mainnet + * or connected via cross-chain bridge to Chain 138 for minting. + * + * IMPORTANT: This contract should be deployed on Ethereum Mainnet where official USDT/USDC exist. + * For Chain 138 deployment, tokens would be bridged/locked via cross-chain infrastructure. + */ +contract StablecoinReserveVault is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant RESERVE_OPERATOR_ROLE = keccak256("RESERVE_OPERATOR_ROLE"); + bytes32 public constant REDEMPTION_OPERATOR_ROLE = keccak256("REDEMPTION_OPERATOR_ROLE"); + + // Official token addresses on Ethereum Mainnet + // These can be overridden in constructor for different networks + address public immutable officialUSDT; + address public immutable officialUSDC; + + // Compliant token contracts (on Chain 138 or same network) + CompliantUSDT public immutable compliantUSDT; + CompliantUSDC public immutable compliantUSDC; + + // Reserve tracking + uint256 public usdtReserveBalance; + uint256 public usdcReserveBalance; + + // Total minted (for verification) + uint256 public totalCUSDTMinted; + uint256 public totalCUSDCMinted; + + // Pause mechanism + bool public paused; + + event ReserveDeposited(address indexed token, uint256 amount, address indexed depositor); + event ReserveWithdrawn(address indexed token, uint256 amount, address indexed recipient); + event CompliantTokensMinted(address indexed token, uint256 amount, address indexed recipient); + event CompliantTokensBurned(address indexed token, uint256 amount, address indexed redeemer); + event Paused(address indexed account); + event Unpaused(address indexed account); + + modifier whenNotPaused() { + require(!paused, "StablecoinReserveVault: paused"); + _; + } + + /** + * @notice Constructor + * @param admin Admin address (will receive DEFAULT_ADMIN_ROLE) + * @param officialUSDT_ Official USDT token address (on Ethereum Mainnet: 0xdAC17F958D2ee523a2206206994597C13D831ec7) + * @param officialUSDC_ Official USDC token address (on Ethereum Mainnet: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48) + * @param compliantUSDT_ CompliantUSDT contract address + * @param compliantUSDC_ CompliantUSDC contract address + */ + constructor( + address admin, + address officialUSDT_, + address officialUSDC_, + address compliantUSDT_, + address compliantUSDC_ + ) { + require(admin != address(0), "StablecoinReserveVault: zero admin"); + require(officialUSDT_ != address(0), "StablecoinReserveVault: zero USDT"); + require(officialUSDC_ != address(0), "StablecoinReserveVault: zero USDC"); + require(compliantUSDT_ != address(0), "StablecoinReserveVault: zero cUSDT"); + require(compliantUSDC_ != address(0), "StablecoinReserveVault: zero cUSDC"); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(RESERVE_OPERATOR_ROLE, admin); + _grantRole(REDEMPTION_OPERATOR_ROLE, admin); + + officialUSDT = officialUSDT_; + officialUSDC = officialUSDC_; + compliantUSDT = CompliantUSDT(compliantUSDT_); + compliantUSDC = CompliantUSDC(compliantUSDC_); + } + + /** + * @notice Deposit official USDT and mint cUSDT 1:1 + * @dev Transfers USDT from caller, mints cUSDT to caller + * @param amount Amount of USDT to deposit (6 decimals) + */ + function depositUSDT(uint256 amount) external whenNotPaused nonReentrant { + require(amount > 0, "StablecoinReserveVault: zero amount"); + + // Transfer official USDT from caller + IERC20(officialUSDT).safeTransferFrom(msg.sender, address(this), amount); + + // Update reserve + usdtReserveBalance += amount; + totalCUSDTMinted += amount; + + // Mint cUSDT to caller + compliantUSDT.mint(msg.sender, amount); + + emit ReserveDeposited(officialUSDT, amount, msg.sender); + emit CompliantTokensMinted(address(compliantUSDT), amount, msg.sender); + } + + /** + * @notice Deposit official USDC and mint cUSDC 1:1 + * @dev Transfers USDC from caller, mints cUSDC to caller + * @param amount Amount of USDC to deposit (6 decimals) + */ + function depositUSDC(uint256 amount) external whenNotPaused nonReentrant { + require(amount > 0, "StablecoinReserveVault: zero amount"); + + // Transfer official USDC from caller + IERC20(officialUSDC).safeTransferFrom(msg.sender, address(this), amount); + + // Update reserve + usdcReserveBalance += amount; + totalCUSDCMinted += amount; + + // Mint cUSDC to caller + compliantUSDC.mint(msg.sender, amount); + + emit ReserveDeposited(officialUSDC, amount, msg.sender); + emit CompliantTokensMinted(address(compliantUSDC), amount, msg.sender); + } + + /** + * @notice Redeem cUSDT for official USDT 1:1 + * @dev Burns cUSDT from caller, transfers USDT to caller + * @param amount Amount of cUSDT to redeem (6 decimals) + */ + function redeemUSDT(uint256 amount) external whenNotPaused nonReentrant { + require(amount > 0, "StablecoinReserveVault: zero amount"); + require(usdtReserveBalance >= amount, "StablecoinReserveVault: insufficient reserve"); + + // Burn cUSDT from caller + compliantUSDT.burn(amount); + + // Update reserve + usdtReserveBalance -= amount; + totalCUSDTMinted -= amount; + + // Transfer official USDT to caller + IERC20(officialUSDT).safeTransfer(msg.sender, amount); + + emit CompliantTokensBurned(address(compliantUSDT), amount, msg.sender); + emit ReserveWithdrawn(officialUSDT, amount, msg.sender); + } + + /** + * @notice Redeem cUSDC for official USDC 1:1 + * @dev Burns cUSDC from caller, transfers USDC to caller + * @param amount Amount of cUSDC to redeem (6 decimals) + */ + function redeemUSDC(uint256 amount) external whenNotPaused nonReentrant { + require(amount > 0, "StablecoinReserveVault: zero amount"); + require(usdcReserveBalance >= amount, "StablecoinReserveVault: insufficient reserve"); + + // Burn cUSDC from caller + compliantUSDC.burn(amount); + + // Update reserve + usdcReserveBalance -= amount; + totalCUSDCMinted -= amount; + + // Transfer official USDC to caller + IERC20(officialUSDC).safeTransfer(msg.sender, amount); + + emit CompliantTokensBurned(address(compliantUSDC), amount, msg.sender); + emit ReserveWithdrawn(officialUSDC, amount, msg.sender); + } + + /** + * @notice Get reserve backing ratio + * @param token Address of compliant token (cUSDT or cUSDC) + * @return reserveBalance Current reserve balance + * @return tokenSupply Current token supply + * @return backingRatio Backing ratio (10000 = 100%) + */ + function getBackingRatio(address token) external view returns ( + uint256 reserveBalance, + uint256 tokenSupply, + uint256 backingRatio + ) { + if (token == address(compliantUSDT)) { + reserveBalance = usdtReserveBalance; + tokenSupply = compliantUSDT.totalSupply(); + } else if (token == address(compliantUSDC)) { + reserveBalance = usdcReserveBalance; + tokenSupply = compliantUSDC.totalSupply(); + } else { + revert("StablecoinReserveVault: unsupported token"); + } + + backingRatio = tokenSupply > 0 + ? (reserveBalance * 10000) / tokenSupply + : 0; + } + + /** + * @notice Check if reserves are adequate + * @return usdtAdequate True if USDT reserves are adequate + * @return usdcAdequate True if USDC reserves are adequate + */ + function checkReserveAdequacy() external view returns (bool usdtAdequate, bool usdcAdequate) { + uint256 cUSDTSupply = compliantUSDT.totalSupply(); + uint256 cUSDCSupply = compliantUSDC.totalSupply(); + + usdtAdequate = usdtReserveBalance >= cUSDTSupply; + usdcAdequate = usdcReserveBalance >= cUSDCSupply; + } + + /** + * @notice Pause all operations + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + paused = true; + emit Paused(msg.sender); + } + + /** + * @notice Unpause all operations + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + paused = false; + emit Unpaused(msg.sender); + } + + /** + * @notice Emergency withdrawal (admin only, after pause) + * @dev Can be used to recover funds in emergency situations + */ + function emergencyWithdraw(address token, uint256 amount, address recipient) + external + onlyRole(DEFAULT_ADMIN_ROLE) + whenPaused + { + require(recipient != address(0), "StablecoinReserveVault: zero recipient"); + IERC20(token).safeTransfer(recipient, amount); + } + + modifier whenPaused() { + require(paused, "StablecoinReserveVault: not paused"); + _; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/smart-accounts/AccountWalletRegistryExtended.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/smart-accounts/AccountWalletRegistryExtended.sol new file mode 100644 index 0000000..d989096 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/smart-accounts/AccountWalletRegistryExtended.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../emoney/interfaces/IAccountWalletRegistry.sol"; + +/** + * @title AccountWalletRegistryExtended + * @notice Extends account-wallet registry with Smart Account (contract) support + * @dev Links accountRefId to contract addresses (smart accounts); walletRefId = keccak256(abi.encodePacked(smartAccount)) + */ +contract AccountWalletRegistryExtended is IAccountWalletRegistry, AccessControl { + bytes32 public constant ACCOUNT_MANAGER_ROLE = keccak256("ACCOUNT_MANAGER_ROLE"); + + address public smartAccountFactory; + address public entryPoint; + + mapping(bytes32 => WalletLink[]) private _accountToWallets; + mapping(bytes32 => bytes32[]) private _walletToAccounts; + mapping(bytes32 => mapping(bytes32 => uint256)) private _walletIndex; + mapping(bytes32 => mapping(bytes32 => bool)) private _walletAccountExists; + mapping(bytes32 => address) private _smartAccountAddress; // walletRefId => smart account address + + event SmartAccountLinked(bytes32 indexed accountRefId, address indexed smartAccount, bytes32 provider); + + constructor(address admin, address smartAccountFactory_, address entryPoint_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ACCOUNT_MANAGER_ROLE, admin); + smartAccountFactory = smartAccountFactory_; + entryPoint = entryPoint_; + } + + function setSmartAccountFactory(address factory) external onlyRole(DEFAULT_ADMIN_ROLE) { + smartAccountFactory = factory; + } + + function setEntryPoint(address entryPoint_) external onlyRole(DEFAULT_ADMIN_ROLE) { + entryPoint = entryPoint_; + } + + function linkAccountToWallet(bytes32 accountRefId, bytes32 walletRefId, bytes32 provider) + external + override + onlyRole(ACCOUNT_MANAGER_ROLE) + { + require(accountRefId != bytes32(0), "zero accountRefId"); + require(walletRefId != bytes32(0), "zero walletRefId"); + require(provider != bytes32(0), "zero provider"); + + if (_walletAccountExists[walletRefId][accountRefId]) { + uint256 index = _walletIndex[accountRefId][walletRefId]; + require(index < _accountToWallets[accountRefId].length, "index out of bounds"); + WalletLink storage link = _accountToWallets[accountRefId][index]; + require(link.walletRefId == walletRefId, "link mismatch"); + link.active = true; + link.linkedAt = uint64(block.timestamp); + } else { + WalletLink memory newLink = WalletLink({ + walletRefId: walletRefId, + linkedAt: uint64(block.timestamp), + active: true, + provider: provider + }); + _accountToWallets[accountRefId].push(newLink); + _walletIndex[accountRefId][walletRefId] = _accountToWallets[accountRefId].length - 1; + _walletAccountExists[walletRefId][accountRefId] = true; + _walletToAccounts[walletRefId].push(accountRefId); + } + emit AccountWalletLinked(accountRefId, walletRefId, provider, uint64(block.timestamp)); + } + + function linkSmartAccount(bytes32 accountRefId, address smartAccount, bytes32 provider) + external + onlyRole(ACCOUNT_MANAGER_ROLE) + { + require(smartAccount != address(0), "AccountWalletRegistryExtended: zero smartAccount"); + require(_isContract(smartAccount), "AccountWalletRegistryExtended: not a contract"); + + bytes32 walletRefId = keccak256(abi.encodePacked(smartAccount)); + this.linkAccountToWallet(accountRefId, walletRefId, provider); + _smartAccountAddress[walletRefId] = smartAccount; + emit SmartAccountLinked(accountRefId, smartAccount, provider); + } + + function unlinkAccountFromWallet(bytes32 accountRefId, bytes32 walletRefId) external override onlyRole(ACCOUNT_MANAGER_ROLE) { + require(_walletAccountExists[walletRefId][accountRefId], "not linked"); + uint256 index = _walletIndex[accountRefId][walletRefId]; + require(index < _accountToWallets[accountRefId].length, "index out of bounds"); + _accountToWallets[accountRefId][index].active = false; + _walletAccountExists[walletRefId][accountRefId] = false; + emit AccountWalletUnlinked(accountRefId, walletRefId); + } + + function getWallets(bytes32 accountRefId) external view override returns (WalletLink[] memory) { + return _accountToWallets[accountRefId]; + } + + function getAccounts(bytes32 walletRefId) external view override returns (bytes32[] memory) { + return _walletToAccounts[walletRefId]; + } + + function isLinked(bytes32 accountRefId, bytes32 walletRefId) external view override returns (bool) { + return _walletAccountExists[walletRefId][accountRefId]; + } + + function isActive(bytes32 accountRefId, bytes32 walletRefId) external view override returns (bool) { + if (!_walletAccountExists[walletRefId][accountRefId]) return false; + uint256 index = _walletIndex[accountRefId][walletRefId]; + return index < _accountToWallets[accountRefId].length && _accountToWallets[accountRefId][index].active; + } + + function isSmartAccount(bytes32 walletRefId) public view returns (bool) { + return _smartAccountAddress[walletRefId] != address(0); + } + + function isSmartAccountAddress(address addr) public view returns (bool) { + return _smartAccountAddress[keccak256(abi.encodePacked(addr))] == addr; + } + + function _isContract(address account) internal view returns (bool) { + return account.code.length > 0; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/sync/TokenlistGovernanceSync.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/sync/TokenlistGovernanceSync.sol new file mode 100644 index 0000000..fe64611 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/sync/TokenlistGovernanceSync.sol @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../registry/UniversalAssetRegistry.sol"; + +/** + * @title TokenlistGovernanceSync + * @notice Automatically syncs tokenlist.json changes to on-chain governance + * @dev Monitors tokenlist versions and creates proposals for changes + */ +contract TokenlistGovernanceSync is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant TOKENLIST_MANAGER_ROLE = keccak256("TOKENLIST_MANAGER_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + struct TokenlistVersion { + uint256 major; + uint256 minor; + uint256 patch; + string ipfsHash; + uint256 timestamp; + bool synced; + } + + struct AssetMetadata { + address tokenAddress; + UniversalAssetRegistry.AssetType assetType; + UniversalAssetRegistry.ComplianceLevel complianceLevel; + string name; + string symbol; + uint8 decimals; + string jurisdiction; + uint8 volatilityScore; + uint256 minBridgeAmount; + uint256 maxBridgeAmount; + } + + struct TokenChange { + address tokenAddress; + ChangeType changeType; + AssetMetadata metadata; + } + + enum ChangeType { + Added, + Removed, + Modified + } + + // Storage + UniversalAssetRegistry public assetRegistry; + mapping(bytes32 => TokenlistVersion) public versions; + bytes32 public currentVersion; + bytes32[] public versionHistory; + + // Events + event TokenlistUpdated( + bytes32 indexed versionHash, + uint256 major, + uint256 minor, + uint256 patch, + string ipfsHash + ); + + event AutoProposalCreated( + bytes32 indexed proposalId, + address indexed token, + ChangeType changeType + ); + + event VersionSynced(bytes32 indexed versionHash); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + address _assetRegistry, + address admin + ) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + require(_assetRegistry != address(0), "Zero registry"); + + assetRegistry = UniversalAssetRegistry(_assetRegistry); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(TOKENLIST_MANAGER_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Submit new tokenlist version and auto-create proposals + */ + function submitTokenlistVersion( + uint256 major, + uint256 minor, + uint256 patch, + string calldata ipfsHash, + address[] calldata newTokens, + AssetMetadata[] calldata metadata + ) external onlyRole(TOKENLIST_MANAGER_ROLE) returns (bytes32[] memory proposalIds) { + require(newTokens.length == metadata.length, "Length mismatch"); + + bytes32 versionHash = keccak256(abi.encode(major, minor, patch)); + + // Store version + TokenlistVersion storage version = versions[versionHash]; + version.major = major; + version.minor = minor; + version.patch = patch; + version.ipfsHash = ipfsHash; + version.timestamp = block.timestamp; + version.synced = false; + + versionHistory.push(versionHash); + currentVersion = versionHash; + + emit TokenlistUpdated(versionHash, major, minor, patch, ipfsHash); + + // Auto-create proposals for new tokens + proposalIds = new bytes32[](newTokens.length); + + for (uint256 i = 0; i < newTokens.length; i++) { + proposalIds[i] = _createAssetProposal(newTokens[i], metadata[i]); + + emit AutoProposalCreated( + proposalIds[i], + newTokens[i], + ChangeType.Added + ); + } + + return proposalIds; + } + + /** + * @notice Create asset proposal in registry + */ + function _createAssetProposal( + address token, + AssetMetadata memory metadata + ) internal returns (bytes32) { + return assetRegistry.proposeAsset( + token, + metadata.assetType, + metadata.complianceLevel, + metadata.name, + metadata.symbol, + metadata.decimals, + metadata.jurisdiction, + metadata.volatilityScore, + metadata.minBridgeAmount, + metadata.maxBridgeAmount + ); + } + + /** + * @notice Detect changes between versions + */ + function detectChanges( + bytes32 oldVersionHash, + bytes32 newVersionHash, + address[] calldata oldTokens, + address[] calldata newTokens + ) external pure returns (TokenChange[] memory changes) { + // Simple diff: tokens in new but not old = added + // tokens in old but not new = removed + + uint256 maxChanges = oldTokens.length + newTokens.length; + TokenChange[] memory tempChanges = new TokenChange[](maxChanges); + uint256 changeCount = 0; + + // Find added tokens + for (uint256 i = 0; i < newTokens.length; i++) { + bool found = false; + for (uint256 j = 0; j < oldTokens.length; j++) { + if (newTokens[i] == oldTokens[j]) { + found = true; + break; + } + } + if (!found) { + tempChanges[changeCount].tokenAddress = newTokens[i]; + tempChanges[changeCount].changeType = ChangeType.Added; + changeCount++; + } + } + + // Find removed tokens + for (uint256 i = 0; i < oldTokens.length; i++) { + bool found = false; + for (uint256 j = 0; j < newTokens.length; j++) { + if (oldTokens[i] == newTokens[j]) { + found = true; + break; + } + } + if (!found) { + tempChanges[changeCount].tokenAddress = oldTokens[i]; + tempChanges[changeCount].changeType = ChangeType.Removed; + changeCount++; + } + } + + // Resize array to actual size + changes = new TokenChange[](changeCount); + for (uint256 i = 0; i < changeCount; i++) { + changes[i] = tempChanges[i]; + } + + return changes; + } + + /** + * @notice Mark version as synced + */ + function markVersionSynced(bytes32 versionHash) external onlyRole(TOKENLIST_MANAGER_ROLE) { + require(versions[versionHash].timestamp > 0, "Version not found"); + + versions[versionHash].synced = true; + + emit VersionSynced(versionHash); + } + + /** + * @notice Batch create proposals for multiple tokens + */ + function batchCreateProposals( + address[] calldata tokens, + AssetMetadata[] calldata metadata + ) external onlyRole(TOKENLIST_MANAGER_ROLE) returns (bytes32[] memory proposalIds) { + require(tokens.length == metadata.length, "Length mismatch"); + + proposalIds = new bytes32[](tokens.length); + + for (uint256 i = 0; i < tokens.length; i++) { + proposalIds[i] = _createAssetProposal(tokens[i], metadata[i]); + + emit AutoProposalCreated( + proposalIds[i], + tokens[i], + ChangeType.Added + ); + } + + return proposalIds; + } + + // View functions + + function getVersion(bytes32 versionHash) external view returns (TokenlistVersion memory) { + return versions[versionHash]; + } + + function getCurrentVersion() external view returns (TokenlistVersion memory) { + return versions[currentVersion]; + } + + function getVersionHistory() external view returns (bytes32[] memory) { + return versionHistory; + } + + function isVersionSynced(bytes32 versionHash) external view returns (bool) { + return versions[versionHash].synced; + } + + function getVersionCount() external view returns (uint256) { + return versionHistory.length; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/tether/MainnetTether.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/tether/MainnetTether.sol new file mode 100644 index 0000000..42caa9e --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/tether/MainnetTether.sol @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title MainnetTether + * @notice Anchors Chain-138 state proofs to Ethereum Mainnet (Kaleido-style) + * @dev Stores signed state proofs from Chain-138 validators, creating an immutable + * and verifiable record of Chain-138's state on Mainnet + */ +contract MainnetTether { + address public admin; + bool public paused; + + // Chain-138 chain ID + uint64 public constant CHAIN_138 = 138; + + // State proof structure + struct StateProof { + uint256 blockNumber; // Chain-138 block number + bytes32 blockHash; // Chain-138 block hash + bytes32 stateRoot; // Chain-138 state root + bytes32 previousBlockHash; // Previous block hash + uint256 timestamp; // Block timestamp + bytes signatures; // Collective signatures from validators + uint256 validatorCount; // Number of validators that signed + bytes32 proofHash; // Hash of the proof (for indexing) + } + + // Mapping: blockNumber => StateProof + mapping(uint256 => StateProof) public stateProofs; + + // Array of all anchored block numbers (for iteration) + uint256[] public anchoredBlocks; + + // Mapping: proofHash => bool (replay protection) + mapping(bytes32 => bool) public processed; + + // Events + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + event StateProofAnchored( + uint256 indexed blockNumber, + bytes32 indexed blockHash, + bytes32 indexed stateRoot, + uint256 timestamp, + uint256 validatorCount + ); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin) { + require(_admin != address(0), "zero admin"); + admin = _admin; + } + + /** + * @notice Anchor a state proof from Chain-138 + * @param blockNumber Chain-138 block number + * @param blockHash Chain-138 block hash + * @param stateRoot Chain-138 state root + * @param previousBlockHash Previous block hash + * @param timestamp Block timestamp + * @param signatures Collective signatures from validators + * @param validatorCount Number of validators that signed + */ + function anchorStateProof( + uint256 blockNumber, + bytes32 blockHash, + bytes32 stateRoot, + bytes32 previousBlockHash, + uint256 timestamp, + bytes calldata signatures, + uint256 validatorCount + ) external onlyAdmin whenNotPaused { + require(blockNumber > 0, "invalid block"); + require(blockHash != bytes32(0), "invalid hash"); + require(stateRoot != bytes32(0), "invalid state root"); + require(validatorCount > 0, "no validators"); + require(signatures.length > 0, "no signatures"); + + // Calculate proof hash for replay protection + bytes32 proofHash = keccak256( + abi.encodePacked( + blockNumber, + blockHash, + stateRoot, + previousBlockHash, + timestamp, + signatures + ) + ); + + require(!processed[proofHash], "already processed"); + require(stateProofs[blockNumber].blockNumber == 0, "block already anchored"); + + // Store state proof + stateProofs[blockNumber] = StateProof({ + blockNumber: blockNumber, + blockHash: blockHash, + stateRoot: stateRoot, + previousBlockHash: previousBlockHash, + timestamp: timestamp, + signatures: signatures, + validatorCount: validatorCount, + proofHash: proofHash + }); + + anchoredBlocks.push(blockNumber); + processed[proofHash] = true; + + emit StateProofAnchored( + blockNumber, + blockHash, + stateRoot, + timestamp, + validatorCount + ); + } + + /** + * @notice Get state proof for a specific block + * @param blockNumber Chain-138 block number + * @return proof State proof structure + */ + function getStateProof(uint256 blockNumber) external view returns (StateProof memory proof) { + require(stateProofs[blockNumber].blockNumber != 0, "not anchored"); + return stateProofs[blockNumber]; + } + + /** + * @notice Check if a block is anchored + * @param blockNumber Chain-138 block number + * @return true if anchored + */ + function isAnchored(uint256 blockNumber) external view returns (bool) { + return stateProofs[blockNumber].blockNumber != 0; + } + + /** + * @notice Get total number of anchored blocks + * @return count Number of anchored blocks + */ + function getAnchoredBlockCount() external view returns (uint256) { + return anchoredBlocks.length; + } + + /** + * @notice Get anchored block number at index + * @param index Index in anchoredBlocks array + * @return blockNumber Block number + */ + function getAnchoredBlock(uint256 index) external view returns (uint256) { + require(index < anchoredBlocks.length, "out of bounds"); + return anchoredBlocks[index]; + } + + /** + * @notice Admin functions + */ + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/tokenization/TokenRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/tokenization/TokenRegistry.sol new file mode 100644 index 0000000..f6b901d --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/tokenization/TokenRegistry.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "../bridge/interop/BridgeRegistry.sol"; + +/** + * @title TokenRegistry + * @notice Registry for all tokenized assets with metadata + */ +contract TokenRegistry is AccessControl, Pausable { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + + struct TokenMetadata { + address tokenAddress; + string tokenId; // Fabric token ID + string underlyingAsset; // EUR, USD, etc. + address issuer; + string backingReserve; // Reserve ID or address + uint256 totalSupply; + uint256 backedAmount; // Amount backed by reserves + TokenStatus status; + uint256 createdAt; + uint256 updatedAt; + } + + enum TokenStatus { + PENDING, + ACTIVE, + SUSPENDED, + REDEEMED + } + + mapping(address => TokenMetadata) public tokens; + mapping(string => address) public tokenIdToAddress; // Fabric tokenId -> Besu address + address[] public registeredTokens; + + event TokenRegistered( + address indexed tokenAddress, + string indexed tokenId, + string underlyingAsset, + address indexed issuer + ); + + event TokenUpdated( + address indexed tokenAddress, + TokenStatus oldStatus, + TokenStatus newStatus + ); + + event TokenSuspended(address indexed tokenAddress, string reason); + event TokenActivated(address indexed tokenAddress); + + error TokenNotFound(); + error TokenAlreadyRegistered(); + error InvalidStatus(); + error InvalidBacking(); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a tokenized asset + * @param tokenAddress ERC-20 token address + * @param tokenId Fabric token ID + * @param underlyingAsset Underlying asset type (EUR, USD, etc.) + * @param issuer Issuer address + * @param backingReserve Reserve identifier + */ + function registerToken( + address tokenAddress, + string calldata tokenId, + string calldata underlyingAsset, + address issuer, + string calldata backingReserve + ) external onlyRole(REGISTRAR_ROLE) { + if (tokens[tokenAddress].tokenAddress != address(0)) { + revert TokenAlreadyRegistered(); + } + + tokens[tokenAddress] = TokenMetadata({ + tokenAddress: tokenAddress, + tokenId: tokenId, + underlyingAsset: underlyingAsset, + issuer: issuer, + backingReserve: backingReserve, + totalSupply: 0, + backedAmount: 0, + status: TokenStatus.PENDING, + createdAt: block.timestamp, + updatedAt: block.timestamp + }); + + tokenIdToAddress[tokenId] = tokenAddress; + registeredTokens.push(tokenAddress); + + emit TokenRegistered(tokenAddress, tokenId, underlyingAsset, issuer); + } + + /** + * @notice Update token status + * @param tokenAddress Token address + * @param newStatus New status + */ + function updateTokenStatus( + address tokenAddress, + TokenStatus newStatus + ) external onlyRole(REGISTRAR_ROLE) { + TokenMetadata storage token = tokens[tokenAddress]; + if (token.tokenAddress == address(0)) revert TokenNotFound(); + + TokenStatus oldStatus = token.status; + token.status = newStatus; + token.updatedAt = block.timestamp; + + emit TokenUpdated(tokenAddress, oldStatus, newStatus); + } + + /** + * @notice Update token supply and backing + * @param tokenAddress Token address + * @param totalSupply Current total supply + * @param backedAmount Amount backed by reserves + */ + function updateTokenBacking( + address tokenAddress, + uint256 totalSupply, + uint256 backedAmount + ) external onlyRole(REGISTRAR_ROLE) { + TokenMetadata storage token = tokens[tokenAddress]; + if (token.tokenAddress == address(0)) revert TokenNotFound(); + + // Verify 1:1 backing + if (totalSupply > backedAmount) { + revert InvalidBacking(); + } + + token.totalSupply = totalSupply; + token.backedAmount = backedAmount; + token.updatedAt = block.timestamp; + } + + /** + * @notice Suspend a token + * @param tokenAddress Token address + * @param reason Reason for suspension + */ + function suspendToken( + address tokenAddress, + string calldata reason + ) external onlyRole(REGISTRAR_ROLE) { + TokenMetadata storage token = tokens[tokenAddress]; + if (token.tokenAddress == address(0)) revert TokenNotFound(); + + token.status = TokenStatus.SUSPENDED; + token.updatedAt = block.timestamp; + + emit TokenSuspended(tokenAddress, reason); + } + + /** + * @notice Activate a suspended token + * @param tokenAddress Token address + */ + function activateToken(address tokenAddress) external onlyRole(REGISTRAR_ROLE) { + TokenMetadata storage token = tokens[tokenAddress]; + if (token.tokenAddress == address(0)) revert TokenNotFound(); + + token.status = TokenStatus.ACTIVE; + token.updatedAt = block.timestamp; + + emit TokenActivated(tokenAddress); + } + + /** + * @notice Get token metadata + * @param tokenAddress Token address + * @return Token metadata + */ + function getToken(address tokenAddress) external view returns (TokenMetadata memory) { + return tokens[tokenAddress]; + } + + /** + * @notice Get token address by Fabric token ID + * @param tokenId Fabric token ID + * @return Token address + */ + function getTokenByFabricId(string calldata tokenId) external view returns (address) { + return tokenIdToAddress[tokenId]; + } + + /** + * @notice Get all registered tokens + * @return Array of token addresses + */ + function getAllTokens() external view returns (address[] memory) { + return registeredTokens; + } + + /** + * @notice Check if token is active + * @param tokenAddress Token address + * @return True if active + */ + function isTokenActive(address tokenAddress) external view returns (bool) { + TokenMetadata memory token = tokens[tokenAddress]; + return token.status == TokenStatus.ACTIVE; + } + + /** + * @notice Pause registry + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /** + * @notice Unpause registry + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/tokenization/TokenizedEUR.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/tokenization/TokenizedEUR.sol new file mode 100644 index 0000000..e4e3e76 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/tokenization/TokenizedEUR.sol @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "../bridge/interop/BridgeEscrowVault.sol"; + +/** + * @title TokenizedEUR + * @notice ERC-20 tokenized EUR backed 1:1 by reserves on Fabric + * @dev Mintable/burnable by Fabric attestation via authorized minter + */ +contract TokenizedEUR is ERC20, ERC20Burnable, AccessControl, Pausable { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + bytes32 public constant ATTESTOR_ROLE = keccak256("ATTESTOR_ROLE"); + + uint8 private constant DECIMALS = 18; + + struct FabricAttestation { + bytes32 fabricTxHash; + string tokenId; + uint256 amount; + address minter; + uint256 timestamp; + bytes signature; + } + + mapping(bytes32 => bool) public processedFabricTxs; + mapping(string => uint256) public fabricTokenBalances; // Fabric tokenId -> Besu balance + + event TokenizedEURMinted( + address indexed to, + uint256 amount, + string indexed fabricTokenId, + bytes32 fabricTxHash + ); + + event TokenizedEURBurned( + address indexed from, + uint256 amount, + string indexed fabricTokenId, + bytes32 fabricTxHash + ); + + event FabricAttestationReceived( + bytes32 indexed fabricTxHash, + string tokenId, + uint256 amount + ); + + error ZeroAmount(); + error ZeroAddress(); + error InvalidFabricAttestation(); + error FabricTxAlreadyProcessed(); + error InsufficientFabricBalance(); + + constructor(address admin) ERC20("Tokenized EUR", "EUR-T") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MINTER_ROLE, admin); + _grantRole(BURNER_ROLE, admin); + _grantRole(ATTESTOR_ROLE, admin); + } + + /** + * @notice Mint tokenized EUR based on Fabric attestation + * @param to Recipient address + * @param amount Amount to mint + * @param fabricTokenId Fabric token ID + * @param fabricTxHash Fabric transaction hash + * @param attestation Attestation from Fabric + */ + function mintFromFabric( + address to, + uint256 amount, + string memory fabricTokenId, + bytes32 fabricTxHash, + FabricAttestation calldata attestation + ) external onlyRole(MINTER_ROLE) whenNotPaused { + if (to == address(0)) revert ZeroAddress(); + if (amount == 0) revert ZeroAmount(); + if (processedFabricTxs[fabricTxHash]) revert FabricTxAlreadyProcessed(); + + // Verify attestation (in production, verify signature) + if (attestation.fabricTxHash != fabricTxHash) { + revert InvalidFabricAttestation(); + } + if (attestation.amount != amount) { + revert InvalidFabricAttestation(); + } + + // Mark Fabric tx as processed + processedFabricTxs[fabricTxHash] = true; + + // Update Fabric token balance mapping + fabricTokenBalances[fabricTokenId] += amount; + + // Mint tokens + _mint(to, amount); + + emit TokenizedEURMinted(to, amount, fabricTokenId, fabricTxHash); + emit FabricAttestationReceived(fabricTxHash, fabricTokenId, amount); + } + + /** + * @notice Burn tokenized EUR to redeem on Fabric + * @param from Address to burn from + * @param amount Amount to burn + * @param fabricTokenId Fabric token ID + * @param fabricTxHash Fabric redemption transaction hash + */ + function burnForFabric( + address from, + uint256 amount, + string memory fabricTokenId, + bytes32 fabricTxHash + ) external onlyRole(BURNER_ROLE) whenNotPaused { + if (from == address(0)) revert ZeroAddress(); + if (amount == 0) revert ZeroAmount(); + if (processedFabricTxs[fabricTxHash]) revert FabricTxAlreadyProcessed(); + + // Check Fabric token balance + if (fabricTokenBalances[fabricTokenId] < amount) { + revert InsufficientFabricBalance(); + } + + // Mark Fabric tx as processed + processedFabricTxs[fabricTxHash] = true; + + // Update Fabric token balance mapping + fabricTokenBalances[fabricTokenId] -= amount; + + // Burn tokens + _burn(from, amount); + + emit TokenizedEURBurned(from, amount, fabricTokenId, fabricTxHash); + } + + /** + * @notice Get Fabric token balance on Besu + * @param fabricTokenId Fabric token ID + * @return Balance on Besu + */ + function getFabricTokenBalance(string memory fabricTokenId) external view returns (uint256) { + return fabricTokenBalances[fabricTokenId]; + } + + /** + * @notice Check if Fabric tx has been processed + * @param fabricTxHash Fabric transaction hash + * @return True if processed + */ + function isFabricTxProcessed(bytes32 fabricTxHash) external view returns (bool) { + return processedFabricTxs[fabricTxHash]; + } + + /** + * @notice Override decimals to return 18 + */ + function decimals() public pure override returns (uint8) { + return DECIMALS; + } + + /** + * @notice Pause token transfers + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /** + * @notice Unpause token transfers + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/CompliantFiatToken.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/CompliantFiatToken.sol new file mode 100644 index 0000000..d3b228a --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/CompliantFiatToken.sol @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "../compliance/LegallyCompliantBase.sol"; + +/** + * @title CompliantFiatToken + * @notice Generic ISO-4217 compliant fiat/commodity token (ERC-20, DEX-ready) + * @dev Use for cEURC, cGBPC, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT, etc. + * Full ERC-20 for DEX liquidity pools; inherits LegallyCompliantBase. + */ +contract CompliantFiatToken is ERC20, Pausable, Ownable, LegallyCompliantBase { + uint8 private immutable _decimalsStorage; + string private _currencyCode; + + /** + * @notice Constructor + * @param name_ Token name (e.g. "Euro Coin (Compliant)") + * @param symbol_ Token symbol (e.g. "cEURC") + * @param decimals_ Token decimals (e.g. 6) + * @param currencyCode_ ISO-4217 code (e.g. "EUR") + * @param initialOwner Owner address + * @param admin Compliance admin (DEFAULT_ADMIN_ROLE) + * @param initialSupply Initial supply to mint to deployer + */ + constructor( + string memory name_, + string memory symbol_, + uint8 decimals_, + string memory currencyCode_, + address initialOwner, + address admin, + uint256 initialSupply + ) + ERC20(name_, symbol_) + Ownable(initialOwner) + LegallyCompliantBase(admin) + { + _decimalsStorage = decimals_; + _currencyCode = currencyCode_; + if (initialSupply > 0) { + _mint(msg.sender, initialSupply); + } + } + + function decimals() public view override returns (uint8) { + return _decimalsStorage; + } + + function currencyCode() external view returns (string memory) { + return _currencyCode; + } + + /** + * @notice Internal transfer with compliance tracking + */ + function _update( + address from, + address to, + uint256 amount + ) internal override whenNotPaused { + super._update(from, to, amount); + if (from != address(0) && to != address(0)) { + bytes32 legalRefHash = _generateLegalReferenceHash( + from, + to, + amount, + abi.encodePacked(symbol(), " Transfer") + ); + emit ValueTransferDeclared(from, to, amount, legalRefHash); + } + } + + function pause() public onlyOwner { + _pause(); + } + + function unpause() public onlyOwner { + _unpause(); + } + + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } + + function burn(uint256 amount) public { + _burn(msg.sender, amount); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/CompliantUSDC.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/CompliantUSDC.sol new file mode 100644 index 0000000..ac581da --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/CompliantUSDC.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "../compliance/LegallyCompliantBase.sol"; + +/** + * @title CompliantUSDC + * @notice USD Coin (Compliant) - ERC20 token with full legal compliance + * @dev Inherits from LegallyCompliantBase for Travel Rules exemption and regulatory compliance exemption + */ +contract CompliantUSDC is ERC20, Pausable, Ownable, LegallyCompliantBase { + uint8 private constant DECIMALS = 6; + + /** + * @notice Constructor + * @param initialOwner Address that will own the contract + * @param admin Address that will receive DEFAULT_ADMIN_ROLE for compliance + */ + constructor( + address initialOwner, + address admin + ) + ERC20("USD Coin (Compliant)", "cUSDC") + Ownable(initialOwner) + LegallyCompliantBase(admin) + { + // Mint initial supply to deployer + _mint(msg.sender, 1000000 * 10**DECIMALS); + } + + /** + * @notice Returns the number of decimals + * @return Number of decimals (6 for USDC) + */ + function decimals() public pure override returns (uint8) { + return DECIMALS; + } + + /** + * @notice Internal transfer override with compliance tracking + * @param from Source address + * @param to Destination address + * @param amount Transfer amount + */ + function _update( + address from, + address to, + uint256 amount + ) internal override whenNotPaused { + // Perform the transfer + super._update(from, to, amount); + + // Emit compliant value transfer event + if (from != address(0) && to != address(0)) { + bytes32 legalRefHash = _generateLegalReferenceHash( + from, + to, + amount, + abi.encodePacked("cUSDC Transfer") + ); + emit ValueTransferDeclared(from, to, amount, legalRefHash); + } + } + + /** + * @notice Pause token transfers + * @dev Only owner can pause + */ + function pause() public onlyOwner { + _pause(); + } + + /** + * @notice Unpause token transfers + * @dev Only owner can unpause + */ + function unpause() public onlyOwner { + _unpause(); + } + + /** + * @notice Mint new tokens + * @param to Address to mint tokens to + * @param amount Amount of tokens to mint + * @dev Only owner can mint + */ + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } + + /** + * @notice Burn tokens from caller's balance + * @param amount Amount of tokens to burn + */ + function burn(uint256 amount) public { + _burn(msg.sender, amount); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/CompliantUSDT.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/CompliantUSDT.sol new file mode 100644 index 0000000..8d81304 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/CompliantUSDT.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "../compliance/LegallyCompliantBase.sol"; + +/** + * @title CompliantUSDT + * @notice Tether USD (Compliant) - ERC20 token with full legal compliance + * @dev Inherits from LegallyCompliantBase for Travel Rules exemption and regulatory compliance exemption + */ +contract CompliantUSDT is ERC20, Pausable, Ownable, LegallyCompliantBase { + uint8 private constant DECIMALS = 6; + + /** + * @notice Constructor + * @param initialOwner Address that will own the contract + * @param admin Address that will receive DEFAULT_ADMIN_ROLE for compliance + */ + constructor( + address initialOwner, + address admin + ) + ERC20("Tether USD (Compliant)", "cUSDT") + Ownable(initialOwner) + LegallyCompliantBase(admin) + { + // Mint initial supply to deployer + _mint(msg.sender, 1000000 * 10**DECIMALS); + } + + /** + * @notice Returns the number of decimals + * @return Number of decimals (6 for USDT) + */ + function decimals() public pure override returns (uint8) { + return DECIMALS; + } + + /** + * @notice Internal transfer override with compliance tracking + * @param from Source address + * @param to Destination address + * @param amount Transfer amount + */ + function _update( + address from, + address to, + uint256 amount + ) internal override whenNotPaused { + // Perform the transfer + super._update(from, to, amount); + + // Emit compliant value transfer event + if (from != address(0) && to != address(0)) { + bytes32 legalRefHash = _generateLegalReferenceHash( + from, + to, + amount, + abi.encodePacked("cUSDT Transfer") + ); + emit ValueTransferDeclared(from, to, amount, legalRefHash); + } + } + + /** + * @notice Pause token transfers + * @dev Only owner can pause + */ + function pause() public onlyOwner { + _pause(); + } + + /** + * @notice Unpause token transfers + * @dev Only owner can unpause + */ + function unpause() public onlyOwner { + _unpause(); + } + + /** + * @notice Mint new tokens + * @param to Address to mint tokens to + * @param amount Amount of tokens to mint + * @dev Only owner can mint + */ + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } + + /** + * @notice Burn tokens from caller's balance + * @param amount Amount of tokens to burn + */ + function burn(uint256 amount) public { + _burn(msg.sender, amount); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/MockLinkToken.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/MockLinkToken.sol new file mode 100644 index 0000000..19d1430 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/MockLinkToken.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Mock LINK Token + * @notice Simple ERC20 token for testing and development + * @dev Minimal ERC20 implementation for CCIP fee payments + */ +contract MockLinkToken { + string public name = "Chainlink Token"; + string public symbol = "LINK"; + uint8 public decimals = 18; + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + uint256 public totalSupply; + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + + /** + * @notice Mint tokens to an address + * @param to Address to mint tokens to + * @param amount Amount of tokens to mint + */ + function mint(address to, uint256 amount) external { + balanceOf[to] += amount; + totalSupply += amount; + emit Transfer(address(0), to, amount); + } + + /** + * @notice Transfer tokens + * @param to Address to transfer to + * @param amount Amount of tokens to transfer + * @return success True if transfer was successful + */ + function transfer(address to, uint256 amount) external returns (bool success) { + require(balanceOf[msg.sender] >= amount, "MockLinkToken: insufficient balance"); + balanceOf[msg.sender] -= amount; + balanceOf[to] += amount; + emit Transfer(msg.sender, to, amount); + return true; + } + + /** + * @notice Transfer tokens from one address to another + * @param from Address to transfer from + * @param to Address to transfer to + * @param amount Amount of tokens to transfer + * @return success True if transfer was successful + */ + function transferFrom(address from, address to, uint256 amount) external returns (bool success) { + require(balanceOf[from] >= amount, "MockLinkToken: insufficient balance"); + require(allowance[from][msg.sender] >= amount, "MockLinkToken: insufficient allowance"); + balanceOf[from] -= amount; + balanceOf[to] += amount; + allowance[from][msg.sender] -= amount; + emit Transfer(from, to, amount); + return true; + } + + /** + * @notice Approve spender to spend tokens + * @param spender Address to approve + * @param amount Amount of tokens to approve + * @return success True if approval was successful + */ + function approve(address spender, uint256 amount) external returns (bool success) { + allowance[msg.sender][spender] = amount; + emit Approval(msg.sender, spender, amount); + return true; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/WETH.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/WETH.sol new file mode 100644 index 0000000..3cd2805 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/WETH.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Wrapped Ether (WETH9) + * @notice Standard implementation of WETH9 for ChainID 138 + * @dev Based on the canonical WETH9 implementation + */ +contract WETH { + string public name = "Wrapped Ether"; + string public symbol = "WETH"; + uint8 public decimals = 18; + + event Approval(address indexed src, address indexed guy, uint256 wad); + event Transfer(address indexed src, address indexed dst, uint256 wad); + event Deposit(address indexed dst, uint256 wad); + event Withdrawal(address indexed src, uint256 wad); + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + receive() external payable { + deposit(); + } + + function deposit() public payable { + balanceOf[msg.sender] += msg.value; + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint256 wad) public { + require(balanceOf[msg.sender] >= wad, "WETH: insufficient balance"); + balanceOf[msg.sender] -= wad; + payable(msg.sender).transfer(wad); + emit Withdrawal(msg.sender, wad); + } + + function totalSupply() public view returns (uint256) { + return address(this).balance; + } + + function approve(address guy, uint256 wad) public returns (bool) { + allowance[msg.sender][guy] = wad; + emit Approval(msg.sender, guy, wad); + return true; + } + + function transfer(address dst, uint256 wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom( + address src, + address dst, + uint256 wad + ) public returns (bool) { + require(balanceOf[src] >= wad, "WETH: insufficient balance"); + + if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) { + require(allowance[src][msg.sender] >= wad, "WETH: insufficient allowance"); + allowance[src][msg.sender] -= wad; + } + + balanceOf[src] -= wad; + balanceOf[dst] += wad; + + emit Transfer(src, dst, wad); + + return true; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/WETH10.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/WETH10.sol new file mode 100644 index 0000000..d582252 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/tokens/WETH10.sol @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title WETH10 + * @notice Enhanced WETH implementation with ERC-3156 flash loans and withdraw-on-transfer-to-zero + * @dev Based on WETH10 specification with additional quality-of-life features + */ +interface IERC3156FlashBorrower { + function onFlashLoan( + address initiator, + address token, + uint256 amount, + uint256 fee, + bytes calldata data + ) external returns (bytes32); +} + +interface IERC3156FlashLender { + function maxFlashLoan(address token) external view returns (uint256); + function flashFee(address token, uint256 amount) external view returns (uint256); + function flashLoan( + IERC3156FlashBorrower receiver, + address token, + uint256 amount, + bytes calldata data + ) external returns (bool); +} + +contract WETH10 { + string public constant name = "Wrapped Ether"; + string public constant symbol = "WETH"; + uint8 public constant decimals = 18; + + bytes32 public constant FLASH_LOAN_CALLBACK_SUCCESS = keccak256("ERC3156FlashBorrower.onFlashLoan"); + uint256 public constant FLASH_FEE = 0; // No fee for flash loans + + event Approval(address indexed src, address indexed guy, uint256 wad); + event Transfer(address indexed src, address indexed dst, uint256 wad); + event Deposit(address indexed dst, uint256 wad); + event Withdrawal(address indexed src, uint256 wad); + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + receive() external payable { + deposit(); + } + + function deposit() public payable { + balanceOf[msg.sender] += msg.value; + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint256 wad) public { + require(balanceOf[msg.sender] >= wad, "WETH10: insufficient balance"); + balanceOf[msg.sender] -= wad; + payable(msg.sender).transfer(wad); + emit Withdrawal(msg.sender, wad); + } + + function totalSupply() public view returns (uint256) { + return address(this).balance; + } + + function approve(address guy, uint256 wad) public returns (bool) { + allowance[msg.sender][guy] = wad; + emit Approval(msg.sender, guy, wad); + return true; + } + + function transfer(address dst, uint256 wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom( + address src, + address dst, + uint256 wad + ) public returns (bool) { + require(balanceOf[src] >= wad, "WETH10: insufficient balance"); + + if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) { + require(allowance[src][msg.sender] >= wad, "WETH10: insufficient allowance"); + allowance[src][msg.sender] -= wad; + } + + balanceOf[src] -= wad; + balanceOf[dst] += wad; + + emit Transfer(src, dst, wad); + + return true; + } + + // ERC-3156 Flash Loan Implementation + function maxFlashLoan(address token) external view returns (uint256) { + return token == address(this) ? address(this).balance : 0; + } + + function flashFee(address token, uint256 amount) external view returns (uint256) { + require(token == address(this), "WETH10: unsupported token"); + return FLASH_FEE; + } + + function flashLoan( + IERC3156FlashBorrower receiver, + address token, + uint256 amount, + bytes calldata data + ) external returns (bool) { + require(token == address(this), "WETH10: unsupported token"); + require(amount > 0, "WETH10: invalid amount"); + require(address(this).balance >= amount, "WETH10: insufficient liquidity"); + + // Calculate fee (FLASH_FEE is 0) + uint256 fee = FLASH_FEE; + uint256 repayAmount = amount + fee; + + // Transfer WETH to receiver (mint) + balanceOf[address(receiver)] += amount; + emit Transfer(address(0), address(receiver), amount); + + // Callback receiver + require( + receiver.onFlashLoan(msg.sender, token, amount, fee, data) == FLASH_LOAN_CALLBACK_SUCCESS, + "WETH10: flash loan callback failed" + ); + + // Verify repayment: receiver must have enough balance to repay (amount + fee) + require( + balanceOf[address(receiver)] >= repayAmount, + "WETH10: insufficient repayment" + ); + + // Repay flash loan (burn) + balanceOf[address(receiver)] -= repayAmount; + emit Transfer(address(receiver), address(0), repayAmount); + + return true; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/upgrades/ProxyFactory.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/upgrades/ProxyFactory.sol new file mode 100644 index 0000000..f68a467 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/upgrades/ProxyFactory.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; +import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title ProxyFactory + * @notice Factory for deploying upgradeable proxies (UUPS and Beacon patterns) + * @dev Tracks all deployed proxies for the universal bridge system + */ +contract ProxyFactory is AccessControl { + bytes32 public constant DEPLOYER_ROLE = keccak256("DEPLOYER_ROLE"); + + struct ProxyInfo { + address proxy; + address implementation; + ProxyType proxyType; + uint256 deployedAt; + address deployer; + bool isActive; + } + + enum ProxyType { + UUPS, + Beacon, + Transparent + } + + // Storage + mapping(address => ProxyInfo) public proxies; + address[] public allProxies; + mapping(address => address[]) public proxiesByImplementation; + mapping(address => UpgradeableBeacon) public beacons; + + event ProxyDeployed( + address indexed proxy, + address indexed implementation, + ProxyType proxyType, + address deployer + ); + + event BeaconCreated( + address indexed beacon, + address indexed implementation + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(DEPLOYER_ROLE, admin); + } + + /** + * @notice Deploy UUPS proxy + */ + function deployUUPSProxy( + address implementation, + bytes calldata initData + ) external onlyRole(DEPLOYER_ROLE) returns (address proxy) { + require(implementation != address(0), "Zero implementation"); + require(implementation.code.length > 0, "Not a contract"); + + // Deploy proxy + proxy = address(new ERC1967Proxy(implementation, initData)); + + // Track proxy + _trackProxy(proxy, implementation, ProxyType.UUPS); + + emit ProxyDeployed(proxy, implementation, ProxyType.UUPS, msg.sender); + + return proxy; + } + + /** + * @notice Deploy beacon proxy + */ + function deployBeaconProxy( + address beacon, + bytes calldata initData + ) external onlyRole(DEPLOYER_ROLE) returns (address proxy) { + require(beacon != address(0), "Zero beacon"); + + // Get implementation from beacon + address implementation = UpgradeableBeacon(beacon).implementation(); + + // Deploy beacon proxy + proxy = address(new BeaconProxy(beacon, initData)); + + // Track proxy + _trackProxy(proxy, implementation, ProxyType.Beacon); + + emit ProxyDeployed(proxy, implementation, ProxyType.Beacon, msg.sender); + + return proxy; + } + + /** + * @notice Create beacon for implementation + */ + function createBeacon(address implementation) external onlyRole(DEPLOYER_ROLE) returns (address beacon) { + require(implementation != address(0), "Zero implementation"); + require(implementation.code.length > 0, "Not a contract"); + + UpgradeableBeacon newBeacon = new UpgradeableBeacon(implementation, address(this)); + beacons[implementation] = newBeacon; + + emit BeaconCreated(address(newBeacon), implementation); + + return address(newBeacon); + } + + /** + * @notice Track deployed proxy + */ + function _trackProxy( + address proxy, + address implementation, + ProxyType proxyType + ) internal { + proxies[proxy] = ProxyInfo({ + proxy: proxy, + implementation: implementation, + proxyType: proxyType, + deployedAt: block.timestamp, + deployer: msg.sender, + isActive: true + }); + + allProxies.push(proxy); + proxiesByImplementation[implementation].push(proxy); + } + + // View functions + + function getProxyInfo(address proxy) external view returns (ProxyInfo memory) { + return proxies[proxy]; + } + + function getAllProxies() external view returns (address[] memory) { + return allProxies; + } + + function getProxiesByImplementation(address implementation) external view returns (address[] memory) { + return proxiesByImplementation[implementation]; + } + + function getProxyCount() external view returns (uint256) { + return allProxies.length; + } + + function isProxy(address addr) external view returns (bool) { + return proxies[addr].isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/utils/AddressMapper.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/AddressMapper.sol new file mode 100644 index 0000000..a449baf --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/AddressMapper.sol @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title AddressMapper + * @notice Maps reserved genesis.json addresses to actual deployed addresses + * @dev This contract provides a centralized mapping for addresses that were + * reserved in genesis.json but deployed to different addresses + */ +contract AddressMapper { + // Mapping from genesis address to deployed address + mapping(address => address) private _addressMap; + + // Reverse mapping for verification + mapping(address => address) private _reverseMap; + + // Owner for updates + address public owner; + + event AddressMapped(address indexed genesisAddress, address indexed deployedAddress); + event MappingRemoved(address indexed genesisAddress); + + modifier onlyOwner() { + require(msg.sender == owner, "AddressMapper: caller is not owner"); + _; + } + + constructor() { + owner = msg.sender; + + // Initialize with known mappings + // WETH9: Genesis -> Deployed + address weth9Genesis = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; + address weth9Deployed = 0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6; + _addressMap[weth9Genesis] = weth9Deployed; + _reverseMap[weth9Deployed] = weth9Genesis; + emit AddressMapped(weth9Genesis, weth9Deployed); + + // WETH10: Genesis -> Deployed + address weth10Genesis = 0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F; + address weth10Deployed = 0x105F8A15b819948a89153505762444Ee9f324684; + _addressMap[weth10Genesis] = weth10Deployed; + _reverseMap[weth10Deployed] = weth10Genesis; + emit AddressMapped(weth10Genesis, weth10Deployed); + } + + /** + * @notice Get the deployed address for a genesis address + * @param genesisAddress The address from genesis.json + * @return deployedAddress The actual deployed address, or address(0) if not mapped + */ + function getDeployedAddress(address genesisAddress) external view returns (address) { + address deployed = _addressMap[genesisAddress]; + // If not mapped, return the genesis address itself (no mapping needed) + return deployed == address(0) ? genesisAddress : deployed; + } + + /** + * @notice Get the genesis address for a deployed address + * @param deployedAddress The deployed address + * @return genesisAddress The genesis address, or address(0) if not mapped + */ + function getGenesisAddress(address deployedAddress) external view returns (address) { + return _reverseMap[deployedAddress]; + } + + /** + * @notice Check if an address is a genesis address that has been mapped + * @param addr Address to check + * @return isMapped True if the address has a mapping + */ + function isMapped(address addr) external view returns (bool) { + return _addressMap[addr] != address(0); + } + + /** + * @notice Add or update a mapping (owner only) + * @param genesisAddress The genesis address + * @param deployedAddress The deployed address + */ + function setMapping(address genesisAddress, address deployedAddress) external onlyOwner { + require(genesisAddress != address(0), "AddressMapper: genesis address cannot be zero"); + require(deployedAddress != address(0), "AddressMapper: deployed address cannot be zero"); + require(genesisAddress != deployedAddress, "AddressMapper: addresses must be different"); + + // Remove old reverse mapping if exists + address oldDeployed = _addressMap[genesisAddress]; + if (oldDeployed != address(0)) { + delete _reverseMap[oldDeployed]; + } + + // Remove old forward mapping if deployed address was mapped to something else + address oldGenesis = _reverseMap[deployedAddress]; + if (oldGenesis != address(0)) { + delete _addressMap[oldGenesis]; + } + + // Set new mappings + _addressMap[genesisAddress] = deployedAddress; + _reverseMap[deployedAddress] = genesisAddress; + + emit AddressMapped(genesisAddress, deployedAddress); + } + + /** + * @notice Remove a mapping (owner only) + * @param genesisAddress The genesis address to remove + */ + function removeMapping(address genesisAddress) external onlyOwner { + address deployed = _addressMap[genesisAddress]; + require(deployed != address(0), "AddressMapper: mapping does not exist"); + + delete _addressMap[genesisAddress]; + delete _reverseMap[deployed]; + + emit MappingRemoved(genesisAddress); + } + + /** + * @notice Transfer ownership (owner only) + * @param newOwner The new owner address + */ + function transferOwnership(address newOwner) external onlyOwner { + require(newOwner != address(0), "AddressMapper: new owner cannot be zero"); + owner = newOwner; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/utils/AddressMapperEmpty.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/AddressMapperEmpty.sol new file mode 100644 index 0000000..c04e8b5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/AddressMapperEmpty.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title AddressMapperEmpty + * @notice Same interface as AddressMapper but with no initial mappings (for chains other than 138). + * @dev Deploy on Cronos, BSC, etc. and add mappings via setMapping() if needed. + */ +contract AddressMapperEmpty { + mapping(address => address) private _addressMap; + mapping(address => address) private _reverseMap; + address public owner; + + event AddressMapped(address indexed genesisAddress, address indexed deployedAddress); + event MappingRemoved(address indexed genesisAddress); + + modifier onlyOwner() { + require(msg.sender == owner, "AddressMapper: caller is not owner"); + _; + } + + constructor() { + owner = msg.sender; + } + + function getDeployedAddress(address genesisAddress) external view returns (address) { + address deployed = _addressMap[genesisAddress]; + return deployed == address(0) ? genesisAddress : deployed; + } + + function getGenesisAddress(address deployedAddress) external view returns (address) { + return _reverseMap[deployedAddress]; + } + + function isMapped(address addr) external view returns (bool) { + return _addressMap[addr] != address(0); + } + + function setMapping(address genesisAddress, address deployedAddress) external onlyOwner { + require(genesisAddress != address(0), "AddressMapper: genesis address cannot be zero"); + require(deployedAddress != address(0), "AddressMapper: deployed address cannot be zero"); + require(genesisAddress != deployedAddress, "AddressMapper: addresses must be different"); + address oldDeployed = _addressMap[genesisAddress]; + if (oldDeployed != address(0)) delete _reverseMap[oldDeployed]; + address oldGenesis = _reverseMap[deployedAddress]; + if (oldGenesis != address(0)) delete _addressMap[oldGenesis]; + _addressMap[genesisAddress] = deployedAddress; + _reverseMap[deployedAddress] = genesisAddress; + emit AddressMapped(genesisAddress, deployedAddress); + } + + function removeMapping(address genesisAddress) external onlyOwner { + address deployed = _addressMap[genesisAddress]; + require(deployed != address(0), "AddressMapper: mapping does not exist"); + delete _addressMap[genesisAddress]; + delete _reverseMap[deployed]; + emit MappingRemoved(genesisAddress); + } + + function transferOwnership(address newOwner) external onlyOwner { + require(newOwner != address(0), "AddressMapper: new owner cannot be zero"); + owner = newOwner; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/utils/CREATE2Factory.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/CREATE2Factory.sol new file mode 100644 index 0000000..f0c50c2 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/CREATE2Factory.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title CREATE2 Factory + * @notice Factory for deploying contracts at deterministic addresses using CREATE2 + * @dev Based on the canonical CREATE2 factory pattern + */ +contract CREATE2Factory { + event Deployed(address addr, uint256 salt); + + /** + * @notice Deploy a contract using CREATE2 + * @param bytecode Contract bytecode + * @param salt Salt for deterministic address generation + * @return addr Deployed contract address + */ + function deploy(bytes memory bytecode, uint256 salt) public returns (address addr) { + assembly { + addr := create2(0, add(bytecode, 0x20), mload(bytecode), salt) + if iszero(extcodesize(addr)) { + revert(0, 0) + } + } + emit Deployed(addr, salt); + } + + /** + * @notice Compute the address that will be created with CREATE2 + * @param bytecode Contract bytecode + * @param salt Salt for deterministic address generation + * @return addr Predicted contract address + */ + function computeAddress(bytes memory bytecode, uint256 salt) public view returns (address addr) { + bytes32 hash = keccak256( + abi.encodePacked(bytes1(0xff), address(this), salt, keccak256(bytecode)) + ); + addr = address(uint160(uint256(hash))); + } + + /** + * @notice Compute the address that will be created with CREATE2 (with deployer) + * @param deployer Deployer address + * @param bytecode Contract bytecode + * @param salt Salt for deterministic address generation + * @return addr Predicted contract address + */ + function computeAddressWithDeployer( + address deployer, + bytes memory bytecode, + uint256 salt + ) public pure returns (address addr) { + bytes32 hash = keccak256( + abi.encodePacked(bytes1(0xff), deployer, salt, keccak256(bytecode)) + ); + addr = address(uint160(uint256(hash))); + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/utils/FeeCollector.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/FeeCollector.sol new file mode 100644 index 0000000..a5faef4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/FeeCollector.sol @@ -0,0 +1,243 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title FeeCollector + * @notice Collects and distributes protocol fees + * @dev Supports multiple tokens and multiple fee recipients + */ +contract FeeCollector is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant FEE_MANAGER_ROLE = keccak256("FEE_MANAGER_ROLE"); + + /** + * @notice Fee recipient information + */ + struct FeeRecipient { + address recipient; + uint256 shareBps; // Share in basis points (10000 = 100%) + bool isActive; + } + + mapping(address => FeeRecipient[]) private _feeRecipients; // token => recipients + mapping(address => uint256) private _totalCollected; // token => total collected + mapping(address => uint256) private _totalDistributed; // token => total distributed + + event FeesCollected( + address indexed token, + address indexed from, + uint256 amount, + uint256 timestamp + ); + + event FeesDistributed( + address indexed token, + address indexed recipient, + uint256 amount, + uint256 timestamp + ); + + event FeeRecipientAdded( + address indexed token, + address indexed recipient, + uint256 shareBps, + uint256 timestamp + ); + + event FeeRecipientRemoved( + address indexed token, + address indexed recipient, + uint256 timestamp + ); + + /** + * @notice Constructor + * @param admin Address that will receive DEFAULT_ADMIN_ROLE + */ + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(FEE_MANAGER_ROLE, admin); + } + + /** + * @notice Collect fees in a token + * @param token Token address (address(0) for native ETH) + * @param amount Amount to collect + * @dev Can be called by anyone, typically called by contracts that collect fees + */ + function collectFees(address token, uint256 amount) external payable nonReentrant { + if (token == address(0)) { + // Native ETH + require(msg.value == amount, "FeeCollector: ETH amount mismatch"); + } else { + // ERC20 token + require(msg.value == 0, "FeeCollector: no ETH expected"); + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + _totalCollected[token] += amount; + + emit FeesCollected(token, msg.sender, amount, block.timestamp); + } + + /** + * @notice Distribute collected fees to recipients + * @param token Token address (address(0) for native ETH) + * @dev Requires FEE_MANAGER_ROLE + */ + function distributeFees(address token) external onlyRole(FEE_MANAGER_ROLE) nonReentrant { + FeeRecipient[] memory recipients = _feeRecipients[token]; + require(recipients.length > 0, "FeeCollector: no recipients configured"); + + uint256 balance = token == address(0) + ? address(this).balance + : IERC20(token).balanceOf(address(this)); + + require(balance > 0, "FeeCollector: no fees to distribute"); + + uint256 totalDistributed = 0; + + for (uint256 i = 0; i < recipients.length; i++) { + if (!recipients[i].isActive) continue; + + uint256 amount = (balance * recipients[i].shareBps) / 10000; + + if (token == address(0)) { + // Native ETH + (bool success, ) = recipients[i].recipient.call{value: amount}(""); + require(success, "FeeCollector: ETH transfer failed"); + } else { + // ERC20 token + IERC20(token).safeTransfer(recipients[i].recipient, amount); + } + + totalDistributed += amount; + _totalDistributed[token] += amount; + + emit FeesDistributed(token, recipients[i].recipient, amount, block.timestamp); + } + + // Ensure we distributed exactly the balance (within rounding) + require(totalDistributed <= balance, "FeeCollector: distribution overflow"); + } + + /** + * @notice Add a fee recipient for a token + * @param token Token address (address(0) for native ETH) + * @param recipient Recipient address + * @param shareBps Share in basis points (10000 = 100%) + * @dev Requires FEE_MANAGER_ROLE + */ + function addFeeRecipient( + address token, + address recipient, + uint256 shareBps + ) external onlyRole(FEE_MANAGER_ROLE) { + require(recipient != address(0), "FeeCollector: zero recipient"); + require(shareBps > 0 && shareBps <= 10000, "FeeCollector: invalid share"); + + // Check if recipient already exists + FeeRecipient[] storage recipients = _feeRecipients[token]; + for (uint256 i = 0; i < recipients.length; i++) { + require(recipients[i].recipient != recipient, "FeeCollector: recipient already exists"); + } + + recipients.push(FeeRecipient({ + recipient: recipient, + shareBps: shareBps, + isActive: true + })); + + emit FeeRecipientAdded(token, recipient, shareBps, block.timestamp); + } + + /** + * @notice Remove a fee recipient + * @param token Token address + * @param recipient Recipient address to remove + * @dev Requires FEE_MANAGER_ROLE + */ + function removeFeeRecipient(address token, address recipient) external onlyRole(FEE_MANAGER_ROLE) { + FeeRecipient[] storage recipients = _feeRecipients[token]; + + for (uint256 i = 0; i < recipients.length; i++) { + if (recipients[i].recipient == recipient) { + recipients[i] = recipients[recipients.length - 1]; + recipients.pop(); + emit FeeRecipientRemoved(token, recipient, block.timestamp); + return; + } + } + + revert("FeeCollector: recipient not found"); + } + + /** + * @notice Get fee recipients for a token + * @param token Token address + * @return Array of fee recipients + */ + function getFeeRecipients(address token) external view returns (FeeRecipient[] memory) { + return _feeRecipients[token]; + } + + /** + * @notice Get total collected fees for a token + * @param token Token address + * @return Total collected amount + */ + function getTotalCollected(address token) external view returns (uint256) { + return _totalCollected[token]; + } + + /** + * @notice Get total distributed fees for a token + * @param token Token address + * @return Total distributed amount + */ + function getTotalDistributed(address token) external view returns (uint256) { + return _totalDistributed[token]; + } + + /** + * @notice Get current balance for a token + * @param token Token address (address(0) for native ETH) + * @return Current balance + */ + function getBalance(address token) external view returns (uint256) { + if (token == address(0)) { + return address(this).balance; + } else { + return IERC20(token).balanceOf(address(this)); + } + } + + /** + * @notice Emergency withdraw (admin only) + * @param token Token address (address(0) for native ETH) + * @param to Recipient address + * @param amount Amount to withdraw + * @dev Requires DEFAULT_ADMIN_ROLE + */ + function emergencyWithdraw( + address token, + address to, + uint256 amount + ) external onlyRole(DEFAULT_ADMIN_ROLE) nonReentrant { + require(to != address(0), "FeeCollector: zero recipient"); + + if (token == address(0)) { + (bool success, ) = to.call{value: amount}(""); + require(success, "FeeCollector: ETH transfer failed"); + } else { + IERC20(token).safeTransfer(to, amount); + } + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/utils/Multicall.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/Multicall.sol new file mode 100644 index 0000000..a267e25 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/Multicall.sol @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Multicall + * @notice Aggregate multiple calls in a single transaction + * @dev Based on Uniswap V3 Multicall + */ +contract Multicall { + struct Call { + address target; + bytes callData; + } + + struct Result { + bool success; + bytes returnData; + } + + /** + * @notice Aggregate multiple calls + * @param calls Array of calls to execute + * @return returnData Array of return data for each call + */ + function aggregate(Call[] memory calls) public returns (bytes[] memory returnData) { + returnData = new bytes[](calls.length); + for (uint256 i = 0; i < calls.length; i++) { + (bool success, bytes memory ret) = calls[i].target.call(calls[i].callData); + require(success, "Multicall: call failed"); + returnData[i] = ret; + } + } + + /** + * @notice Aggregate multiple calls, allowing failures + * @param requireSuccess If true, require all calls to succeed + * @param calls Array of calls to execute + * @return returnData Array of results with success flags and return data for each call + */ + function tryAggregate(bool requireSuccess, Call[] memory calls) + public + returns (Result[] memory returnData) + { + returnData = new Result[](calls.length); + for (uint256 i = 0; i < calls.length; i++) { + (bool success, bytes memory ret) = calls[i].target.call(calls[i].callData); + + if (requireSuccess) { + require(success, "Multicall: call failed"); + } + + returnData[i] = Result(success, ret); + } + } + + /** + * @notice Aggregate multiple calls with gas limit + * @param calls Array of calls to execute + * @param gasLimit Gas limit for each call + * @return returnData Array of return data for each call + */ + function aggregateWithGasLimit(Call[] memory calls, uint256 gasLimit) + public + returns (bytes[] memory returnData) + { + returnData = new bytes[](calls.length); + for (uint256 i = 0; i < calls.length; i++) { + (bool success, bytes memory ret) = calls[i].target.call{gas: gasLimit}(calls[i].callData); + require(success, "Multicall: call failed"); + returnData[i] = ret; + } + } + + /** + * @notice Get block hash for a specific block + * @param blockNumber Block number + * @return blockHash Block hash + */ + function getBlockHash(uint256 blockNumber) public view returns (bytes32 blockHash) { + blockHash = blockhash(blockNumber); + } + + /** + * @notice Get current block timestamp + * @return timestamp Current block timestamp + */ + function getCurrentBlockTimestamp() public view returns (uint256 timestamp) { + timestamp = block.timestamp; + } + + /** + * @notice Get current block difficulty + * @return difficulty Current block difficulty + */ + function getCurrentBlockDifficulty() public view returns (uint256 difficulty) { + difficulty = block.difficulty; + } + + /** + * @notice Get current block gas limit + * @return gaslimit Current block gas limit + */ + function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) { + gaslimit = block.gaslimit; + } + + /** + * @notice Get current block coinbase + * @return coinbase Current block coinbase + */ + function getCurrentBlockCoinbase() public view returns (address coinbase) { + coinbase = block.coinbase; + } + + /** + * @notice Get current block number + * @return blockNumber Current block number + */ + function getCurrentBlockNumber() public view returns (uint256 blockNumber) { + blockNumber = block.number; + } + + /** + * @notice Get current chain ID + * @return chainid Current chain ID + */ + function getChainId() public view returns (uint256 chainid) { + chainid = block.chainid; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/utils/TokenRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/TokenRegistry.sol new file mode 100644 index 0000000..e054a0c --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/utils/TokenRegistry.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title TokenRegistry + * @notice Registry for all tokens on ChainID 138 + * @dev Provides a centralized registry for token addresses, metadata, and status + */ +contract TokenRegistry is AccessControl { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + + /** + * @notice Token information structure + */ + struct TokenInfo { + address tokenAddress; + string name; + string symbol; + uint8 decimals; + bool isActive; + bool isNative; + address bridgeAddress; // If bridged from another chain + uint256 registeredAt; + uint256 lastUpdated; + } + + mapping(address => TokenInfo) private _tokens; + mapping(string => address) private _tokensBySymbol; + address[] private _tokenList; + + event TokenRegistered( + address indexed tokenAddress, + string name, + string symbol, + uint8 decimals, + uint256 timestamp + ); + + event TokenUpdated( + address indexed tokenAddress, + bool isActive, + uint256 timestamp + ); + + event TokenRemoved( + address indexed tokenAddress, + uint256 timestamp + ); + + /** + * @notice Constructor + * @param admin Address that will receive DEFAULT_ADMIN_ROLE + */ + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a new token + * @param tokenAddress Address of the token contract + * @param name Token name + * @param symbol Token symbol + * @param decimals Number of decimals + * @param isNative Whether this is a native token (e.g., ETH) + * @param bridgeAddress Bridge address if this is a bridged token (address(0) if not) + * @dev Requires REGISTRAR_ROLE + */ + function registerToken( + address tokenAddress, + string calldata name, + string calldata symbol, + uint8 decimals, + bool isNative, + address bridgeAddress + ) external onlyRole(REGISTRAR_ROLE) { + require(tokenAddress != address(0), "TokenRegistry: zero address"); + require(_tokens[tokenAddress].tokenAddress == address(0), "TokenRegistry: token already registered"); + require(_tokensBySymbol[symbol] == address(0), "TokenRegistry: symbol already used"); + + // Verify token contract exists (if not native) + if (!isNative) { + require(tokenAddress.code.length > 0, "TokenRegistry: invalid token contract"); + } + + _tokens[tokenAddress] = TokenInfo({ + tokenAddress: tokenAddress, + name: name, + symbol: symbol, + decimals: decimals, + isActive: true, + isNative: isNative, + bridgeAddress: bridgeAddress, + registeredAt: block.timestamp, + lastUpdated: block.timestamp + }); + + _tokensBySymbol[symbol] = tokenAddress; + _tokenList.push(tokenAddress); + + emit TokenRegistered(tokenAddress, name, symbol, decimals, block.timestamp); + } + + /** + * @notice Update token status + * @param tokenAddress Address of the token + * @param isActive New active status + * @dev Requires REGISTRAR_ROLE + */ + function updateTokenStatus(address tokenAddress, bool isActive) external onlyRole(REGISTRAR_ROLE) { + require(_tokens[tokenAddress].tokenAddress != address(0), "TokenRegistry: token not registered"); + + _tokens[tokenAddress].isActive = isActive; + _tokens[tokenAddress].lastUpdated = block.timestamp; + + emit TokenUpdated(tokenAddress, isActive, block.timestamp); + } + + /** + * @notice Remove a token from the registry + * @param tokenAddress Address of the token + * @dev Requires REGISTRAR_ROLE + */ + function removeToken(address tokenAddress) external onlyRole(REGISTRAR_ROLE) { + require(_tokens[tokenAddress].tokenAddress != address(0), "TokenRegistry: token not registered"); + + // Remove from symbol mapping + delete _tokensBySymbol[_tokens[tokenAddress].symbol]; + + // Remove from list (swap with last element and pop) + for (uint256 i = 0; i < _tokenList.length; i++) { + if (_tokenList[i] == tokenAddress) { + _tokenList[i] = _tokenList[_tokenList.length - 1]; + _tokenList.pop(); + break; + } + } + + delete _tokens[tokenAddress]; + + emit TokenRemoved(tokenAddress, block.timestamp); + } + + /** + * @notice Get token information + * @param tokenAddress Address of the token + * @return Token information struct + */ + function getTokenInfo(address tokenAddress) external view returns (TokenInfo memory) { + return _tokens[tokenAddress]; + } + + /** + * @notice Get token address by symbol + * @param symbol Token symbol + * @return Token address (address(0) if not found) + */ + function getTokenBySymbol(string calldata symbol) external view returns (address) { + address tokenAddr = _tokensBySymbol[symbol]; + return tokenAddr; + } + + /** + * @notice Check if a token is registered + * @param tokenAddress Address of the token + * @return True if registered, false otherwise + */ + function isTokenRegistered(address tokenAddress) external view returns (bool) { + return _tokens[tokenAddress].tokenAddress != address(0); + } + + /** + * @notice Check if a token is active + * @param tokenAddress Address of the token + * @return True if active, false otherwise + */ + function isTokenActive(address tokenAddress) external view returns (bool) { + TokenInfo memory token = _tokens[tokenAddress]; + return token.tokenAddress != address(0) && token.isActive; + } + + /** + * @notice Get all registered tokens + * @return Array of token addresses + */ + function getAllTokens() external view returns (address[] memory) { + return _tokenList; + } + + /** + * @notice Get count of registered tokens + * @return Number of registered tokens + */ + function getTokenCount() external view returns (uint256) { + return _tokenList.length; + } +} + diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/BridgeVaultExtension.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/BridgeVaultExtension.sol new file mode 100644 index 0000000..a6b4bce --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/BridgeVaultExtension.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title BridgeVaultExtension + * @notice Extension to vault for tracking bridge operations + * @dev Can be attached to existing vault contracts + */ +contract BridgeVaultExtension is AccessControl { + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + + enum BridgeStatus { + Initiated, + Confirmed, + Completed, + Failed + } + + struct BridgeRecord { + bytes32 messageId; + address token; + uint256 amount; + uint64 destinationChain; + address recipient; + uint256 timestamp; + BridgeStatus status; + } + + // Storage + mapping(bytes32 => BridgeRecord) public bridgeRecords; + bytes32[] public bridgeHistory; + mapping(address => bytes32[]) public userBridgeHistory; + + event BridgeRecorded( + bytes32 indexed messageId, + address indexed token, + uint256 amount, + uint64 destinationChain + ); + + event BridgeStatusUpdated( + bytes32 indexed messageId, + BridgeStatus status + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + } + + /** + * @notice Record bridge operation + */ + function recordBridgeOperation( + bytes32 messageId, + address token, + uint256 amount, + uint64 destinationChain, + address recipient + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + require(messageId != bytes32(0), "Invalid message ID"); + require(bridgeRecords[messageId].timestamp == 0, "Already recorded"); + + bridgeRecords[messageId] = BridgeRecord({ + messageId: messageId, + token: token, + amount: amount, + destinationChain: destinationChain, + recipient: recipient, + timestamp: block.timestamp, + status: BridgeStatus.Initiated + }); + + bridgeHistory.push(messageId); + userBridgeHistory[recipient].push(messageId); + + emit BridgeRecorded(messageId, token, amount, destinationChain); + } + + /** + * @notice Update bridge status + */ + function updateBridgeStatus( + bytes32 messageId, + BridgeStatus status + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + require(bridgeRecords[messageId].timestamp > 0, "Not found"); + + bridgeRecords[messageId].status = status; + + emit BridgeStatusUpdated(messageId, status); + } + + // View functions + + function getBridgeRecord(bytes32 messageId) external view returns (BridgeRecord memory) { + return bridgeRecords[messageId]; + } + + function getBridgeHistory(address user) external view returns (BridgeRecord[] memory) { + bytes32[] memory userHistory = userBridgeHistory[user]; + BridgeRecord[] memory records = new BridgeRecord[](userHistory.length); + + for (uint256 i = 0; i < userHistory.length; i++) { + records[i] = bridgeRecords[userHistory[i]]; + } + + return records; + } + + function getAllBridgeHistory() external view returns (BridgeRecord[] memory) { + BridgeRecord[] memory records = new BridgeRecord[](bridgeHistory.length); + + for (uint256 i = 0; i < bridgeHistory.length; i++) { + records[i] = bridgeRecords[bridgeHistory[i]]; + } + + return records; + } + + function getBridgeCount() external view returns (uint256) { + return bridgeHistory.length; + } + + function getUserBridgeCount(address user) external view returns (uint256) { + return userBridgeHistory[user].length; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/Ledger.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/Ledger.sol new file mode 100644 index 0000000..8aedddb --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/Ledger.sol @@ -0,0 +1,302 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./interfaces/ILedger.sol"; +import "./interfaces/IXAUOracle.sol"; +import "./interfaces/IRateAccrual.sol"; + +/** + * @title Ledger + * @notice Core ledger for tracking collateral and debt balances + * @dev Single source of truth for all vault accounting + * + * COMPLIANCE NOTES: + * - All valuations are normalized to XAU (gold) as the universal unit of account + * - eMoney tokens are XAU-denominated (1 eMoney = 1 XAU equivalent) + * - GRU (Global Reserve Unit) is a NON-ISO 4217 synthetic unit of account, NOT legal tender + * - All currency conversions MUST go through XAU triangulation + * - ISO 4217 currency codes are validated where applicable + */ +contract Ledger is ILedger, AccessControl { + bytes32 public constant VAULT_ROLE = keccak256("VAULT_ROLE"); + bytes32 public constant PARAM_MANAGER_ROLE = keccak256("PARAM_MANAGER_ROLE"); + + // Collateral balances: vault => asset => amount + mapping(address => mapping(address => uint256)) public override collateral; + + // Debt balances: vault => currency => amount + mapping(address => mapping(address => uint256)) public override debt; + + // Risk parameters per asset + mapping(address => uint256) public override debtCeiling; + mapping(address => uint256) public override liquidationRatio; // in basis points + mapping(address => uint256) public override creditMultiplier; // in basis points (50000 = 5x) + mapping(address => uint256) public override rateAccumulator; // debt interest accumulator + + // System contracts + IXAUOracle public xauOracle; + IRateAccrual public rateAccrual; + + // Track registered assets + mapping(address => bool) public isRegisteredAsset; + + constructor(address admin, address xauOracle_, address rateAccrual_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(PARAM_MANAGER_ROLE, admin); + xauOracle = IXAUOracle(xauOracle_); + rateAccrual = IRateAccrual(rateAccrual_); + } + + /** + * @notice Modify collateral balance for a vault + * @param vault Vault address + * @param asset Collateral asset address + * @param delta Amount to add (positive) or subtract (negative) + */ + function modifyCollateral(address vault, address asset, int256 delta) external override onlyRole(VAULT_ROLE) { + require(isRegisteredAsset[asset], "Ledger: asset not registered"); + + uint256 currentBalance = collateral[vault][asset]; + + if (delta > 0) { + collateral[vault][asset] = currentBalance + uint256(delta); + } else if (delta < 0) { + uint256 decrease = uint256(-delta); + require(currentBalance >= decrease, "Ledger: insufficient collateral"); + collateral[vault][asset] = currentBalance - decrease; + } + + emit CollateralModified(vault, asset, delta); + } + + /** + * @notice Modify debt balance for a vault + * @param vault Vault address + * @param currency Debt currency address (eMoney token) + * @param delta Amount to add (positive) or subtract (negative) + */ + function modifyDebt(address vault, address currency, int256 delta) external override onlyRole(VAULT_ROLE) { + // Accrue interest before modifying debt + rateAccrual.accrueInterest(currency); + uint256 accumulator = rateAccrual.getRateAccumulator(currency); + rateAccumulator[currency] = accumulator; + + uint256 currentDebt = debt[vault][currency]; + + if (delta > 0) { + uint256 addAmount = uint256(delta); + debt[vault][currency] = currentDebt + addAmount; + _totalDebtForCurrency[currency] += addAmount; + _trackCurrency(currency); + } else if (delta < 0) { + uint256 decrease = uint256(-delta); + require(currentDebt >= decrease, "Ledger: insufficient debt"); + debt[vault][currency] = currentDebt - decrease; + _totalDebtForCurrency[currency] -= decrease; + } + + emit DebtModified(vault, currency, delta); + } + + /** + * @notice Get vault health (collateralization ratio in XAU) + * @param vault Vault address + * @return healthRatio Collateralization ratio in basis points (10000 = 100%) + * @return collateralValue Total collateral value in XAU (18 decimals) + * @return debtValue Total debt value in XAU (18 decimals) + */ + function getVaultHealth(address vault) external view override returns ( + uint256 healthRatio, + uint256 collateralValue, + uint256 debtValue + ) { + collateralValue = _calculateCollateralValue(vault); + debtValue = _calculateDebtValue(vault); + + if (debtValue == 0) { + // No debt = infinite health + healthRatio = type(uint256).max; + } else { + // healthRatio = (collateralValue / debtValue) * 10000 + healthRatio = (collateralValue * 10000) / debtValue; + } + } + + /** + * @notice Check if a vault can borrow a specific amount + * @param vault Vault address + * @param currency Debt currency address + * @param amount Amount to borrow (in currency units) + * @return canBorrow True if borrow is allowed + * @return reasonCode Reason code if borrow is not allowed + */ + function canBorrow(address vault, address currency, uint256 amount) external view override returns ( + bool canBorrow, + bytes32 reasonCode + ) { + // Get current collateral and debt values in XAU + uint256 collateralValue = _calculateCollateralValue(vault); + uint256 currentDebtValue = _calculateDebtValue(vault); + + // Calculate new debt value in XAU + // eMoney is XAU-denominated by design: 1 eMoney = 1 XAU equivalent + // MANDATORY: If non-XAU currencies are used, they MUST be triangulated through XAU + uint256 newDebtValue = currentDebtValue + amount; + + // Check debt ceiling + uint256 totalDebt = _getTotalDebtForCurrency(currency); + if (totalDebt + amount > debtCeiling[currency]) { + return (false, keccak256("DEBT_CEILING_EXCEEDED")); + } + + // Check collateralization ratio + // Apply credit multiplier: maxBorrowValue = collateralValue * creditMultiplier / 10000 + uint256 maxBorrowValue = (collateralValue * creditMultiplier[currency]) / 10000; + + if (newDebtValue > maxBorrowValue) { + return (false, keccak256("INSUFFICIENT_COLLATERAL")); + } + + // Check minimum collateralization ratio + uint256 healthRatio = (collateralValue * 10000) / newDebtValue; + uint256 minRatio = liquidationRatio[currency] + 100; // Add 1% buffer above liquidation ratio + + if (healthRatio < minRatio) { + return (false, keccak256("BELOW_MIN_COLLATERALIZATION")); + } + + return (true, bytes32(0)); + } + + /** + * @notice Set risk parameters for an asset + * @param asset Asset address + * @param debtCeiling_ Debt ceiling + * @param liquidationRatio_ Liquidation ratio in basis points + * @param creditMultiplier_ Credit multiplier in basis points + */ + function setRiskParameters( + address asset, + uint256 debtCeiling_, + uint256 liquidationRatio_, + uint256 creditMultiplier_ + ) external onlyRole(PARAM_MANAGER_ROLE) { + require(liquidationRatio_ > 0 && liquidationRatio_ <= 10000, "Ledger: invalid liquidation ratio"); + require(creditMultiplier_ > 0 && creditMultiplier_ <= 100000, "Ledger: invalid credit multiplier"); // Max 10x + + isRegisteredAsset[asset] = true; + debtCeiling[asset] = debtCeiling_; + liquidationRatio[asset] = liquidationRatio_; + creditMultiplier[asset] = creditMultiplier_; + + emit RiskParametersSet(asset, debtCeiling_, liquidationRatio_, creditMultiplier_); + } + + /** + * @notice Calculate total collateral value in XAU for a vault + * @param vault Vault address + * @return value Total value in XAU (18 decimals) + */ + function _calculateCollateralValue(address vault) internal view returns (uint256 value) { + // For ETH collateral, get price from oracle + // In production, would iterate over all collateral assets + // For now, assume only ETH is supported + + // Get ETH balance + uint256 ethBalance = collateral[vault][address(0)]; // address(0) represents ETH + + if (ethBalance == 0) { + return 0; + } + + // Get ETH/XAU price from oracle + (uint256 ethPriceInXAU, ) = xauOracle.getETHPriceInXAU(); + + // Calculate value: ethBalance * ethPriceInXAU / 1e18 + value = (ethBalance * ethPriceInXAU) / 1e18; + } + + // Track currencies with debt for iteration + address[] private _currenciesWithDebt; + mapping(address => bool) private _isTrackedCurrency; + + // Total debt per currency (for debt ceiling check) + mapping(address => uint256) private _totalDebtForCurrency; + + /** + * @notice Calculate total debt value in XAU for a vault + * @param vault Vault address + * @return value Total debt value in XAU (18 decimals) + * @dev MANDATORY COMPLIANCE: eMoney tokens are XAU-denominated + * All debt is normalized to XAU terms for consistent valuation + * If non-XAU currencies are used, they MUST be triangulated through XAU + */ + function _calculateDebtValue(address vault) internal view returns (uint256 value) { + // eMoney tokens are XAU-denominated by design: 1 eMoney = 1 XAU equivalent + // This ensures all debt valuations are consistent in XAU terms + // If other currencies are used, they MUST be converted via XAU triangulation + + // Iterate over tracked currencies + for (uint256 i = 0; i < _currenciesWithDebt.length; i++) { + address currency = _currenciesWithDebt[i]; + uint256 debtAmount = debt[vault][currency]; + + if (debtAmount > 0) { + // Apply interest accrual + uint256 accumulator = rateAccrual.getRateAccumulator(currency); + uint256 debtWithInterest = (debtAmount * accumulator) / 1e27; + + // eMoney is XAU-denominated: 1:1 conversion + // For other currencies, XAU triangulation would be applied here + value += debtWithInterest; + } + } + } + + /** + * @notice Get total debt for a currency across all vaults + * @param currency Currency address + * @return total Total debt + */ + function _getTotalDebtForCurrency(address currency) internal view returns (uint256 total) { + return _totalDebtForCurrency[currency]; + } + + /** + * @notice Track a currency when debt is created + * @param currency Currency address + */ + function _trackCurrency(address currency) internal { + if (!_isTrackedCurrency[currency]) { + _currenciesWithDebt.push(currency); + _isTrackedCurrency[currency] = true; + } + } + + /** + * @notice Set XAU Oracle address + * @param xauOracle_ New oracle address + */ + function setXAUOracle(address xauOracle_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(xauOracle_ != address(0), "Ledger: zero address"); + xauOracle = IXAUOracle(xauOracle_); + } + + /** + * @notice Set Rate Accrual address + * @param rateAccrual_ New rate accrual address + */ + function setRateAccrual(address rateAccrual_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(rateAccrual_ != address(0), "Ledger: zero address"); + rateAccrual = IRateAccrual(rateAccrual_); + } + + /** + * @notice Grant VAULT_ROLE to an address (for factory use) + * @param account Address to grant role to + */ + function grantVaultRole(address account) external onlyRole(DEFAULT_ADMIN_ROLE) { + _grantRole(VAULT_ROLE, account); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/Liquidation.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/Liquidation.sol new file mode 100644 index 0000000..3fc4984 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/Liquidation.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./interfaces/ILiquidation.sol"; +import "./interfaces/ILedger.sol"; +import "./interfaces/ICollateralAdapter.sol"; +import "./interfaces/IeMoneyJoin.sol"; + +/** + * @title Liquidation + * @notice Handles liquidation of undercollateralized vaults + * @dev Permissioned liquidators only, no public auctions + */ +contract Liquidation is ILiquidation, AccessControl, ReentrancyGuard { + bytes32 public constant LIQUIDATOR_ROLE = keccak256("LIQUIDATOR_ROLE"); + + ILedger public ledger; + ICollateralAdapter public collateralAdapter; + IeMoneyJoin public eMoneyJoin; + + uint256 public constant BASIS_POINTS = 10000; + uint256 public override liquidationBonus = 500; // 5% bonus in basis points + + constructor( + address admin, + address ledger_, + address collateralAdapter_, + address eMoneyJoin_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(LIQUIDATOR_ROLE, admin); + ledger = ILedger(ledger_); + collateralAdapter = ICollateralAdapter(collateralAdapter_); + eMoneyJoin = IeMoneyJoin(eMoneyJoin_); + } + + /** + * @notice Liquidate an undercollateralized vault + * @param vault Vault address to liquidate + * @param currency Debt currency address + * @param maxDebt Maximum debt to liquidate + * @return seizedCollateral Amount of collateral seized + * @return repaidDebt Amount of debt repaid + */ + function liquidate( + address vault, + address currency, + uint256 maxDebt + ) external override nonReentrant onlyRole(LIQUIDATOR_ROLE) returns (uint256 seizedCollateral, uint256 repaidDebt) { + (bool canLiquidate, ) = this.canLiquidate(vault); + require(canLiquidate, "Liquidation: vault not liquidatable"); + + // Get current debt + uint256 currentDebt = ledger.debt(vault, currency); + require(currentDebt > 0, "Liquidation: no debt"); + + // Calculate debt to repay (min of maxDebt and currentDebt) + repaidDebt = maxDebt < currentDebt ? maxDebt : currentDebt; + + // Get liquidation ratio for the currency + uint256 liqRatio = ledger.liquidationRatio(currency); + + // Calculate collateral value needed: repaidDebt * (1 + bonus) * liquidationRatio / 10000 + // In XAU terms + uint256 collateralValueNeeded = (repaidDebt * (BASIS_POINTS + liquidationBonus) * liqRatio) / (BASIS_POINTS * BASIS_POINTS); + + // For simplicity, assume ETH collateral (address(0)) + // In production, would determine which collateral to seize + address collateralAsset = address(0); + uint256 collateralBalance = ledger.collateral(vault, collateralAsset); + + // Calculate how much collateral to seize based on ETH/XAU price + // This is simplified - in production would use oracle + seizedCollateral = collateralValueNeeded; // Simplified: assume 1:1 for now + + // Ensure we don't seize more than available + if (seizedCollateral > collateralBalance) { + seizedCollateral = collateralBalance; + // Recalculate repaidDebt based on actual seized collateral + repaidDebt = (seizedCollateral * BASIS_POINTS * BASIS_POINTS) / ((BASIS_POINTS + liquidationBonus) * liqRatio); + } + + // Burn eMoney from liquidator (they provide eMoney to repay debt) + eMoneyJoin.burn(currency, msg.sender, repaidDebt); + + // Update debt + ledger.modifyDebt(vault, currency, -int256(repaidDebt)); + + // Seize collateral + collateralAdapter.seize(vault, collateralAsset, seizedCollateral, msg.sender); + + emit VaultLiquidated(vault, currency, seizedCollateral, repaidDebt, msg.sender); + } + + /** + * @notice Check if a vault can be liquidated + * @param vault Vault address + * @return canLiquidate True if vault can be liquidated + * @return healthRatio Current health ratio in basis points + */ + function canLiquidate(address vault) external view override returns (bool canLiquidate, uint256 healthRatio) { + (healthRatio, , ) = ledger.getVaultHealth(vault); + + // Vault is liquidatable if health ratio is below liquidation ratio + // Need to check for each currency - simplified here + // In production, would check all currencies + + // For now, assume vault is liquidatable if health < 110% (liquidation ratio + buffer) + canLiquidate = healthRatio < 11000; // 110% in basis points + } + + /** + * @notice Set liquidation bonus + * @param bonus New liquidation bonus in basis points + */ + function setLiquidationBonus(uint256 bonus) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(bonus <= 1000, "Liquidation: bonus too high"); // Max 10% + liquidationBonus = bonus; + } + + /** + * @notice Set ledger address + * @param ledger_ New ledger address + */ + function setLedger(address ledger_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(ledger_ != address(0), "Liquidation: zero address"); + ledger = ILedger(ledger_); + } + + /** + * @notice Set collateral adapter address + * @param collateralAdapter_ New adapter address + */ + function setCollateralAdapter(address collateralAdapter_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(collateralAdapter_ != address(0), "Liquidation: zero address"); + collateralAdapter = ICollateralAdapter(collateralAdapter_); + } + + /** + * @notice Set eMoney join address + * @param eMoneyJoin_ New join address + */ + function setEMoneyJoin(address eMoneyJoin_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(eMoneyJoin_ != address(0), "Liquidation: zero address"); + eMoneyJoin = IeMoneyJoin(eMoneyJoin_); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/RateAccrual.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/RateAccrual.sol new file mode 100644 index 0000000..75ceef0 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/RateAccrual.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./interfaces/IRateAccrual.sol"; + +/** + * @title RateAccrual + * @notice Applies time-based interest to outstanding debt using continuous compounding + * @dev Similar to Aave's interest rate model + */ +contract RateAccrual is IRateAccrual, AccessControl { + bytes32 public constant RATE_MANAGER_ROLE = keccak256("RATE_MANAGER_ROLE"); + + uint256 public constant BASIS_POINTS = 10000; + uint256 public constant SECONDS_PER_YEAR = 365 days; + uint256 public constant RAY = 1e27; // Used for precision in calculations + + // Asset => interest rate (in basis points, e.g., 500 = 5% annual) + mapping(address => uint256) private _interestRates; + + // Asset => rate accumulator (starts at RAY, increases over time) + mapping(address => uint256) private _rateAccumulators; + + // Asset => last update timestamp + mapping(address => uint256) private _lastUpdate; + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(RATE_MANAGER_ROLE, admin); + } + + /** + * @notice Accrue interest for an asset + * @param asset Asset address + * @return newAccumulator Updated rate accumulator + */ + function accrueInterest(address asset) external override returns (uint256 newAccumulator) { + uint256 oldAccumulator = _rateAccumulators[asset]; + uint256 lastUpdate = _lastUpdate[asset]; + + if (lastUpdate == 0) { + // Initialize accumulator + _rateAccumulators[asset] = RAY; + _lastUpdate[asset] = block.timestamp; + return RAY; + } + + if (block.timestamp == lastUpdate) { + return oldAccumulator; + } + + uint256 rate = _interestRates[asset]; + if (rate == 0) { + return oldAccumulator; + } + + // Calculate time elapsed in years + uint256 timeElapsed = block.timestamp - lastUpdate; + uint256 timeInYears = (timeElapsed * RAY) / SECONDS_PER_YEAR; + + // Continuous compounding: newAccumulator = oldAccumulator * e^(rate * time) + // Approximation: e^(r*t) ≈ 1 + r*t + (r*t)^2/2! + ... + // For small rates: e^(r*t) ≈ 1 + r*t (first order approximation) + // More accurate: use compound interest formula with high precision + + // Convert rate from basis points to RAY: rateInRay = (rate * RAY) / BASIS_POINTS + uint256 rateInRay = (rate * RAY) / BASIS_POINTS; + + // Calculate exponent: rateInRay * timeInYears / RAY + uint256 exponent = (rateInRay * timeInYears) / RAY; + + // newAccumulator = oldAccumulator * (1 + exponent) + // For better precision, we use: newAccumulator = oldAccumulator + (oldAccumulator * exponent) / RAY + newAccumulator = oldAccumulator + (oldAccumulator * exponent) / RAY; + + _rateAccumulators[asset] = newAccumulator; + _lastUpdate[asset] = block.timestamp; + + emit InterestAccrued(asset, oldAccumulator, newAccumulator); + } + + /** + * @notice Get current rate accumulator for an asset (accrues interest if needed) + * @param asset Asset address + * @return accumulator Current rate accumulator + */ + function getRateAccumulator(address asset) external view override returns (uint256 accumulator) { + accumulator = _rateAccumulators[asset]; + uint256 lastUpdate = _lastUpdate[asset]; + + if (lastUpdate == 0) { + return RAY; // Initial value + } + + if (block.timestamp == lastUpdate) { + return accumulator; + } + + uint256 rate = _interestRates[asset]; + if (rate == 0) { + return accumulator; + } + + // Calculate accrued interest (same logic as accrueInterest but view-only) + uint256 timeElapsed = block.timestamp - lastUpdate; + uint256 timeInYears = (timeElapsed * RAY) / SECONDS_PER_YEAR; + uint256 rateInRay = (rate * RAY) / BASIS_POINTS; + uint256 exponent = (rateInRay * timeInYears) / RAY; + accumulator = accumulator + (accumulator * exponent) / RAY; + } + + /** + * @notice Set interest rate for an asset + * @param asset Asset address + * @param rate Annual interest rate in basis points (e.g., 500 = 5%) + */ + function setInterestRate(address asset, uint256 rate) external onlyRole(RATE_MANAGER_ROLE) { + require(rate <= BASIS_POINTS * 100, "RateAccrual: rate too high"); // Max 100% annual + + // Accrue interest before updating rate + if (_lastUpdate[asset] > 0) { + this.accrueInterest(asset); + } else { + _rateAccumulators[asset] = RAY; + _lastUpdate[asset] = block.timestamp; + } + + _interestRates[asset] = rate; + + emit InterestRateSet(asset, rate); + } + + /** + * @notice Get interest rate for an asset + * @param asset Asset address + * @return rate Annual interest rate in basis points + */ + function interestRate(address asset) external view override returns (uint256) { + return _interestRates[asset]; + } + + /** + * @notice Calculate debt with accrued interest + * @param asset Asset address + * @param principal Principal debt amount + * @return debtWithInterest Debt amount with accrued interest + */ + function calculateDebtWithInterest(address asset, uint256 principal) external view override returns (uint256 debtWithInterest) { + uint256 accumulator = this.getRateAccumulator(asset); + // debtWithInterest = principal * accumulator / RAY + debtWithInterest = (principal * accumulator) / RAY; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/RegulatedEntityRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/RegulatedEntityRegistry.sol new file mode 100644 index 0000000..a3d0e99 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/RegulatedEntityRegistry.sol @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./interfaces/IRegulatedEntityRegistry.sol"; + +/** + * @title RegulatedEntityRegistry + * @notice Registry for tracking regulated financial entities eligible for vault operations + * @dev Separate from eMoney ComplianceRegistry (used for transfers) + */ +contract RegulatedEntityRegistry is IRegulatedEntityRegistry, AccessControl { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + struct Entity { + bool registered; + bool suspended; + bytes32 jurisdictionHash; + address[] authorizedWallets; + mapping(address => bool) isAuthorizedWallet; + mapping(address => bool) isOperator; + uint256 registeredAt; + } + + mapping(address => Entity) private _entities; + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a regulated entity + * @param entity Entity address + * @param jurisdictionHash Hash of jurisdiction identifier + * @param authorizedWallets Initial authorized wallets + */ + function registerEntity( + address entity, + bytes32 jurisdictionHash, + address[] calldata authorizedWallets + ) external onlyRole(REGISTRAR_ROLE) { + require(entity != address(0), "RegulatedEntityRegistry: zero address"); + require(!_entities[entity].registered, "RegulatedEntityRegistry: already registered"); + + Entity storage entityData = _entities[entity]; + entityData.registered = true; + entityData.jurisdictionHash = jurisdictionHash; + entityData.registeredAt = block.timestamp; + + for (uint256 i = 0; i < authorizedWallets.length; i++) { + require(authorizedWallets[i] != address(0), "RegulatedEntityRegistry: zero wallet"); + entityData.authorizedWallets.push(authorizedWallets[i]); + entityData.isAuthorizedWallet[authorizedWallets[i]] = true; + } + + emit EntityRegistered(entity, jurisdictionHash, block.timestamp); + } + + /** + * @notice Check if an entity is registered and eligible + * @param entity Entity address + * @return isEligible True if entity is registered and not suspended + */ + function isEligible(address entity) external view override returns (bool) { + Entity storage entityData = _entities[entity]; + return entityData.registered && !entityData.suspended; + } + + /** + * @notice Check if a wallet is authorized for an entity + * @param entity Entity address + * @param wallet Wallet address + * @return isAuthorized True if wallet is authorized + */ + function isAuthorized(address entity, address wallet) external view override returns (bool) { + return _entities[entity].isAuthorizedWallet[wallet]; + } + + /** + * @notice Check if an address is an operator for an entity + * @param entity Entity address + * @param operator Operator address + * @return isOperator True if address is an operator + */ + function isOperator(address entity, address operator) external view override returns (bool) { + return _entities[entity].isOperator[operator]; + } + + /** + * @notice Add authorized wallet to an entity + * @param entity Entity address + * @param wallet Wallet address to authorize + */ + function addAuthorizedWallet(address entity, address wallet) external override { + require(_entities[entity].registered, "RegulatedEntityRegistry: entity not registered"); + require( + hasRole(REGISTRAR_ROLE, msg.sender) || + _entities[entity].isAuthorizedWallet[msg.sender] || + _entities[entity].isOperator[msg.sender], + "RegulatedEntityRegistry: not authorized" + ); + require(wallet != address(0), "RegulatedEntityRegistry: zero wallet"); + require(!_entities[entity].isAuthorizedWallet[wallet], "RegulatedEntityRegistry: already authorized"); + + _entities[entity].authorizedWallets.push(wallet); + _entities[entity].isAuthorizedWallet[wallet] = true; + + emit AuthorizedWalletAdded(entity, wallet); + } + + /** + * @notice Remove authorized wallet from an entity + * @param entity Entity address + * @param wallet Wallet address to remove + */ + function removeAuthorizedWallet(address entity, address wallet) external override { + require(_entities[entity].registered, "RegulatedEntityRegistry: entity not registered"); + require( + hasRole(REGISTRAR_ROLE, msg.sender) || + _entities[entity].isAuthorizedWallet[msg.sender] || + _entities[entity].isOperator[msg.sender], + "RegulatedEntityRegistry: not authorized" + ); + require(_entities[entity].isAuthorizedWallet[wallet], "RegulatedEntityRegistry: not authorized"); + + _entities[entity].isAuthorizedWallet[wallet] = false; + + // Remove from array + address[] storage wallets = _entities[entity].authorizedWallets; + for (uint256 i = 0; i < wallets.length; i++) { + if (wallets[i] == wallet) { + wallets[i] = wallets[wallets.length - 1]; + wallets.pop(); + break; + } + } + + emit AuthorizedWalletRemoved(entity, wallet); + } + + /** + * @notice Set operator status for an entity + * @param entity Entity address + * @param operator Operator address + * @param status True to grant operator status, false to revoke + */ + function setOperator(address entity, address operator, bool status) external override { + require(_entities[entity].registered, "RegulatedEntityRegistry: entity not registered"); + require( + hasRole(REGISTRAR_ROLE, msg.sender) || + _entities[entity].isAuthorizedWallet[msg.sender], + "RegulatedEntityRegistry: not authorized" + ); + require(operator != address(0), "RegulatedEntityRegistry: zero operator"); + + _entities[entity].isOperator[operator] = status; + + emit OperatorSet(entity, operator, status); + } + + /** + * @notice Suspend an entity + * @param entity Entity address + */ + function suspendEntity(address entity) external onlyRole(REGISTRAR_ROLE) { + require(_entities[entity].registered, "RegulatedEntityRegistry: entity not registered"); + require(!_entities[entity].suspended, "RegulatedEntityRegistry: already suspended"); + + _entities[entity].suspended = true; + + emit EntitySuspended(entity, block.timestamp); + } + + /** + * @notice Unsuspend an entity + * @param entity Entity address + */ + function unsuspendEntity(address entity) external onlyRole(REGISTRAR_ROLE) { + require(_entities[entity].registered, "RegulatedEntityRegistry: entity not registered"); + require(_entities[entity].suspended, "RegulatedEntityRegistry: not suspended"); + + _entities[entity].suspended = false; + + emit EntityUnsuspended(entity, block.timestamp); + } + + /** + * @notice Get entity information + * @param entity Entity address + * @return registered True if entity is registered + * @return suspended True if entity is suspended + * @return jurisdictionHash Jurisdiction hash + * @return authorizedWallets List of authorized wallets + */ + function getEntity(address entity) external view override returns ( + bool registered, + bool suspended, + bytes32 jurisdictionHash, + address[] memory authorizedWallets + ) { + Entity storage entityData = _entities[entity]; + return ( + entityData.registered, + entityData.suspended, + entityData.jurisdictionHash, + entityData.authorizedWallets + ); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/Vault.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/Vault.sol new file mode 100644 index 0000000..b332b4a --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/Vault.sol @@ -0,0 +1,226 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "./interfaces/IVault.sol"; +import "./interfaces/ILedger.sol"; +import "./interfaces/IRegulatedEntityRegistry.sol"; +import "./interfaces/ICollateralAdapter.sol"; +import "./interfaces/IeMoneyJoin.sol"; +import "./tokens/DepositToken.sol"; +import "./tokens/DebtToken.sol"; + +/** + * @title Vault + * @notice Aave-style vault for deposit, borrow, repay, withdraw operations + * @dev Each vault is owned by a regulated entity + */ +contract Vault is IVault, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + address public override owner; + address public entity; // Regulated entity address + + ILedger public ledger; + IRegulatedEntityRegistry public entityRegistry; + ICollateralAdapter public collateralAdapter; + IeMoneyJoin public eMoneyJoin; + + // Token mappings + mapping(address => address) public depositTokens; // asset => DepositToken + mapping(address => address) public debtTokens; // currency => DebtToken + + constructor( + address owner_, + address entity_, + address ledger_, + address entityRegistry_, + address collateralAdapter_, + address eMoneyJoin_ + ) { + owner = owner_; + entity = entity_; + ledger = ILedger(ledger_); + entityRegistry = IRegulatedEntityRegistry(entityRegistry_); + collateralAdapter = ICollateralAdapter(collateralAdapter_); + eMoneyJoin = IeMoneyJoin(eMoneyJoin_); + + _grantRole(DEFAULT_ADMIN_ROLE, owner_); + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); // Factory can set tokens during creation + } + + /** + * @notice Set deposit token for an asset + * @param asset Asset address + * @param depositToken Deposit token address + */ + function setDepositToken(address asset, address depositToken) external onlyRole(DEFAULT_ADMIN_ROLE) { + depositTokens[asset] = depositToken; + } + + /** + * @notice Set debt token for a currency + * @param currency Currency address + * @param debtToken Debt token address + */ + function setDebtToken(address currency, address debtToken) external onlyRole(DEFAULT_ADMIN_ROLE) { + debtTokens[currency] = debtToken; + } + + /** + * @notice Deposit M0 collateral into vault + * @param asset Collateral asset address (address(0) for native ETH) + * @param amount Amount to deposit + */ + function deposit(address asset, uint256 amount) external payable override nonReentrant { + require(amount > 0, "Vault: zero amount"); + require( + entityRegistry.isEligible(entity) && + (entityRegistry.isAuthorized(entity, msg.sender) || + entityRegistry.isOperator(entity, msg.sender) || + msg.sender == owner), + "Vault: not authorized" + ); + + if (asset == address(0)) { + require(msg.value == amount, "Vault: value mismatch"); + } else { + require(msg.value == 0, "Vault: unexpected ETH"); + IERC20(asset).safeTransferFrom(msg.sender, address(collateralAdapter), amount); + } + + // Deposit via adapter + collateralAdapter.deposit{value: asset == address(0) ? amount : 0}(address(this), asset, amount); + + // Mint deposit token + address depositToken = depositTokens[asset]; + if (depositToken != address(0)) { + DepositToken(depositToken).mint(msg.sender, amount); + } + + emit Deposited(asset, amount, msg.sender); + } + + /** + * @notice Borrow eMoney against collateral + * @param currency eMoney currency address + * @param amount Amount to borrow + */ + function borrow(address currency, uint256 amount) external override nonReentrant { + require(amount > 0, "Vault: zero amount"); + require( + entityRegistry.isEligible(entity) && + (entityRegistry.isAuthorized(entity, msg.sender) || + entityRegistry.isOperator(entity, msg.sender) || + msg.sender == owner), + "Vault: not authorized" + ); + + // Check if borrow is allowed + (bool canBorrow, bytes32 reasonCode) = ledger.canBorrow(address(this), currency, amount); + require(canBorrow, string(abi.encodePacked("Vault: borrow not allowed: ", reasonCode))); + + // Update debt in ledger + ledger.modifyDebt(address(this), currency, int256(amount)); + + // Mint debt token + address debtToken = debtTokens[currency]; + if (debtToken != address(0)) { + DebtToken(debtToken).mint(msg.sender, amount); + } + + // Mint eMoney to borrower + eMoneyJoin.mint(currency, msg.sender, amount); + + emit Borrowed(currency, amount, msg.sender); + } + + /** + * @notice Repay borrowed eMoney + * @param currency eMoney currency address + * @param amount Amount to repay + */ + function repay(address currency, uint256 amount) external override nonReentrant { + require(amount > 0, "Vault: zero amount"); + + uint256 currentDebt = ledger.debt(address(this), currency); + require(currentDebt > 0, "Vault: no debt"); + + // Burn eMoney from repayer + eMoneyJoin.burn(currency, msg.sender, amount); + + // Update debt in ledger + uint256 repayAmount = amount > currentDebt ? currentDebt : amount; + ledger.modifyDebt(address(this), currency, -int256(repayAmount)); + + // Burn debt token + address debtToken = debtTokens[currency]; + if (debtToken != address(0)) { + uint256 debtTokenBalance = DebtToken(debtToken).balanceOf(msg.sender); + uint256 burnAmount = repayAmount > debtTokenBalance ? debtTokenBalance : repayAmount; + DebtToken(debtToken).burn(msg.sender, burnAmount); + } + + emit Repaid(currency, repayAmount, msg.sender); + } + + /** + * @notice Withdraw collateral from vault + * @param asset Collateral asset address + * @param amount Amount to withdraw + */ + function withdraw(address asset, uint256 amount) external override nonReentrant { + require(amount > 0, "Vault: zero amount"); + require( + entityRegistry.isEligible(entity) && + (entityRegistry.isAuthorized(entity, msg.sender) || + entityRegistry.isOperator(entity, msg.sender) || + msg.sender == owner), + "Vault: not authorized" + ); + + // Check vault health after withdrawal + uint256 collateralBalance = ledger.collateral(address(this), asset); + require(collateralBalance >= amount, "Vault: insufficient collateral"); + + // Check if withdrawal would make vault unsafe + // Simplified check - in production would calculate health after withdrawal + (uint256 healthRatio, , ) = ledger.getVaultHealth(address(this)); + require(healthRatio >= 11000, "Vault: withdrawal would make vault unsafe"); // 110% minimum + + // Burn deposit token + address depositToken = depositTokens[asset]; + if (depositToken != address(0)) { + uint256 depositTokenBalance = DepositToken(depositToken).balanceOf(msg.sender); + require(depositTokenBalance >= amount, "Vault: insufficient deposit tokens"); + DepositToken(depositToken).burn(msg.sender, amount); + } + + // Withdraw via adapter + collateralAdapter.withdraw(address(this), asset, amount); + + emit Withdrawn(asset, amount, msg.sender); + } + + /** + * @notice Get vault health + * @return healthRatio Collateralization ratio in basis points + * @return collateralValue Total collateral value in XAU + * @return debtValue Total debt value in XAU + */ + function getHealth() external view override returns ( + uint256 healthRatio, + uint256 collateralValue, + uint256 debtValue + ) { + return ledger.getVaultHealth(address(this)); + } + + /// @notice Accept ETH from CollateralAdapter withdraw + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/VaultFactory.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/VaultFactory.sol new file mode 100644 index 0000000..887c00f --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/VaultFactory.sol @@ -0,0 +1,253 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import "./Vault.sol"; +import "./tokens/DepositToken.sol"; +import "./tokens/DebtToken.sol"; +import "./interfaces/ILedger.sol"; + +/** + * @title VaultFactory + * @notice Factory for creating vault instances with associated tokens + * @dev Creates Vault, DepositToken, and DebtToken instances + */ +contract VaultFactory is AccessControl { + bytes32 public constant VAULT_DEPLOYER_ROLE = keccak256("VAULT_DEPLOYER_ROLE"); + + address public immutable vaultImplementation; + address public immutable depositTokenImplementation; + address public immutable debtTokenImplementation; + + ILedger public ledger; + address public entityRegistry; + address public collateralAdapter; + address public eMoneyJoin; + + mapping(address => address[]) public vaultsByEntity; // entity => vaults[] + mapping(address => address) public vaultToEntity; // vault => entity + + event VaultCreated( + address indexed vault, + address indexed entity, + address indexed owner, + address depositToken, + address debtToken + ); + + constructor( + address admin, + address vaultImplementation_, + address depositTokenImplementation_, + address debtTokenImplementation_, + address ledger_, + address entityRegistry_, + address collateralAdapter_, + address eMoneyJoin_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(VAULT_DEPLOYER_ROLE, admin); + + vaultImplementation = vaultImplementation_; + depositTokenImplementation = depositTokenImplementation_; + debtTokenImplementation = debtTokenImplementation_; + ledger = ILedger(ledger_); + entityRegistry = entityRegistry_; + collateralAdapter = collateralAdapter_; + eMoneyJoin = eMoneyJoin_; + } + + /** + * @notice Create a new vault for a regulated entity + * @param owner Vault owner address + * @param entity Regulated entity address + * @param asset Collateral asset address (for deposit token) + * @param currency eMoney currency address (for debt token) + * @return vault Address of created vault + * @return depositToken Address of deposit token + * @return debtToken Address of debt token + */ + function createVault( + address owner, + address entity, + address asset, + address currency + ) external onlyRole(VAULT_DEPLOYER_ROLE) returns ( + address vault, + address depositToken, + address debtToken + ) { + require(owner != address(0), "VaultFactory: zero owner"); + require(entity != address(0), "VaultFactory: zero entity"); + + // Deploy vault directly (not using proxy for simplicity) + // In production, could use proxy pattern for upgradeability + Vault vaultContract = new Vault( + owner, + entity, + address(ledger), + entityRegistry, + collateralAdapter, + eMoneyJoin + ); + vault = address(vaultContract); + + // Deploy deposit token (factory as admin so it can grant MINTER/BURNER to vault) + bytes memory depositTokenInitData = abi.encodeWithSelector( + DepositToken.initialize.selector, + string(abi.encodePacked("Deposit ", _getAssetSymbol(asset))), + string(abi.encodePacked("d", _getAssetSymbol(asset))), + vault, + asset, + address(this) + ); + + ERC1967Proxy depositTokenProxy = new ERC1967Proxy(depositTokenImplementation, depositTokenInitData); + depositToken = address(depositTokenProxy); + + // Grant minter/burner roles to vault + DepositToken(depositToken).grantRole(keccak256("MINTER_ROLE"), vault); + DepositToken(depositToken).grantRole(keccak256("BURNER_ROLE"), vault); + + // Deploy debt token (factory as admin so it can grant MINTER/BURNER to vault) + bytes memory debtTokenInitData = abi.encodeWithSelector( + DebtToken.initialize.selector, + string(abi.encodePacked("Debt ", _getCurrencySymbol(currency))), + string(abi.encodePacked("debt", _getCurrencySymbol(currency))), + vault, + currency, + address(this) + ); + + ERC1967Proxy debtTokenProxy = new ERC1967Proxy(debtTokenImplementation, debtTokenInitData); + debtToken = address(debtTokenProxy); + + // Grant minter/burner roles to vault + DebtToken(debtToken).grantRole(keccak256("MINTER_ROLE"), vault); + DebtToken(debtToken).grantRole(keccak256("BURNER_ROLE"), vault); + + // Configure vault with tokens (cast via payable since Vault has receive()) + Vault(payable(vault)).setDepositToken(asset, depositToken); + Vault(payable(vault)).setDebtToken(currency, debtToken); + + // Grant vault role in ledger + ledger.grantVaultRole(vault); + + // Track vault + vaultsByEntity[entity].push(vault); + vaultToEntity[vault] = entity; + + emit VaultCreated(vault, entity, owner, depositToken, debtToken); + } + + /** + * @notice Create a vault with explicit decimals and debt transferability (DEX-ready) + * @param depositDecimals Deposit token decimals (e.g. 6 for stablecoins; 0 = 18) + * @param debtDecimals Debt token decimals (0 = 18) + * @param debtTransferable If true, debt token is freely transferable (DEX-ready) + */ + function createVaultWithDecimals( + address owner, + address entity, + address asset, + address currency, + uint8 depositDecimals, + uint8 debtDecimals, + bool debtTransferable + ) external onlyRole(VAULT_DEPLOYER_ROLE) returns ( + address vault, + address depositToken, + address debtToken + ) { + require(owner != address(0), "VaultFactory: zero owner"); + require(entity != address(0), "VaultFactory: zero entity"); + + Vault vaultContract = new Vault( + owner, + entity, + address(ledger), + entityRegistry, + collateralAdapter, + eMoneyJoin + ); + vault = address(vaultContract); + + uint8 dDec = depositDecimals > 0 ? depositDecimals : 18; + bytes memory depositTokenInitData = abi.encodeWithSelector( + DepositToken.initializeWithDecimals.selector, + string(abi.encodePacked("Deposit ", _getAssetSymbol(asset))), + string(abi.encodePacked("d", _getAssetSymbol(asset))), + vault, + asset, + address(this), + dDec + ); + + ERC1967Proxy depositTokenProxy = new ERC1967Proxy(depositTokenImplementation, depositTokenInitData); + depositToken = address(depositTokenProxy); + + DepositToken(depositToken).grantRole(keccak256("MINTER_ROLE"), vault); + DepositToken(depositToken).grantRole(keccak256("BURNER_ROLE"), vault); + + uint8 debtDec = debtDecimals > 0 ? debtDecimals : 18; + bytes memory debtTokenInitData = abi.encodeWithSelector( + DebtToken.initializeFull.selector, + string(abi.encodePacked("Debt ", _getCurrencySymbol(currency))), + string(abi.encodePacked("debt", _getCurrencySymbol(currency))), + vault, + currency, + address(this), + debtDec, + debtTransferable + ); + + ERC1967Proxy debtTokenProxy = new ERC1967Proxy(debtTokenImplementation, debtTokenInitData); + debtToken = address(debtTokenProxy); + + DebtToken(debtToken).grantRole(keccak256("MINTER_ROLE"), vault); + DebtToken(debtToken).grantRole(keccak256("BURNER_ROLE"), vault); + + Vault(payable(vault)).setDepositToken(asset, depositToken); + Vault(payable(vault)).setDebtToken(currency, debtToken); + + ledger.grantVaultRole(vault); + + vaultsByEntity[entity].push(vault); + vaultToEntity[vault] = entity; + + emit VaultCreated(vault, entity, owner, depositToken, debtToken); + } + + /** + * @notice Get asset symbol (helper) + * @param asset Asset address + * @return symbol Asset symbol + */ + function _getAssetSymbol(address asset) internal pure returns (string memory symbol) { + if (asset == address(0)) { + return "ETH"; + } + // In production, would fetch from ERC20 + return "ASSET"; + } + + /** + * @notice Get currency symbol (helper) + * @param currency Currency address + * @return symbol Currency symbol + */ + function _getCurrencySymbol(address currency) internal pure returns (string memory symbol) { + // In production, would fetch from eMoney token + return "CURRENCY"; + } + + /** + * @notice Get vaults for an entity + * @param entity Entity address + * @return vaults Array of vault addresses + */ + function getVaultsByEntity(address entity) external view returns (address[] memory vaults) { + return vaultsByEntity[entity]; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/XAUOracle.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/XAUOracle.sol new file mode 100644 index 0000000..be56788 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/XAUOracle.sol @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "./interfaces/IXAUOracle.sol"; +import "../oracle/IAggregator.sol"; + +/** + * @title XAUOracle + * @notice Multi-source oracle aggregator for ETH/XAU pricing with safety margins + * @dev Aggregates prices from multiple Aggregator feeds + * + * COMPLIANCE NOTES: + * - XAU (Gold) is the ISO 4217 commodity code used as universal unit of account + * - All currency conversions in the system MUST triangulate through XAU + * - XAU is NOT legal tender, but serves as the normalization standard + */ +contract XAUOracle is IXAUOracle, AccessControl, Pausable { + bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); + bytes32 public constant FEED_MANAGER_ROLE = keccak256("FEED_MANAGER_ROLE"); + + struct PriceFeed { + address feed; + uint256 weight; // in basis points (10000 = 100%) + bool active; + } + + PriceFeed[] private _priceFeeds; + mapping(address => uint256) private _feedIndex; // feed address => index + 1 (0 means not found) + mapping(address => bool) private _isFeed; + + uint256 public constant BASIS_POINTS = 10000; + uint256 public constant SAFETY_MARGIN_BPS = 500; // 5% safety margin for liquidations + uint256 public constant PRICE_DECIMALS = 18; + + uint256 private _lastPrice; + uint256 private _lastUpdate; + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ADMIN_ROLE, admin); + _grantRole(FEED_MANAGER_ROLE, admin); + } + + /** + * @notice Get ETH price in XAU + * @return price ETH price in XAU (18 decimals) + * @return timestamp Last update timestamp + */ + function getETHPriceInXAU() external view override returns (uint256 price, uint256 timestamp) { + require(!paused(), "XAUOracle: paused"); + require(_lastUpdate > 0, "XAUOracle: no price data"); + + return (_lastPrice, _lastUpdate); + } + + /** + * @notice Get liquidation price for a vault (with safety margin) + * @param vault Vault address (not used in current implementation, reserved for future use) + * @return price Liquidation threshold price in XAU + */ + function getLiquidationPrice(address vault) external view override returns (uint256 price) { + require(!paused(), "XAUOracle: paused"); + require(_lastUpdate > 0, "XAUOracle: no price data"); + + // Apply safety margin: liquidation price = current price * (1 - safety margin) + price = (_lastPrice * (BASIS_POINTS - SAFETY_MARGIN_BPS)) / BASIS_POINTS; + } + + /** + * @notice Update price from aggregated feeds + * @dev Can be called by anyone, but typically called by keeper + */ + function updatePrice() external whenNotPaused { + require(_priceFeeds.length > 0, "XAUOracle: no feeds"); + + uint256 totalWeight = 0; + uint256 weightedSum = 0; + + for (uint256 i = 0; i < _priceFeeds.length; i++) { + if (!_priceFeeds[i].active) continue; + + IAggregator feed = IAggregator(_priceFeeds[i].feed); + (, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData(); + + require(answer > 0, "XAUOracle: invalid price"); + require(updatedAt > 0, "XAUOracle: stale price"); + + // Check price staleness (30 seconds) + require(block.timestamp - updatedAt <= 30, "XAUOracle: stale price"); + + uint256 price = uint256(answer); + // Convert from feed decimals to 18 decimals + uint8 feedDecimals = feed.decimals(); + if (feedDecimals < PRICE_DECIMALS) { + price = price * (10 ** (PRICE_DECIMALS - feedDecimals)); + } else if (feedDecimals > PRICE_DECIMALS) { + price = price / (10 ** (feedDecimals - PRICE_DECIMALS)); + } + + weightedSum += price * _priceFeeds[i].weight; + totalWeight += _priceFeeds[i].weight; + } + + require(totalWeight > 0, "XAUOracle: no active feeds"); + + uint256 aggregatedPrice = weightedSum / totalWeight; + _lastPrice = aggregatedPrice; + _lastUpdate = block.timestamp; + + emit PriceUpdated(aggregatedPrice, block.timestamp); + } + + /** + * @notice Add a price feed source + * @param feed Price feed address (must implement Aggregator interface) + * @param weight Weight for this feed (in basis points) + */ + function addPriceFeed(address feed, uint256 weight) external onlyRole(FEED_MANAGER_ROLE) { + require(feed != address(0), "XAUOracle: zero feed"); + require(weight > 0 && weight <= BASIS_POINTS, "XAUOracle: invalid weight"); + require(!_isFeed[feed], "XAUOracle: feed already exists"); + + _priceFeeds.push(PriceFeed({ + feed: feed, + weight: weight, + active: true + })); + _feedIndex[feed] = _priceFeeds.length; // index + 1 + _isFeed[feed] = true; + + emit PriceFeedAdded(feed, weight); + } + + /** + * @notice Remove a price feed source + * @param feed Price feed address to remove + */ + function removePriceFeed(address feed) external onlyRole(FEED_MANAGER_ROLE) { + require(_isFeed[feed], "XAUOracle: feed not found"); + + uint256 index = _feedIndex[feed] - 1; + _priceFeeds[index].active = false; + _isFeed[feed] = false; + _feedIndex[feed] = 0; + + emit PriceFeedRemoved(feed); + } + + /** + * @notice Update feed weight + * @param feed Price feed address + * @param weight New weight + */ + function updateFeedWeight(address feed, uint256 weight) external onlyRole(FEED_MANAGER_ROLE) { + require(_isFeed[feed], "XAUOracle: feed not found"); + require(weight > 0 && weight <= BASIS_POINTS, "XAUOracle: invalid weight"); + + uint256 index = _feedIndex[feed] - 1; + uint256 oldWeight = _priceFeeds[index].weight; + _priceFeeds[index].weight = weight; + + emit FeedWeightUpdated(feed, oldWeight, weight); + } + + /** + * @notice Freeze oracle (emergency) + */ + function freeze() external onlyRole(ADMIN_ROLE) { + _pause(); + emit OracleFrozen(block.timestamp); + } + + /** + * @notice Unfreeze oracle + */ + function unfreeze() external onlyRole(ADMIN_ROLE) { + _unpause(); + emit OracleUnfrozen(block.timestamp); + } + + /** + * @notice Check if oracle is frozen + * @return frozen True if frozen + */ + function isFrozen() external view override returns (bool) { + return paused(); + } + + /** + * @notice Get all price feeds + * @return feeds Array of price feed structs + */ + function getPriceFeeds() external view returns (PriceFeed[] memory feeds) { + return _priceFeeds; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/adapters/CollateralAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/adapters/CollateralAdapter.sol new file mode 100644 index 0000000..f21a55a --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/adapters/CollateralAdapter.sol @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../interfaces/ICollateralAdapter.sol"; +import "../interfaces/ILedger.sol"; + +/** + * @title CollateralAdapter + * @notice Handles M0 collateral deposits and withdrawals + * @dev Only callable by Vaults, only accepts approved assets + */ +contract CollateralAdapter is ICollateralAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant VAULT_ROLE = keccak256("VAULT_ROLE"); + bytes32 public constant LIQUIDATOR_ROLE = keccak256("LIQUIDATOR_ROLE"); + + ILedger public ledger; + mapping(address => bool) public approvedAssets; + + constructor(address admin, address ledger_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + ledger = ILedger(ledger_); + } + + /** + * @notice Deposit M0 collateral + * @param vault Vault address + * @param asset Collateral asset address (address(0) for native ETH) + * @param amount Amount to deposit + */ + function deposit(address vault, address asset, uint256 amount) external payable override nonReentrant onlyRole(VAULT_ROLE) { + require(approvedAssets[asset] || asset == address(0), "CollateralAdapter: asset not approved"); + require(amount > 0, "CollateralAdapter: zero amount"); + + if (asset == address(0)) { + // Native ETH deposit + require(msg.value == amount, "CollateralAdapter: value mismatch"); + // ETH is held by this contract + } else { + // ERC20 token deposit + require(msg.value == 0, "CollateralAdapter: unexpected ETH"); + IERC20(asset).safeTransferFrom(msg.sender, address(this), amount); + } + + // Update ledger + ledger.modifyCollateral(vault, asset, int256(amount)); + + emit CollateralDeposited(vault, asset, amount); + } + + /** + * @notice Withdraw M0 collateral + * @param vault Vault address + * @param asset Collateral asset address + * @param amount Amount to withdraw + */ + function withdraw(address vault, address asset, uint256 amount) external override nonReentrant onlyRole(VAULT_ROLE) { + require(amount > 0, "CollateralAdapter: zero amount"); + + // Update ledger (will revert if insufficient collateral) + ledger.modifyCollateral(vault, asset, -int256(amount)); + + if (asset == address(0)) { + // Native ETH withdrawal + (bool success, ) = payable(vault).call{value: amount}(""); + require(success, "CollateralAdapter: ETH transfer failed"); + } else { + // ERC20 token withdrawal + IERC20(asset).safeTransfer(vault, amount); + } + + emit CollateralWithdrawn(vault, asset, amount); + } + + /** + * @notice Seize collateral during liquidation + * @param vault Vault address + * @param asset Collateral asset address + * @param amount Amount to seize + * @param liquidator Liquidator address + */ + function seize(address vault, address asset, uint256 amount, address liquidator) external override nonReentrant onlyRole(LIQUIDATOR_ROLE) { + require(amount > 0, "CollateralAdapter: zero amount"); + require(liquidator != address(0), "CollateralAdapter: zero liquidator"); + + // Update ledger + ledger.modifyCollateral(vault, asset, -int256(amount)); + + if (asset == address(0)) { + // Native ETH seizure + (bool success, ) = payable(liquidator).call{value: amount}(""); + require(success, "CollateralAdapter: ETH transfer failed"); + } else { + // ERC20 token seizure + IERC20(asset).safeTransfer(liquidator, amount); + } + + emit CollateralSeized(vault, asset, amount, liquidator); + } + + /** + * @notice Approve an asset for collateral + * @param asset Asset address + */ + function approveAsset(address asset) external onlyRole(DEFAULT_ADMIN_ROLE) { + approvedAssets[asset] = true; + } + + /** + * @notice Revoke asset approval + * @param asset Asset address + */ + function revokeAsset(address asset) external onlyRole(DEFAULT_ADMIN_ROLE) { + approvedAssets[asset] = false; + } + + /** + * @notice Set ledger address + * @param ledger_ New ledger address + */ + function setLedger(address ledger_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(ledger_ != address(0), "CollateralAdapter: zero address"); + ledger = ILedger(ledger_); + } + + // Allow contract to receive ETH + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/adapters/PMMPriceProvider.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/adapters/PMMPriceProvider.sol new file mode 100644 index 0000000..c5bb062 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/adapters/PMMPriceProvider.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../../dex/DODOPMMIntegration.sol"; + +/** + * @title PMMPriceProvider + * @notice Provides asset price in quote token using DODO PMM pool (oracle-backed when configured) + * @dev Used for vault collateral valuation or off-chain reporting when asset is a PMM pair token. + * Ledger uses XAUOracle for primary valuation; this adapter can be used by a future + * Ledger extension or by keepers/UIs to get PMM-based price (e.g. cUSDT/cUSDC in USD terms). + */ +contract PMMPriceProvider { + DODOPMMIntegration public immutable pmmIntegration; + + constructor(address pmmIntegration_) { + require(pmmIntegration_ != address(0), "PMMPriceProvider: zero address"); + pmmIntegration = DODOPMMIntegration(pmmIntegration_); + } + + /** + * @notice Get price of asset in terms of quoteToken (18 decimals: quoteToken per 1 unit of asset) + * @param asset Asset to price (e.g. cUSDT) + * @param quoteToken Quote token (e.g. USDT or cUSDC) + * @return price Price in 18 decimals (1e18 = 1:1 for stablecoins); 0 if no pool + */ + function getPrice(address asset, address quoteToken) external view returns (uint256 price) { + if (asset == quoteToken) return 1e18; + + address pool = pmmIntegration.pools(asset, quoteToken); + if (pool == address(0)) { + pool = pmmIntegration.pools(quoteToken, asset); + if (pool == address(0)) return 0; + // asset is quote, quoteToken is base: price = 1e36 / basePerQuote + uint256 basePerQuote = pmmIntegration.getPoolPriceOrOracle(pool); + if (basePerQuote == 0) return 0; + return (1e36) / basePerQuote; + } + // asset is base, quoteToken is quote + return pmmIntegration.getPoolPriceOrOracle(pool); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/adapters/eMoneyJoin.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/adapters/eMoneyJoin.sol new file mode 100644 index 0000000..1eb11d7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/adapters/eMoneyJoin.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../interfaces/IeMoneyJoin.sol"; +import "../../emoney/interfaces/IeMoneyToken.sol"; + +/** + * @title eMoneyJoin + * @notice Adapter for minting and burning eMoney tokens + * @dev Mint/burn restricted to this adapter, transfer restricted via Compliance Registry + */ +contract eMoneyJoin is IeMoneyJoin, AccessControl, ReentrancyGuard { + bytes32 public constant VAULT_ROLE = keccak256("VAULT_ROLE"); + + mapping(address => bool) public approvedCurrencies; + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + /** + * @notice Mint eMoney to a borrower + * @param currency eMoney currency address + * @param to Recipient address + * @param amount Amount to mint + */ + function mint(address currency, address to, uint256 amount) external override nonReentrant onlyRole(VAULT_ROLE) { + require(approvedCurrencies[currency], "eMoneyJoin: currency not approved"); + require(to != address(0), "eMoneyJoin: zero address"); + require(amount > 0, "eMoneyJoin: zero amount"); + + IeMoneyToken token = IeMoneyToken(currency); + token.mint(to, amount, keccak256("VAULT_BORROW")); + + emit eMoneyMinted(currency, to, amount); + } + + /** + * @notice Burn eMoney from a repayer + * @param currency eMoney currency address + * @param from Source address + * @param amount Amount to burn + */ + function burn(address currency, address from, uint256 amount) external override nonReentrant onlyRole(VAULT_ROLE) { + require(approvedCurrencies[currency], "eMoneyJoin: currency not approved"); + require(amount > 0, "eMoneyJoin: zero amount"); + + IeMoneyToken token = IeMoneyToken(currency); + token.burn(from, amount, keccak256("VAULT_REPAY")); + + emit eMoneyBurned(currency, from, amount); + } + + /** + * @notice Approve a currency for eMoney operations + * @param currency Currency address + */ + function approveCurrency(address currency) external onlyRole(DEFAULT_ADMIN_ROLE) { + approvedCurrencies[currency] = true; + } + + /** + * @notice Revoke currency approval + * @param currency Currency address + */ + function revokeCurrency(address currency) external onlyRole(DEFAULT_ADMIN_ROLE) { + approvedCurrencies[currency] = false; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/errors/VaultErrors.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/errors/VaultErrors.sol new file mode 100644 index 0000000..327f1ad --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/errors/VaultErrors.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @notice Custom errors for vault system + */ +error ZeroAddress(); +error ZeroAmount(); +error AssetNotRegistered(); +error AssetNotApproved(); +error CurrencyNotApproved(); +error InsufficientCollateral(); +error InsufficientDebt(); +error InsufficientDepositTokens(); +error BorrowNotAllowed(bytes32 reasonCode); +error VaultNotLiquidatable(); +error EntityNotRegistered(); +error EntitySuspended(); +error NotAuthorized(); +error NotEligible(); +error BelowMinCollateralization(); +error DebtCeilingExceeded(); +error InvalidLiquidationRatio(); +error InvalidCreditMultiplier(); +error InvalidWeight(); +error FeedNotFound(); +error StalePrice(); +error InvalidPrice(); +error Paused(); diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/ICollateralAdapter.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/ICollateralAdapter.sol new file mode 100644 index 0000000..367ab94 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/ICollateralAdapter.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ICollateralAdapter + * @notice Interface for Collateral Adapter + * @dev Handles M0 collateral deposits and withdrawals + */ +interface ICollateralAdapter { + /** + * @notice Deposit M0 collateral + * @param vault Vault address + * @param asset Collateral asset address + * @param amount Amount to deposit + */ + function deposit(address vault, address asset, uint256 amount) external payable; + + /** + * @notice Withdraw M0 collateral + * @param vault Vault address + * @param asset Collateral asset address + * @param amount Amount to withdraw + */ + function withdraw(address vault, address asset, uint256 amount) external; + + /** + * @notice Seize collateral during liquidation + * @param vault Vault address + * @param asset Collateral asset address + * @param amount Amount to seize + * @param liquidator Liquidator address + */ + function seize(address vault, address asset, uint256 amount, address liquidator) external; + + event CollateralDeposited(address indexed vault, address indexed asset, uint256 amount); + event CollateralWithdrawn(address indexed vault, address indexed asset, uint256 amount); + event CollateralSeized(address indexed vault, address indexed asset, uint256 amount, address indexed liquidator); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/ILedger.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/ILedger.sol new file mode 100644 index 0000000..413c8f6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/ILedger.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ILedger + * @notice Interface for the Core Ledger contract + * @dev Single source of truth for collateral and debt balances + */ +interface ILedger { + /** + * @notice Modify collateral balance for a vault + * @param vault Vault address + * @param asset Collateral asset address + * @param delta Amount to add (positive) or subtract (negative) + */ + function modifyCollateral(address vault, address asset, int256 delta) external; + + /** + * @notice Modify debt balance for a vault + * @param vault Vault address + * @param currency Debt currency address (eMoney token) + * @param delta Amount to add (positive) or subtract (negative) + */ + function modifyDebt(address vault, address currency, int256 delta) external; + + /** + * @notice Get vault health (collateralization ratio in XAU) + * @param vault Vault address + * @return healthRatio Collateralization ratio in basis points (10000 = 100%) + * @return collateralValue Total collateral value in XAU (18 decimals) + * @return debtValue Total debt value in XAU (18 decimals) + */ + function getVaultHealth(address vault) external view returns ( + uint256 healthRatio, + uint256 collateralValue, + uint256 debtValue + ); + + /** + * @notice Check if a vault can borrow a specific amount + * @param vault Vault address + * @param currency Debt currency address + * @param amount Amount to borrow (in currency units) + * @return canBorrow True if borrow is allowed + * @return reasonCode Reason code if borrow is not allowed + */ + function canBorrow(address vault, address currency, uint256 amount) external view returns ( + bool canBorrow, + bytes32 reasonCode + ); + + /** + * @notice Get collateral balance for a vault + * @param vault Vault address + * @param asset Collateral asset address + * @return balance Collateral balance + */ + function collateral(address vault, address asset) external view returns (uint256); + + /** + * @notice Get debt balance for a vault + * @param vault Vault address + * @param currency Debt currency address + * @return balance Debt balance + */ + function debt(address vault, address currency) external view returns (uint256); + + /** + * @notice Get debt ceiling for an asset + * @param asset Asset address + * @return ceiling Debt ceiling + */ + function debtCeiling(address asset) external view returns (uint256); + + /** + * @notice Get liquidation ratio for an asset + * @param asset Asset address + * @return ratio Liquidation ratio in basis points + */ + function liquidationRatio(address asset) external view returns (uint256); + + /** + * @notice Get credit multiplier for an asset + * @param asset Asset address + * @return multiplier Credit multiplier in basis points (50000 = 5x) + */ + function creditMultiplier(address asset) external view returns (uint256); + + /** + * @notice Get rate accumulator for an asset + * @param asset Asset address + * @return accumulator Rate accumulator + */ + function rateAccumulator(address asset) external view returns (uint256); + + /** + * @notice Set risk parameters for an asset + * @param asset Asset address + * @param debtCeiling_ Debt ceiling + * @param liquidationRatio_ Liquidation ratio in basis points + * @param creditMultiplier_ Credit multiplier in basis points + */ + function setRiskParameters( + address asset, + uint256 debtCeiling_, + uint256 liquidationRatio_, + uint256 creditMultiplier_ + ) external; + + /** + * @notice Grant VAULT_ROLE to an address (for factory use) + * @param account Address to grant role to + */ + function grantVaultRole(address account) external; + + event CollateralModified(address indexed vault, address indexed asset, int256 delta); + event DebtModified(address indexed vault, address indexed currency, int256 delta); + event RiskParametersSet(address indexed asset, uint256 debtCeiling, uint256 liquidationRatio, uint256 creditMultiplier); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/ILiquidation.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/ILiquidation.sol new file mode 100644 index 0000000..529011b --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/ILiquidation.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ILiquidation + * @notice Interface for Liquidation Module + * @dev Handles liquidation of undercollateralized vaults + */ +interface ILiquidation { + /** + * @notice Liquidate an undercollateralized vault + * @param vault Vault address to liquidate + * @param currency Debt currency address + * @param maxDebt Maximum debt to liquidate + * @return seizedCollateral Amount of collateral seized + * @return repaidDebt Amount of debt repaid + */ + function liquidate( + address vault, + address currency, + uint256 maxDebt + ) external returns (uint256 seizedCollateral, uint256 repaidDebt); + + /** + * @notice Check if a vault can be liquidated + * @param vault Vault address + * @return canLiquidate True if vault can be liquidated + * @return healthRatio Current health ratio in basis points + */ + function canLiquidate(address vault) external view returns (bool canLiquidate, uint256 healthRatio); + + /** + * @notice Get liquidation bonus (penalty) + * @return bonus Liquidation bonus in basis points + */ + function liquidationBonus() external view returns (uint256); + + event VaultLiquidated( + address indexed vault, + address indexed currency, + uint256 seizedCollateral, + uint256 repaidDebt, + address indexed liquidator + ); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IRateAccrual.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IRateAccrual.sol new file mode 100644 index 0000000..7dc3680 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IRateAccrual.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IRateAccrual + * @notice Interface for Rate & Accrual Module + * @dev Applies time-based interest to outstanding debt + */ +interface IRateAccrual { + /** + * @notice Accrue interest for an asset + * @param asset Asset address + * @return newAccumulator Updated rate accumulator + */ + function accrueInterest(address asset) external returns (uint256 newAccumulator); + + /** + * @notice Get current rate accumulator for an asset + * @param asset Asset address + * @return accumulator Current rate accumulator + */ + function getRateAccumulator(address asset) external view returns (uint256 accumulator); + + /** + * @notice Set interest rate for an asset + * @param asset Asset address + * @param rate Annual interest rate in basis points (e.g., 500 = 5%) + */ + function setInterestRate(address asset, uint256 rate) external; + + /** + * @notice Get interest rate for an asset + * @param asset Asset address + * @return rate Annual interest rate in basis points + */ + function interestRate(address asset) external view returns (uint256); + + /** + * @notice Calculate debt with accrued interest + * @param asset Asset address + * @param principal Principal debt amount + * @return debtWithInterest Debt amount with accrued interest + */ + function calculateDebtWithInterest(address asset, uint256 principal) external view returns (uint256 debtWithInterest); + + event InterestAccrued(address indexed asset, uint256 oldAccumulator, uint256 newAccumulator); + event InterestRateSet(address indexed asset, uint256 rate); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IRegulatedEntityRegistry.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IRegulatedEntityRegistry.sol new file mode 100644 index 0000000..5fb0cc7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IRegulatedEntityRegistry.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IRegulatedEntityRegistry + * @notice Interface for Regulated Entity Registry + * @dev Tracks regulated financial entities eligible for vault operations + */ +interface IRegulatedEntityRegistry { + /** + * @notice Register a regulated entity + * @param entity Entity address + * @param jurisdictionHash Hash of jurisdiction identifier + * @param authorizedWallets Initial authorized wallets + */ + function registerEntity( + address entity, + bytes32 jurisdictionHash, + address[] calldata authorizedWallets + ) external; + + /** + * @notice Check if an entity is registered and eligible + * @param entity Entity address + * @return isEligible True if entity is registered and not suspended + */ + function isEligible(address entity) external view returns (bool); + + /** + * @notice Check if a wallet is authorized for an entity + * @param entity Entity address + * @param wallet Wallet address + * @return isAuthorized True if wallet is authorized + */ + function isAuthorized(address entity, address wallet) external view returns (bool); + + /** + * @notice Check if an address is an operator for an entity + * @param entity Entity address + * @param operator Operator address + * @return isOperator True if address is an operator + */ + function isOperator(address entity, address operator) external view returns (bool); + + /** + * @notice Add authorized wallet to an entity + * @param entity Entity address + * @param wallet Wallet address to authorize + */ + function addAuthorizedWallet(address entity, address wallet) external; + + /** + * @notice Remove authorized wallet from an entity + * @param entity Entity address + * @param wallet Wallet address to remove + */ + function removeAuthorizedWallet(address entity, address wallet) external; + + /** + * @notice Set operator status for an entity + * @param entity Entity address + * @param operator Operator address + * @param status True to grant operator status, false to revoke + */ + function setOperator(address entity, address operator, bool status) external; + + /** + * @notice Suspend an entity + * @param entity Entity address + */ + function suspendEntity(address entity) external; + + /** + * @notice Unsuspend an entity + * @param entity Entity address + */ + function unsuspendEntity(address entity) external; + + /** + * @notice Get entity information + * @param entity Entity address + * @return registered True if entity is registered + * @return suspended True if entity is suspended + * @return jurisdictionHash Jurisdiction hash + * @return authorizedWallets List of authorized wallets + */ + function getEntity(address entity) external view returns ( + bool registered, + bool suspended, + bytes32 jurisdictionHash, + address[] memory authorizedWallets + ); + + event EntityRegistered(address indexed entity, bytes32 jurisdictionHash, uint256 timestamp); + event EntitySuspended(address indexed entity, uint256 timestamp); + event EntityUnsuspended(address indexed entity, uint256 timestamp); + event AuthorizedWalletAdded(address indexed entity, address indexed wallet); + event AuthorizedWalletRemoved(address indexed entity, address indexed wallet); + event OperatorSet(address indexed entity, address indexed operator, bool status); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IVault.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IVault.sol new file mode 100644 index 0000000..f9aa5ec --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IVault.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IVault + * @notice Interface for Vault contract + * @dev Aave-style vault operations (deposit, borrow, repay, withdraw) + */ +interface IVault { + /** + * @notice Deposit M0 collateral into vault + * @param asset Collateral asset address + * @param amount Amount to deposit + */ + function deposit(address asset, uint256 amount) external payable; + + /** + * @notice Borrow eMoney against collateral + * @param currency eMoney currency address + * @param amount Amount to borrow + */ + function borrow(address currency, uint256 amount) external; + + /** + * @notice Repay borrowed eMoney + * @param currency eMoney currency address + * @param amount Amount to repay + */ + function repay(address currency, uint256 amount) external; + + /** + * @notice Withdraw collateral from vault + * @param asset Collateral asset address + * @param amount Amount to withdraw + */ + function withdraw(address asset, uint256 amount) external; + + /** + * @notice Get vault owner + * @return owner Vault owner address + */ + function owner() external view returns (address); + + /** + * @notice Get vault health + * @return healthRatio Collateralization ratio in basis points + * @return collateralValue Total collateral value in XAU + * @return debtValue Total debt value in XAU + */ + function getHealth() external view returns ( + uint256 healthRatio, + uint256 collateralValue, + uint256 debtValue + ); + + event Deposited(address indexed asset, uint256 amount, address indexed depositor); + event Borrowed(address indexed currency, uint256 amount, address indexed borrower); + event Repaid(address indexed currency, uint256 amount, address indexed repayer); + event Withdrawn(address indexed asset, uint256 amount, address indexed withdrawer); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IVaultStrategy.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IVaultStrategy.sol new file mode 100644 index 0000000..190790b --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IVaultStrategy.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IVaultStrategy + * @notice Interface for vault strategies (deferred implementation) + * @dev Defined now for forward compatibility + */ +interface IVaultStrategy { + function onDeposit(address token, uint256 amount) external; + function onWithdraw(address token, uint256 amount) external; + function onBridgePending(address token, uint256 amount, uint256 estimatedWait) external; + function execute(bytes calldata strategyData) external; + function getStrategyType() external pure returns (string memory); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IXAUOracle.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IXAUOracle.sol new file mode 100644 index 0000000..e91b68d --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IXAUOracle.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IXAUOracle + * @notice Interface for XAU Oracle Module + * @dev Multi-source oracle aggregator for ETH/XAU pricing + */ +interface IXAUOracle { + /** + * @notice Get ETH price in XAU + * @return price ETH price in XAU (18 decimals) + * @return timestamp Last update timestamp + */ + function getETHPriceInXAU() external view returns (uint256 price, uint256 timestamp); + + /** + * @notice Get liquidation price for a vault + * @param vault Vault address + * @return price Liquidation threshold price in XAU + */ + function getLiquidationPrice(address vault) external view returns (uint256 price); + + /** + * @notice Add a price feed source + * @param feed Price feed address (must implement Aggregator interface) + * @param weight Weight for this feed (sum of all weights should be 10000) + */ + function addPriceFeed(address feed, uint256 weight) external; + + /** + * @notice Remove a price feed source + * @param feed Price feed address to remove + */ + function removePriceFeed(address feed) external; + + /** + * @notice Update feed weight + * @param feed Price feed address + * @param weight New weight + */ + function updateFeedWeight(address feed, uint256 weight) external; + + /** + * @notice Freeze oracle (emergency) + */ + function freeze() external; + + /** + * @notice Unfreeze oracle + */ + function unfreeze() external; + + /** + * @notice Check if oracle is frozen + * @return frozen True if frozen + */ + function isFrozen() external view returns (bool); + + event PriceFeedAdded(address indexed feed, uint256 weight); + event PriceFeedRemoved(address indexed feed); + event FeedWeightUpdated(address indexed feed, uint256 oldWeight, uint256 newWeight); + event OracleFrozen(uint256 timestamp); + event OracleUnfrozen(uint256 timestamp); + event PriceUpdated(uint256 price, uint256 timestamp); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IeMoneyJoin.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IeMoneyJoin.sol new file mode 100644 index 0000000..3992e85 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/interfaces/IeMoneyJoin.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IeMoneyJoin + * @notice Interface for eMoney Join Adapter + * @dev Handles minting and burning of eMoney tokens + */ +interface IeMoneyJoin { + /** + * @notice Mint eMoney to a borrower + * @param currency eMoney currency address + * @param to Recipient address + * @param amount Amount to mint + */ + function mint(address currency, address to, uint256 amount) external; + + /** + * @notice Burn eMoney from a repayer + * @param currency eMoney currency address + * @param from Source address + * @param amount Amount to burn + */ + function burn(address currency, address from, uint256 amount) external; + + event eMoneyMinted(address indexed currency, address indexed to, uint256 amount); + event eMoneyBurned(address indexed currency, address indexed from, uint256 amount); +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/CurrencyValidation.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/CurrencyValidation.sol new file mode 100644 index 0000000..44f7e1b --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/CurrencyValidation.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title CurrencyValidation + * @notice Library for validating currency codes and types according to ISO 4217 compliance + * @dev Ensures all currency references are either ISO 4217 compliant or explicitly identified as non-ISO + */ +library CurrencyValidation { + /** + * @notice Currency type enumeration + */ + enum CurrencyType { + ISO4217_FIAT, // Standard ISO 4217 fiat currency (USD, EUR, etc.) + ISO4217_CRYPTO, // ISO 4217 cryptocurrency code (if applicable) + NON_ISO_SYNTHETIC, // Non-ISO synthetic unit of account (e.g., GRU) + NON_ISO_INTERNAL, // Non-ISO internal accounting unit + COMMODITY // Commodity code (XAU, XAG, etc.) + } + + /** + * @notice Validate ISO 4217 currency code format + * @dev ISO 4217 codes are exactly 3 uppercase letters + * @param code Currency code to validate + * @return isValid True if code matches ISO 4217 format + */ + function isValidISO4217Format(string memory code) internal pure returns (bool isValid) { + bytes memory codeBytes = bytes(code); + if (codeBytes.length != 3) { + return false; + } + + for (uint256 i = 0; i < 3; i++) { + uint8 char = uint8(codeBytes[i]); + if (char < 65 || char > 90) { // Not A-Z + return false; + } + } + + return true; + } + + /** + * @notice Check if currency code is a recognized ISO 4217 code + * @dev This is a simplified check - in production, maintain a full registry + * @param code Currency code + * @return isISO4217 True if code is recognized ISO 4217 + */ + function isISO4217Currency(string memory code) internal pure returns (bool isISO4217) { + if (!isValidISO4217Format(code)) { + return false; + } + + // Common ISO 4217 codes (extend as needed) + bytes32 codeHash = keccak256(bytes(code)); + + // Major currencies + if (codeHash == keccak256("USD") || // US Dollar + codeHash == keccak256("EUR") || // Euro + codeHash == keccak256("GBP") || // British Pound + codeHash == keccak256("JPY") || // Japanese Yen + codeHash == keccak256("CNY") || // Chinese Yuan + codeHash == keccak256("CHF") || // Swiss Franc + codeHash == keccak256("CAD") || // Canadian Dollar + codeHash == keccak256("AUD") || // Australian Dollar + codeHash == keccak256("NZD") || // New Zealand Dollar + codeHash == keccak256("SGD")) { // Singapore Dollar + return true; + } + + // In production, maintain a full registry or use oracle/external validation + return false; + } + + /** + * @notice Check if code is GRU (Global Reserve Unit) + * @dev GRU is a non-ISO 4217 synthetic unit of account + * @param code Currency code + * @return isGRU True if code is GRU + */ + function isGRU(string memory code) internal pure returns (bool isGRU) { + bytes32 codeHash = keccak256(bytes(code)); + return codeHash == keccak256("GRU") || + codeHash == keccak256("M00") || + codeHash == keccak256("M0") || + codeHash == keccak256("M1"); + } + + /** + * @notice Check if code is XAU (Gold) + * @dev XAU is the ISO 4217 commodity code for gold + * @param code Currency code + * @return isXAU True if code is XAU + */ + function isXAU(string memory code) internal pure returns (bool isXAU) { + return keccak256(bytes(code)) == keccak256("XAU"); + } + + /** + * @notice Get currency type + * @param code Currency code + * @return currencyType Type of currency + */ + function getCurrencyType(string memory code) internal pure returns (CurrencyType currencyType) { + if (isXAU(code)) { + return CurrencyType.COMMODITY; + } + + if (isGRU(code)) { + return CurrencyType.NON_ISO_SYNTHETIC; + } + + if (isISO4217Currency(code)) { + return CurrencyType.ISO4217_FIAT; + } + + // If format is valid but not recognized, treat as potentially valid ISO 4217 + if (isValidISO4217Format(code)) { + return CurrencyType.ISO4217_FIAT; // Assume valid but not in our list + } + + return CurrencyType.NON_ISO_INTERNAL; + } + + /** + * @notice Validate that currency is legal tender (ISO 4217 fiat) + * @param code Currency code + * @return isLegalTender True if currency is ISO 4217 legal tender + */ + function isLegalTender(string memory code) internal pure returns (bool isLegalTender) { + CurrencyType currencyType = getCurrencyType(code); + return currencyType == CurrencyType.ISO4217_FIAT; + } + + /** + * @notice Require currency to be legal tender or revert + * @param code Currency code + */ + function requireLegalTender(string memory code) internal pure { + require(isLegalTender(code), "CurrencyValidation: not legal tender - must be ISO 4217"); + } + + /** + * @notice Require currency to NOT be legal tender (for synthetic units) + * @param code Currency code + */ + function requireNonLegalTender(string memory code) internal pure { + require(!isLegalTender(code), "CurrencyValidation: must be non-legal tender"); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/GRUConstants.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/GRUConstants.sol new file mode 100644 index 0000000..0a5deb4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/GRUConstants.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title GRUConstants + * @notice Constants and utilities for Global Reserve Unit (GRU) + * @dev GRU is a NON-ISO 4217 synthetic unit of account, NOT legal tender + * + * MANDATORY COMPLIANCE: + * - GRU SHALL NOT be treated as fiat currency + * - GRU SHALL be explicitly identified as synthetic unit of account + * - All GRU triangulations MUST be conducted through XAU + * - GRU relationships MUST be enforced exactly: 1 M00 GRU = 5 M0 GRU = 25 M1 GRU + */ +library GRUConstants { + /** + * @notice GRU is NOT an ISO 4217 currency + * @dev This constant explicitly identifies GRU as non-ISO + */ + string public constant GRU_CURRENCY_CODE = "GRU"; // Non-ISO 4217 synthetic unit of account + + /** + * @notice GRU monetary layers + */ + string public constant GRU_M00 = "M00"; // Base layer (non-ISO) + string public constant GRU_M0 = "M0"; // Collateral layer (non-ISO) + string public constant GRU_M1 = "M1"; // Credit layer (non-ISO) + + /** + * @notice GRU conversion ratios (MANDATORY - must be enforced exactly) + * @dev 1 M00 GRU = 5 M0 GRU = 25 M1 GRU + */ + uint256 public constant M00_TO_M0_RATIO = 5; // 1 M00 = 5 M0 + uint256 public constant M00_TO_M1_RATIO = 25; // 1 M00 = 25 M1 + uint256 public constant M0_TO_M1_RATIO = 5; // 1 M0 = 5 M1 + + /** + * @notice Decimals for GRU calculations (18 decimals for precision) + */ + uint256 public constant GRU_DECIMALS = 1e18; + + /** + * @notice Convert M00 GRU to M0 GRU + * @param m00Amount Amount in M00 GRU (18 decimals) + * @return m0Amount Amount in M0 GRU (18 decimals) + */ + function m00ToM0(uint256 m00Amount) internal pure returns (uint256 m0Amount) { + return (m00Amount * M00_TO_M0_RATIO * GRU_DECIMALS) / GRU_DECIMALS; + } + + /** + * @notice Convert M00 GRU to M1 GRU + * @param m00Amount Amount in M00 GRU (18 decimals) + * @return m1Amount Amount in M1 GRU (18 decimals) + */ + function m00ToM1(uint256 m00Amount) internal pure returns (uint256 m1Amount) { + return (m00Amount * M00_TO_M1_RATIO * GRU_DECIMALS) / GRU_DECIMALS; + } + + /** + * @notice Convert M0 GRU to M1 GRU + * @param m0Amount Amount in M0 GRU (18 decimals) + * @return m1Amount Amount in M1 GRU (18 decimals) + */ + function m0ToM1(uint256 m0Amount) internal pure returns (uint256 m1Amount) { + return (m0Amount * M0_TO_M1_RATIO * GRU_DECIMALS) / GRU_DECIMALS; + } + + /** + * @notice Convert M0 GRU to M00 GRU + * @param m0Amount Amount in M0 GRU (18 decimals) + * @return m00Amount Amount in M00 GRU (18 decimals) + */ + function m0ToM00(uint256 m0Amount) internal pure returns (uint256 m00Amount) { + return (m0Amount * GRU_DECIMALS) / (M00_TO_M0_RATIO * GRU_DECIMALS); + } + + /** + * @notice Convert M1 GRU to M00 GRU + * @param m1Amount Amount in M1 GRU (18 decimals) + * @return m00Amount Amount in M00 GRU (18 decimals) + */ + function m1ToM00(uint256 m1Amount) internal pure returns (uint256 m00Amount) { + return (m1Amount * GRU_DECIMALS) / (M00_TO_M1_RATIO * GRU_DECIMALS); + } + + /** + * @notice Convert M1 GRU to M0 GRU + * @param m1Amount Amount in M1 GRU (18 decimals) + * @return m0Amount Amount in M0 GRU (18 decimals) + */ + function m1ToM0(uint256 m1Amount) internal pure returns (uint256 m0Amount) { + return (m1Amount * GRU_DECIMALS) / (M0_TO_M1_RATIO * GRU_DECIMALS); + } + + /** + * @notice Validate GRU layer code + * @param layerCode Layer code to validate + * @return isValid True if valid GRU layer + */ + function isValidGRULayer(string memory layerCode) internal pure returns (bool isValid) { + bytes32 codeHash = keccak256(bytes(layerCode)); + return codeHash == keccak256(bytes(GRU_M00)) || + codeHash == keccak256(bytes(GRU_M0)) || + codeHash == keccak256(bytes(GRU_M1)) || + codeHash == keccak256(bytes(GRU_CURRENCY_CODE)); + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/MonetaryFormulas.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/MonetaryFormulas.sol new file mode 100644 index 0000000..4f45f71 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/MonetaryFormulas.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title MonetaryFormulas + * @notice Implementation of mandatory monetary formulas + * @dev All formulas MUST be applied exactly as specified without modification + * + * Formulas: + * - Money Supply: M = C + D and M = MB × m + * - Money Velocity: V = PQ / M + * - Money Multiplier: m = 1 / r and m = (1 + c) / (r + c) + */ +library MonetaryFormulas { + /** + * @notice Calculate money supply: M = C + D + * @dev M = Money Supply, C = Currency, D = Deposits + * @param currency Currency component (C) + * @param deposits Deposits component (D) + * @return moneySupply Money supply (M) + */ + function calculateMoneySupply(uint256 currency, uint256 deposits) internal pure returns (uint256 moneySupply) { + return currency + deposits; + } + + /** + * @notice Calculate money supply: M = MB × m + * @dev M = Money Supply, MB = Monetary Base, m = Money Multiplier + * @param monetaryBase Monetary base (MB) + * @param moneyMultiplier Money multiplier (m) + * @return moneySupply Money supply (M) + */ + function calculateMoneySupplyFromMultiplier(uint256 monetaryBase, uint256 moneyMultiplier) internal pure returns (uint256 moneySupply) { + return (monetaryBase * moneyMultiplier) / 1e18; // Assuming multiplier in 18 decimals + } + + /** + * @notice Calculate money velocity: V = PQ / M + * @dev V = Velocity, P = Price Level, Q = Quantity of Goods, M = Money Supply + * @param priceLevel Price level (P) + * @param quantityOfGoods Quantity of goods (Q) + * @param moneySupply Money supply (M) + * @return velocity Money velocity (V) + */ + function calculateMoneyVelocity(uint256 priceLevel, uint256 quantityOfGoods, uint256 moneySupply) internal pure returns (uint256 velocity) { + if (moneySupply == 0) { + return 0; + } + return (priceLevel * quantityOfGoods) / moneySupply; + } + + /** + * @notice Calculate simple money multiplier: m = 1 / r + * @dev m = Money Multiplier, r = Reserve Ratio + * @param reserveRatio Reserve ratio (r) in basis points (e.g., 1000 = 10%) + * @return moneyMultiplier Money multiplier (m) in 18 decimals + */ + function calculateSimpleMoneyMultiplier(uint256 reserveRatio) internal pure returns (uint256 moneyMultiplier) { + require(reserveRatio > 0, "MonetaryFormulas: reserve ratio must be positive"); + require(reserveRatio <= 10000, "MonetaryFormulas: reserve ratio cannot exceed 100%"); + + // m = 1 / r, where r is in basis points + // Convert to 18 decimals: m = (1e18 * 10000) / reserveRatio + return (1e18 * 10000) / reserveRatio; + } + + /** + * @notice Calculate money multiplier with currency ratio: m = (1 + c) / (r + c) + * @dev m = Money Multiplier, r = Reserve Ratio, c = Currency Ratio + * @param reserveRatio Reserve ratio (r) in basis points + * @param currencyRatio Currency ratio (c) in basis points + * @return moneyMultiplier Money multiplier (m) in 18 decimals + */ + function calculateMoneyMultiplierWithCurrency(uint256 reserveRatio, uint256 currencyRatio) internal pure returns (uint256 moneyMultiplier) { + require(reserveRatio > 0, "MonetaryFormulas: reserve ratio must be positive"); + require(reserveRatio <= 10000, "MonetaryFormulas: reserve ratio cannot exceed 100%"); + require(currencyRatio <= 10000, "MonetaryFormulas: currency ratio cannot exceed 100%"); + + // m = (1 + c) / (r + c), where r and c are in basis points + // Convert to 18 decimals: m = (1e18 * (10000 + currencyRatio)) / (reserveRatio + currencyRatio) + uint256 numerator = 1e18 * (10000 + currencyRatio); + uint256 denominator = reserveRatio + currencyRatio; + + require(denominator > 0, "MonetaryFormulas: invalid denominator"); + return numerator / denominator; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/XAUTriangulation.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/XAUTriangulation.sol new file mode 100644 index 0000000..438bdd6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/libraries/XAUTriangulation.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title XAUTriangulation + * @notice Library for enforcing XAU triangulation for all currency conversions + * @dev MANDATORY: All currency conversions MUST go through XAU (gold) + * + * Triangulation formula: + * CurrencyA → XAU → CurrencyB + * + * Steps: + * 1. Convert CurrencyA to XAU: xauAmount = currencyAAmount / xauRateA + * 2. Convert XAU to CurrencyB: currencyBAmount = xauAmount * xauRateB + */ +library XAUTriangulation { + /** + * @notice Triangulate from Currency A to Currency B via XAU + * @dev All conversions MUST go through XAU - this is mandatory + * @param currencyAAmount Amount in Currency A (18 decimals) + * @param xauRateA Rate: 1 oz XAU = xauRateA units of Currency A (18 decimals) + * @param xauRateB Rate: 1 oz XAU = xauRateB units of Currency B (18 decimals) + * @return currencyBAmount Amount in Currency B (18 decimals) + */ + function triangulate( + uint256 currencyAAmount, + uint256 xauRateA, + uint256 xauRateB + ) internal pure returns (uint256 currencyBAmount) { + require(xauRateA > 0, "XAUTriangulation: invalid XAU rate A"); + require(xauRateB > 0, "XAUTriangulation: invalid XAU rate B"); + + // Step 1: Convert Currency A to XAU + // xauAmount = currencyAAmount / xauRateA + uint256 xauAmount = (currencyAAmount * 1e18) / xauRateA; + + // Step 2: Convert XAU to Currency B + // currencyBAmount = xauAmount * xauRateB / 1e18 + currencyBAmount = (xauAmount * xauRateB) / 1e18; + } + + /** + * @notice Convert amount to XAU + * @param amount Amount to convert (18 decimals) + * @param xauRate Rate: 1 oz XAU = xauRate units (18 decimals) + * @return xauAmount Amount in XAU (18 decimals) + */ + function toXAU(uint256 amount, uint256 xauRate) internal pure returns (uint256 xauAmount) { + require(xauRate > 0, "XAUTriangulation: invalid XAU rate"); + xauAmount = (amount * 1e18) / xauRate; + } + + /** + * @notice Convert XAU amount to currency + * @param xauAmount Amount in XAU (18 decimals) + * @param xauRate Rate: 1 oz XAU = xauRate units (18 decimals) + * @return currencyAmount Amount in currency (18 decimals) + */ + function fromXAU(uint256 xauAmount, uint256 xauRate) internal pure returns (uint256 currencyAmount) { + require(xauRate > 0, "XAUTriangulation: invalid XAU rate"); + currencyAmount = (xauAmount * xauRate) / 1e18; + } +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/tokens/DebtToken.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/tokens/DebtToken.sol new file mode 100644 index 0000000..2d70779 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/tokens/DebtToken.sol @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../../emoney/interfaces/IeMoneyToken.sol"; + +/** + * @title DebtToken + * @notice Token representing outstanding debt obligation (dToken equivalent) + * @dev Minted when borrow occurs, burned on repayment + * Interest-accruing, non-freely transferable + * Extends eMoneyToken pattern + */ +contract DebtToken is Initializable, ERC20Upgradeable, AccessControlUpgradeable, UUPSUpgradeable { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + + address public vault; + address public currency; // eMoney currency address + uint8 private _decimalsStorage; + bool private _transferable; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /** + * @notice Initialize the debt token (5-arg for backward compatibility; decimals=18, not transferable) + */ + function initialize( + string memory name, + string memory symbol, + address vault_, + address currency_, + address admin + ) external initializer { + _initializeFull(name, symbol, vault_, currency_, admin, 18, false); + } + + /** + * @notice Initialize with decimals and transferability (ERC-20; optionally DEX-transferable) + * @param decimals_ Token decimals (e.g. 6 for stablecoins; 0 = use 18) + * @param transferable_ If true, full ERC-20 transfers allowed (DEX-ready) + */ + function initializeFull( + string memory name, + string memory symbol, + address vault_, + address currency_, + address admin, + uint8 decimals_, + bool transferable_ + ) external initializer { + _initializeFull(name, symbol, vault_, currency_, admin, decimals_ > 0 ? decimals_ : 18, transferable_); + } + + function _initializeFull( + string memory name, + string memory symbol, + address vault_, + address currency_, + address admin, + uint8 decimals_, + bool transferable_ + ) internal { + __ERC20_init(name, symbol); + __AccessControl_init(); + __UUPSUpgradeable_init(); + vault = vault_; + currency = currency_; + _decimalsStorage = decimals_; + _transferable = transferable_; + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + /** + * @notice Returns token decimals (matches underlying for DEX compatibility) + */ + function decimals() public view override returns (uint8) { + return _decimalsStorage; + } + + function isTransferable() external view returns (bool) { + return _transferable; + } + + /** + * @notice Mint debt tokens (only by vault) + * @param to Recipient address + * @param amount Amount to mint + */ + function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) { + _mint(to, amount); + } + + /** + * @notice Burn debt tokens (only by vault) + * @param from Source address + * @param amount Amount to burn + */ + function burn(address from, uint256 amount) external onlyRole(BURNER_ROLE) { + _burn(from, amount); + } + + /** + * @notice Override transfer: when transferable, full ERC-20; else mint/burn/vault only + */ + function _update(address from, address to, uint256 amount) internal virtual override { + if (from == address(0) || to == address(0)) { + super._update(from, to, amount); + return; + } + if (_transferable) { + super._update(from, to, amount); + return; + } + if (from == vault || to == vault) { + super._update(from, to, amount); + return; + } + revert("DebtToken: transfers not allowed"); + } + + /** + * @notice Authorize upgrade (UUPS) + */ + function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/contracts/vault/tokens/DepositToken.sol b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/tokens/DepositToken.sol new file mode 100644 index 0000000..064416d --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/contracts/vault/tokens/DepositToken.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../../emoney/interfaces/IeMoneyToken.sol"; + +/** + * @title DepositToken + * @notice Token representing supplied collateral position (aToken equivalent) + * @dev Minted when M0 collateral is deposited, burned on withdrawal + * Extends eMoneyToken pattern but simpler - no policy manager, just mint/burn control + */ +contract DepositToken is Initializable, ERC20Upgradeable, AccessControlUpgradeable, UUPSUpgradeable { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + + address public vault; + address public collateralAsset; + uint8 private _decimalsStorage; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /** + * @notice Initialize the deposit token (5-arg for backward compatibility; decimals = 18) + */ + function initialize( + string memory name, + string memory symbol, + address vault_, + address collateralAsset_, + address admin + ) external initializer { + _initializeWithDecimals(name, symbol, vault_, collateralAsset_, admin, 18); + } + + /** + * @notice Initialize with explicit decimals (ERC-20 DEX-ready; decimals match underlying) + * @param decimals_ Token decimals (e.g. 6 for stablecoins) + */ + function initializeWithDecimals( + string memory name, + string memory symbol, + address vault_, + address collateralAsset_, + address admin, + uint8 decimals_ + ) external initializer { + _initializeWithDecimals(name, symbol, vault_, collateralAsset_, admin, decimals_ > 0 ? decimals_ : 18); + } + + function _initializeWithDecimals( + string memory name, + string memory symbol, + address vault_, + address collateralAsset_, + address admin, + uint8 decimals_ + ) internal { + __ERC20_init(name, symbol); + __AccessControl_init(); + __UUPSUpgradeable_init(); + vault = vault_; + collateralAsset = collateralAsset_; + _decimalsStorage = decimals_; + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + /** + * @notice Returns token decimals (matches underlying for DEX compatibility) + */ + function decimals() public view override returns (uint8) { + return _decimalsStorage; + } + + /** + * @notice Mint deposit tokens (only by vault) + * @param to Recipient address + * @param amount Amount to mint + */ + function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) { + _mint(to, amount); + } + + /** + * @notice Burn deposit tokens (only by vault) + * @param from Source address + * @param amount Amount to burn + */ + function burn(address from, uint256 amount) external onlyRole(BURNER_ROLE) { + _burn(from, amount); + } + + /** + * @notice Authorize upgrade (UUPS) + */ + function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/verification-sources/chain138-buildinfo-1511f33/foundry.toml b/verification-sources/chain138-buildinfo-1511f33/foundry.toml new file mode 100644 index 0000000..b399b24 --- /dev/null +++ b/verification-sources/chain138-buildinfo-1511f33/foundry.toml @@ -0,0 +1,11 @@ +[profile.default] +src = "." +out = "out" +cache_path = "cache" +libs = [] +solc = "0.8.20" +optimizer = true +optimizer_runs = 200 +via_ir = true +evm_version = "paris" +auto_detect_remappings = false diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol new file mode 100644 index 0000000..6955b35 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol) + +pragma solidity ^0.8.20; + +import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import {ERC165Upgradeable} from "../utils/introspection/ERC165Upgradeable.sol"; +import {Initializable} from "../proxy/utils/Initializable.sol"; + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ```solidity + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ```solidity + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} + * to enforce additional security measures for this role. + */ +abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControl, ERC165Upgradeable { + struct RoleData { + mapping(address account => bool) hasRole; + bytes32 adminRole; + } + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + + /// @custom:storage-location erc7201:openzeppelin.storage.AccessControl + struct AccessControlStorage { + mapping(bytes32 role => RoleData) _roles; + } + + // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControl")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant AccessControlStorageLocation = 0x02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800; + + function _getAccessControlStorage() private pure returns (AccessControlStorage storage $) { + assembly { + $.slot := AccessControlStorageLocation + } + } + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with an {AccessControlUnauthorizedAccount} error including the required role. + */ + modifier onlyRole(bytes32 role) { + _checkRole(role); + _; + } + + function __AccessControl_init() internal onlyInitializing { + } + + function __AccessControl_init_unchained() internal onlyInitializing { + } + /// @inheritdoc IERC165 + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view virtual returns (bool) { + AccessControlStorage storage $ = _getAccessControlStorage(); + return $._roles[role].hasRole[account]; + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` + * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. + */ + function _checkRole(bytes32 role) internal view virtual { + _checkRole(role, _msgSender()); + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` + * is missing `role`. + */ + function _checkRole(bytes32 role, address account) internal view virtual { + if (!hasRole(role, account)) { + revert AccessControlUnauthorizedAccount(account, role); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { + AccessControlStorage storage $ = _getAccessControlStorage(); + return $._roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleGranted} event. + */ + function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleRevoked} event. + */ + function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been revoked `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + * + * May emit a {RoleRevoked} event. + */ + function renounceRole(bytes32 role, address callerConfirmation) public virtual { + if (callerConfirmation != _msgSender()) { + revert AccessControlBadConfirmation(); + } + + _revokeRole(role, callerConfirmation); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + AccessControlStorage storage $ = _getAccessControlStorage(); + bytes32 previousAdminRole = getRoleAdmin(role); + $._roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + /** + * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. + * + * Internal function without access restriction. + * + * May emit a {RoleGranted} event. + */ + function _grantRole(bytes32 role, address account) internal virtual returns (bool) { + AccessControlStorage storage $ = _getAccessControlStorage(); + if (!hasRole(role, account)) { + $._roles[role].hasRole[account] = true; + emit RoleGranted(role, account, _msgSender()); + return true; + } else { + return false; + } + } + + /** + * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked. + * + * Internal function without access restriction. + * + * May emit a {RoleRevoked} event. + */ + function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { + AccessControlStorage storage $ = _getAccessControlStorage(); + if (hasRole(role, account)) { + $._roles[role].hasRole[account] = false; + emit RoleRevoked(role, account, _msgSender()); + return true; + } else { + return false; + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol new file mode 100644 index 0000000..0d05fdb --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol @@ -0,0 +1,238 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol) + +pragma solidity ^0.8.20; + +/** + * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed + * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an + * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer + * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. + * + * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be + * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in + * case an upgrade adds a module that needs to be initialized. + * + * For example: + * + * [.hljs-theme-light.nopadding] + * ```solidity + * contract MyToken is ERC20Upgradeable { + * function initialize() initializer public { + * __ERC20_init("MyToken", "MTK"); + * } + * } + * + * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { + * function initializeV2() reinitializer(2) public { + * __ERC20Permit_init("MyToken"); + * } + * } + * ``` + * + * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as + * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. + * + * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure + * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. + * + * [CAUTION] + * ==== + * Avoid leaving a contract uninitialized. + * + * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation + * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke + * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: + * + * [.hljs-theme-light.nopadding] + * ``` + * /// @custom:oz-upgrades-unsafe-allow constructor + * constructor() { + * _disableInitializers(); + * } + * ``` + * ==== + */ +abstract contract Initializable { + /** + * @dev Storage of the initializable contract. + * + * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions + * when using with upgradeable contracts. + * + * @custom:storage-location erc7201:openzeppelin.storage.Initializable + */ + struct InitializableStorage { + /** + * @dev Indicates that the contract has been initialized. + */ + uint64 _initialized; + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool _initializing; + } + + // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; + + /** + * @dev The contract is already initialized. + */ + error InvalidInitialization(); + + /** + * @dev The contract is not initializing. + */ + error NotInitializing(); + + /** + * @dev Triggered when the contract has been initialized or reinitialized. + */ + event Initialized(uint64 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. + * + * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any + * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in + * production. + * + * Emits an {Initialized} event. + */ + modifier initializer() { + // solhint-disable-next-line var-name-mixedcase + InitializableStorage storage $ = _getInitializableStorage(); + + // Cache values to avoid duplicated sloads + bool isTopLevelCall = !$._initializing; + uint64 initialized = $._initialized; + + // Allowed calls: + // - initialSetup: the contract is not in the initializing state and no previous version was + // initialized + // - construction: the contract is initialized at version 1 (no reinitialization) and the + // current contract is just being deployed + bool initialSetup = initialized == 0 && isTopLevelCall; + bool construction = initialized == 1 && address(this).code.length == 0; + + if (!initialSetup && !construction) { + revert InvalidInitialization(); + } + $._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. + * + * 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. + * + * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` + * cannot be nested. If one is invoked in the context of another, execution will revert. + * + * 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. + * + * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. + * + * Emits an {Initialized} event. + */ + modifier reinitializer(uint64 version) { + // solhint-disable-next-line var-name-mixedcase + InitializableStorage storage $ = _getInitializableStorage(); + + if ($._initializing || $._initialized >= version) { + revert InvalidInitialization(); + } + $._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() { + _checkInitializing(); + _; + } + + /** + * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. + */ + function _checkInitializing() internal view virtual { + if (!_isInitializing()) { + revert NotInitializing(); + } + } + + /** + * @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. + * + * Emits an {Initialized} event the first time it is successfully executed. + */ + function _disableInitializers() internal virtual { + // solhint-disable-next-line var-name-mixedcase + InitializableStorage storage $ = _getInitializableStorage(); + + if ($._initializing) { + revert InvalidInitialization(); + } + if ($._initialized != type(uint64).max) { + $._initialized = type(uint64).max; + emit Initialized(type(uint64).max); + } + } + + /** + * @dev Returns the highest version that has been initialized. See {reinitializer}. + */ + function _getInitializedVersion() internal view returns (uint64) { + return _getInitializableStorage()._initialized; + } + + /** + * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. + */ + function _isInitializing() internal view returns (bool) { + return _getInitializableStorage()._initializing; + } + + /** + * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location. + * + * NOTE: Consider following the ERC-7201 formula to derive storage locations. + */ + function _initializableStorageSlot() internal pure virtual returns (bytes32) { + return INITIALIZABLE_STORAGE; + } + + /** + * @dev Returns a pointer to the storage namespace. + */ + // solhint-disable-next-line var-name-mixedcase + function _getInitializableStorage() private pure returns (InitializableStorage storage $) { + bytes32 slot = _initializableStorageSlot(); + assembly { + $.slot := slot + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol new file mode 100644 index 0000000..d1b4a32 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/UUPSUpgradeable.sol) + +pragma solidity ^0.8.22; + +import {IERC1822Proxiable} from "@openzeppelin/contracts/interfaces/draft-IERC1822.sol"; +import {ERC1967Utils} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol"; +import {Initializable} from "./Initializable.sol"; + +/** + * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an + * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. + * + * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is + * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing + * `UUPSUpgradeable` with a custom implementation of upgrades. + * + * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. + */ +abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable { + /// @custom:oz-upgrades-unsafe-allow state-variable-immutable + address private immutable __self = address(this); + + /** + * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)` + * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called, + * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string. + * If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must + * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function + * during an upgrade. + */ + string public constant UPGRADE_INTERFACE_VERSION = "5.0.0"; + + /** + * @dev The call is from an unauthorized context. + */ + error UUPSUnauthorizedCallContext(); + + /** + * @dev The storage `slot` is unsupported as a UUID. + */ + error UUPSUnsupportedProxiableUUID(bytes32 slot); + + /** + * @dev Check that the execution is being performed through a delegatecall call and that the execution context is + * a proxy contract with an implementation (as defined in ERC-1967) pointing to self. This should only be the case + * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a + * function through ERC-1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to + * fail. + */ + modifier onlyProxy() { + _checkProxy(); + _; + } + + /** + * @dev Check that the execution is not being performed through a delegate call. This allows a function to be + * callable on the implementing contract but not through proxies. + */ + modifier notDelegated() { + _checkNotDelegated(); + _; + } + + function __UUPSUpgradeable_init() internal onlyInitializing { + } + + function __UUPSUpgradeable_init_unchained() internal onlyInitializing { + } + /** + * @dev Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the + * implementation. It is used to validate the implementation's compatibility when performing an upgrade. + * + * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks + * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this + * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. + */ + function proxiableUUID() external view virtual notDelegated returns (bytes32) { + return ERC1967Utils.IMPLEMENTATION_SLOT; + } + + /** + * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call + * encoded in `data`. + * + * Calls {_authorizeUpgrade}. + * + * Emits an {Upgraded} event. + * + * @custom:oz-upgrades-unsafe-allow-reachable delegatecall + */ + function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { + _authorizeUpgrade(newImplementation); + _upgradeToAndCallUUPS(newImplementation, data); + } + + /** + * @dev Reverts if the execution is not performed via delegatecall or the execution + * context is not of a proxy with an ERC-1967 compliant implementation pointing to self. + */ + function _checkProxy() internal view virtual { + if ( + address(this) == __self || // Must be called through delegatecall + ERC1967Utils.getImplementation() != __self // Must be called through an active proxy + ) { + revert UUPSUnauthorizedCallContext(); + } + } + + /** + * @dev Reverts if the execution is performed via delegatecall. + * See {notDelegated}. + */ + function _checkNotDelegated() internal view virtual { + if (address(this) != __self) { + // Must not be called through delegatecall + revert UUPSUnauthorizedCallContext(); + } + } + + /** + * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by + * {upgradeToAndCall}. + * + * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. + * + * ```solidity + * function _authorizeUpgrade(address) internal onlyOwner {} + * ``` + */ + function _authorizeUpgrade(address newImplementation) internal virtual; + + /** + * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call. + * + * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value + * is expected to be the implementation slot in ERC-1967. + * + * Emits an {IERC1967-Upgraded} event. + */ + function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private { + try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { + if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) { + revert UUPSUnsupportedProxiableUUID(slot); + } + ERC1967Utils.upgradeToAndCall(newImplementation, data); + } catch { + // The implementation is not UUPS + revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation); + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol new file mode 100644 index 0000000..0c36cf1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol @@ -0,0 +1,330 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol) + +pragma solidity ^0.8.20; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {ContextUpgradeable} from "../../utils/ContextUpgradeable.sol"; +import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; +import {Initializable} from "../../proxy/utils/Initializable.sol"; + +/** + * @dev Implementation of the {IERC20} interface. + * + * This implementation is agnostic to the way tokens are created. This means + * that a supply mechanism has to be added in a derived contract using {_mint}. + * + * TIP: For a detailed writeup see our guide + * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * The default value of {decimals} is 18. To change this, you should override + * this function so it returns a different value. + * + * We have followed general OpenZeppelin Contracts guidelines: functions revert + * instead returning `false` on failure. This behavior is nonetheless + * conventional and does not conflict with the expectations of ERC-20 + * applications. + */ +abstract contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors { + /// @custom:storage-location erc7201:openzeppelin.storage.ERC20 + struct ERC20Storage { + mapping(address account => uint256) _balances; + + mapping(address account => mapping(address spender => uint256)) _allowances; + + uint256 _totalSupply; + + string _name; + string _symbol; + } + + // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00; + + function _getERC20Storage() private pure returns (ERC20Storage storage $) { + assembly { + $.slot := ERC20StorageLocation + } + } + + /** + * @dev Sets the values for {name} and {symbol}. + * + * Both values are immutable: they can only be set once during construction. + */ + function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { + __ERC20_init_unchained(name_, symbol_); + } + + function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { + ERC20Storage storage $ = _getERC20Storage(); + $._name = name_; + $._symbol = symbol_; + } + + /** + * @dev Returns the name of the token. + */ + function name() public view virtual returns (string memory) { + ERC20Storage storage $ = _getERC20Storage(); + return $._name; + } + + /** + * @dev Returns the symbol of the token, usually a shorter version of the + * name. + */ + function symbol() public view virtual returns (string memory) { + ERC20Storage storage $ = _getERC20Storage(); + return $._symbol; + } + + /** + * @dev Returns the number of decimals used to get its user representation. + * For example, if `decimals` equals `2`, a balance of `505` tokens should + * be displayed to a user as `5.05` (`505 / 10 ** 2`). + * + * Tokens usually opt for a value of 18, imitating the relationship between + * Ether and Wei. This is the default value returned by this function, unless + * it's overridden. + * + * NOTE: This information is only used for _display_ purposes: it in + * no way affects any of the arithmetic of the contract, including + * {IERC20-balanceOf} and {IERC20-transfer}. + */ + function decimals() public view virtual returns (uint8) { + return 18; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual returns (uint256) { + ERC20Storage storage $ = _getERC20Storage(); + return $._totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual returns (uint256) { + ERC20Storage storage $ = _getERC20Storage(); + return $._balances[account]; + } + + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `to` cannot be the zero address. + * - the caller must have a balance of at least `value`. + */ + function transfer(address to, uint256 value) public virtual returns (bool) { + address owner = _msgSender(); + _transfer(owner, to, value); + return true; + } + + /// @inheritdoc IERC20 + function allowance(address owner, address spender) public view virtual returns (uint256) { + ERC20Storage storage $ = _getERC20Storage(); + return $._allowances[owner][spender]; + } + + /** + * @dev See {IERC20-approve}. + * + * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on + * `transferFrom`. This is semantically equivalent to an infinite approval. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 value) public virtual returns (bool) { + address owner = _msgSender(); + _approve(owner, spender, value); + return true; + } + + /** + * @dev See {IERC20-transferFrom}. + * + * Skips emitting an {Approval} event indicating an allowance update. This is not + * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. + * + * NOTE: Does not update the allowance if the current allowance + * is the maximum `uint256`. + * + * Requirements: + * + * - `from` and `to` cannot be the zero address. + * - `from` must have a balance of at least `value`. + * - the caller must have allowance for ``from``'s tokens of at least + * `value`. + */ + function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { + address spender = _msgSender(); + _spendAllowance(from, spender, value); + _transfer(from, to, value); + return true; + } + + /** + * @dev Moves a `value` amount of tokens from `from` to `to`. + * + * This internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * NOTE: This function is not virtual, {_update} should be overridden instead. + */ + function _transfer(address from, address to, uint256 value) internal { + if (from == address(0)) { + revert ERC20InvalidSender(address(0)); + } + if (to == address(0)) { + revert ERC20InvalidReceiver(address(0)); + } + _update(from, to, value); + } + + /** + * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` + * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding + * this function. + * + * Emits a {Transfer} event. + */ + function _update(address from, address to, uint256 value) internal virtual { + ERC20Storage storage $ = _getERC20Storage(); + if (from == address(0)) { + // Overflow check required: The rest of the code assumes that totalSupply never overflows + $._totalSupply += value; + } else { + uint256 fromBalance = $._balances[from]; + if (fromBalance < value) { + revert ERC20InsufficientBalance(from, fromBalance, value); + } + unchecked { + // Overflow not possible: value <= fromBalance <= totalSupply. + $._balances[from] = fromBalance - value; + } + } + + if (to == address(0)) { + unchecked { + // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. + $._totalSupply -= value; + } + } else { + unchecked { + // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. + $._balances[to] += value; + } + } + + emit Transfer(from, to, value); + } + + /** + * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). + * Relies on the `_update` mechanism + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * NOTE: This function is not virtual, {_update} should be overridden instead. + */ + function _mint(address account, uint256 value) internal { + if (account == address(0)) { + revert ERC20InvalidReceiver(address(0)); + } + _update(address(0), account, value); + } + + /** + * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. + * Relies on the `_update` mechanism. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * NOTE: This function is not virtual, {_update} should be overridden instead + */ + function _burn(address account, uint256 value) internal { + if (account == address(0)) { + revert ERC20InvalidSender(address(0)); + } + _update(account, address(0), value); + } + + /** + * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens. + * + * This internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + * + * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. + */ + function _approve(address owner, address spender, uint256 value) internal { + _approve(owner, spender, value, true); + } + + /** + * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. + * + * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by + * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any + * `Approval` event during `transferFrom` operations. + * + * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to + * true using the following override: + * + * ```solidity + * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { + * super._approve(owner, spender, value, true); + * } + * ``` + * + * Requirements are the same as {_approve}. + */ + function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { + ERC20Storage storage $ = _getERC20Storage(); + if (owner == address(0)) { + revert ERC20InvalidApprover(address(0)); + } + if (spender == address(0)) { + revert ERC20InvalidSpender(address(0)); + } + $._allowances[owner][spender] = value; + if (emitEvent) { + emit Approval(owner, spender, value); + } + } + + /** + * @dev Updates `owner`'s allowance for `spender` based on spent `value`. + * + * Does not update the allowance value in case of infinite allowance. + * Revert if not enough allowance is available. + * + * Does not emit an {Approval} event. + */ + function _spendAllowance(address owner, address spender, uint256 value) internal virtual { + uint256 currentAllowance = allowance(owner, spender); + if (currentAllowance < type(uint256).max) { + if (currentAllowance < value) { + revert ERC20InsufficientAllowance(spender, currentAllowance, value); + } + unchecked { + _approve(owner, spender, currentAllowance - value, false); + } + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol new file mode 100644 index 0000000..5aa9b48 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) + +pragma solidity ^0.8.20; +import {Initializable} from "../proxy/utils/Initializable.sol"; + +/** + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +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; + } + + function _contextSuffixLength() internal view virtual returns (uint256) { + return 0; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol new file mode 100644 index 0000000..5c66d6f --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol) + +pragma solidity ^0.8.20; +import {Initializable} from "../proxy/utils/Initializable.sol"; + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, + * consider using {ReentrancyGuardTransient} instead. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuardUpgradeable is Initializable { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant NOT_ENTERED = 1; + uint256 private constant ENTERED = 2; + + /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard + struct ReentrancyGuardStorage { + uint256 _status; + } + + // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00; + + function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) { + assembly { + $.slot := ReentrancyGuardStorageLocation + } + } + + /** + * @dev Unauthorized reentrant call. + */ + error ReentrancyGuardReentrantCall(); + + function __ReentrancyGuard_init() internal onlyInitializing { + __ReentrancyGuard_init_unchained(); + } + + function __ReentrancyGuard_init_unchained() internal onlyInitializing { + ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); + $._status = NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and making it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + _nonReentrantBefore(); + _; + _nonReentrantAfter(); + } + + function _nonReentrantBefore() private { + ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); + // On the first call to nonReentrant, _status will be NOT_ENTERED + if ($._status == ENTERED) { + revert ReentrancyGuardReentrantCall(); + } + + // Any calls to nonReentrant after this point will fail + $._status = ENTERED; + } + + function _nonReentrantAfter() private { + ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + $._status = NOT_ENTERED; + } + + /** + * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a + * `nonReentrant` function in the call stack. + */ + function _reentrancyGuardEntered() internal view returns (bool) { + ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); + return $._status == ENTERED; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol new file mode 100644 index 0000000..296c4a1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import {Initializable} from "../../proxy/utils/Initializable.sol"; + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + */ +abstract contract ERC165Upgradeable is Initializable, IERC165 { + function __ERC165_init() internal onlyInitializing { + } + + function __ERC165_init_unchained() internal onlyInitializing { + } + /// @inheritdoc IERC165 + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/access/AccessControl.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/access/AccessControl.sol new file mode 100644 index 0000000..3e3341e --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/access/AccessControl.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) + +pragma solidity ^0.8.20; + +import {IAccessControl} from "./IAccessControl.sol"; +import {Context} from "../utils/Context.sol"; +import {ERC165} from "../utils/introspection/ERC165.sol"; + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ```solidity + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ```solidity + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} + * to enforce additional security measures for this role. + */ +abstract contract AccessControl is Context, IAccessControl, ERC165 { + struct RoleData { + mapping(address account => bool) hasRole; + bytes32 adminRole; + } + + mapping(bytes32 role => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with an {AccessControlUnauthorizedAccount} error including the required role. + */ + modifier onlyRole(bytes32 role) { + _checkRole(role); + _; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view virtual returns (bool) { + return _roles[role].hasRole[account]; + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` + * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. + */ + function _checkRole(bytes32 role) internal view virtual { + _checkRole(role, _msgSender()); + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` + * is missing `role`. + */ + function _checkRole(bytes32 role, address account) internal view virtual { + if (!hasRole(role, account)) { + revert AccessControlUnauthorizedAccount(account, role); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleGranted} event. + */ + function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleRevoked} event. + */ + function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been revoked `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + * + * May emit a {RoleRevoked} event. + */ + function renounceRole(bytes32 role, address callerConfirmation) public virtual { + if (callerConfirmation != _msgSender()) { + revert AccessControlBadConfirmation(); + } + + _revokeRole(role, callerConfirmation); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + /** + * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. + * + * Internal function without access restriction. + * + * May emit a {RoleGranted} event. + */ + function _grantRole(bytes32 role, address account) internal virtual returns (bool) { + if (!hasRole(role, account)) { + _roles[role].hasRole[account] = true; + emit RoleGranted(role, account, _msgSender()); + return true; + } else { + return false; + } + } + + /** + * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. + * + * Internal function without access restriction. + * + * May emit a {RoleRevoked} event. + */ + function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { + if (hasRole(role, account)) { + _roles[role].hasRole[account] = false; + emit RoleRevoked(role, account, _msgSender()); + return true; + } else { + return false; + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/access/IAccessControl.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/access/IAccessControl.sol new file mode 100644 index 0000000..2ac89ca --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/access/IAccessControl.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) + +pragma solidity ^0.8.20; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev The `account` is missing a role. + */ + error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); + + /** + * @dev The caller of a function is not the expected one. + * + * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. + */ + error AccessControlBadConfirmation(); + + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + */ + event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + */ + function renounceRole(bytes32 role, address callerConfirmation) external; +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/access/Ownable.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/access/Ownable.sol new file mode 100644 index 0000000..bd96f66 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/access/Ownable.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) + +pragma solidity ^0.8.20; + +import {Context} from "../utils/Context.sol"; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * The initial owner is set to the address provided by the deployer. This can + * later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +abstract contract Ownable is Context { + address private _owner; + + /** + * @dev The caller account is not authorized to perform an operation. + */ + error OwnableUnauthorizedAccount(address account); + + /** + * @dev The owner is not a valid owner account. (eg. `address(0)`) + */ + error OwnableInvalidOwner(address owner); + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the address provided by the deployer as the initial owner. + */ + constructor(address initialOwner) { + if (initialOwner == address(0)) { + revert OwnableInvalidOwner(address(0)); + } + _transferOwnership(initialOwner); + } + + /** + * @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 { + if (owner() != _msgSender()) { + revert OwnableUnauthorizedAccount(_msgSender()); + } + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby disabling 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 { + if (newOwner == address(0)) { + revert OwnableInvalidOwner(address(0)); + } + _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); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC165.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC165.sol new file mode 100644 index 0000000..944dd0d --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC165.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "../utils/introspection/IERC165.sol"; diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC4906.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC4906.sol new file mode 100644 index 0000000..bc008e3 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC4906.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "./IERC165.sol"; +import {IERC721} from "./IERC721.sol"; + +/// @title EIP-721 Metadata Update Extension +interface IERC4906 is IERC165, IERC721 { + /// @dev This event emits when the metadata of a token is changed. + /// So that the third-party platforms such as NFT market could + /// timely update the images and related attributes of the NFT. + event MetadataUpdate(uint256 _tokenId); + + /// @dev This event emits when the metadata of a range of tokens is changed. + /// So that the third-party platforms such as NFT market could + /// timely update the images and related attributes of the NFTs. + event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC5267.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC5267.sol new file mode 100644 index 0000000..47a9fd5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC5267.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol) + +pragma solidity ^0.8.20; + +interface IERC5267 { + /** + * @dev MAY be emitted to signal that the domain could have changed. + */ + event EIP712DomainChanged(); + + /** + * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 + * signature. + */ + function eip712Domain() + external + view + returns ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 salt, + uint256[] memory extensions + ); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC721.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC721.sol new file mode 100644 index 0000000..0ea735b --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/IERC721.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol) + +pragma solidity ^0.8.20; + +import {IERC721} from "../token/ERC721/IERC721.sol"; diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/draft-IERC1822.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/draft-IERC1822.sol new file mode 100644 index 0000000..4d0f0f8 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/draft-IERC1822.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol) + +pragma solidity ^0.8.20; + +/** + * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified + * proxy whose upgrades are fully controlled by the current implementation. + */ +interface IERC1822Proxiable { + /** + * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation + * address. + * + * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks + * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this + * function revert if invoked through a proxy. + */ + function proxiableUUID() external view returns (bytes32); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/draft-IERC6093.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/draft-IERC6093.sol new file mode 100644 index 0000000..f6990e6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/interfaces/draft-IERC6093.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) +pragma solidity ^0.8.20; + +/** + * @dev Standard ERC20 Errors + * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. + */ +interface IERC20Errors { + /** + * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + * @param balance Current balance for the interacting account. + * @param needed Minimum amount required to perform a transfer. + */ + error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); + + /** + * @dev Indicates a failure with the token `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + */ + error ERC20InvalidSender(address sender); + + /** + * @dev Indicates a failure with the token `receiver`. Used in transfers. + * @param receiver Address to which tokens are being transferred. + */ + error ERC20InvalidReceiver(address receiver); + + /** + * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. + * @param spender Address that may be allowed to operate on tokens without being their owner. + * @param allowance Amount of tokens a `spender` is allowed to operate with. + * @param needed Minimum amount required to perform a transfer. + */ + error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); + + /** + * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. + * @param approver Address initiating an approval operation. + */ + error ERC20InvalidApprover(address approver); + + /** + * @dev Indicates a failure with the `spender` to be approved. Used in approvals. + * @param spender Address that may be allowed to operate on tokens without being their owner. + */ + error ERC20InvalidSpender(address spender); +} + +/** + * @dev Standard ERC721 Errors + * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. + */ +interface IERC721Errors { + /** + * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. + * Used in balance queries. + * @param owner Address of the current owner of a token. + */ + error ERC721InvalidOwner(address owner); + + /** + * @dev Indicates a `tokenId` whose `owner` is the zero address. + * @param tokenId Identifier number of a token. + */ + error ERC721NonexistentToken(uint256 tokenId); + + /** + * @dev Indicates an error related to the ownership over a particular token. Used in transfers. + * @param sender Address whose tokens are being transferred. + * @param tokenId Identifier number of a token. + * @param owner Address of the current owner of a token. + */ + error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); + + /** + * @dev Indicates a failure with the token `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + */ + error ERC721InvalidSender(address sender); + + /** + * @dev Indicates a failure with the token `receiver`. Used in transfers. + * @param receiver Address to which tokens are being transferred. + */ + error ERC721InvalidReceiver(address receiver); + + /** + * @dev Indicates a failure with the `operator`’s approval. Used in transfers. + * @param operator Address that may be allowed to operate on tokens without being their owner. + * @param tokenId Identifier number of a token. + */ + error ERC721InsufficientApproval(address operator, uint256 tokenId); + + /** + * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. + * @param approver Address initiating an approval operation. + */ + error ERC721InvalidApprover(address approver); + + /** + * @dev Indicates a failure with the `operator` to be approved. Used in approvals. + * @param operator Address that may be allowed to operate on tokens without being their owner. + */ + error ERC721InvalidOperator(address operator); +} + +/** + * @dev Standard ERC1155 Errors + * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. + */ +interface IERC1155Errors { + /** + * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + * @param balance Current balance for the interacting account. + * @param needed Minimum amount required to perform a transfer. + * @param tokenId Identifier number of a token. + */ + error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); + + /** + * @dev Indicates a failure with the token `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + */ + error ERC1155InvalidSender(address sender); + + /** + * @dev Indicates a failure with the token `receiver`. Used in transfers. + * @param receiver Address to which tokens are being transferred. + */ + error ERC1155InvalidReceiver(address receiver); + + /** + * @dev Indicates a failure with the `operator`’s approval. Used in transfers. + * @param operator Address that may be allowed to operate on tokens without being their owner. + * @param owner Address of the current owner of a token. + */ + error ERC1155MissingApprovalForAll(address operator, address owner); + + /** + * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. + * @param approver Address initiating an approval operation. + */ + error ERC1155InvalidApprover(address approver); + + /** + * @dev Indicates a failure with the `operator` to be approved. Used in approvals. + * @param operator Address that may be allowed to operate on tokens without being their owner. + */ + error ERC1155InvalidOperator(address operator); + + /** + * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. + * Used in batch transfers. + * @param idsLength Length of the array of token identifiers + * @param valuesLength Length of the array of token amounts + */ + error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol new file mode 100644 index 0000000..0fa61b5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Proxy.sol) + +pragma solidity ^0.8.20; + +import {Proxy} from "../Proxy.sol"; +import {ERC1967Utils} from "./ERC1967Utils.sol"; + +/** + * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an + * implementation address that can be changed. This address is stored in storage in the location specified by + * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the + * implementation behind the proxy. + */ +contract ERC1967Proxy is Proxy { + /** + * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`. + * + * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an + * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor. + * + * Requirements: + * + * - If `data` is empty, `msg.value` must be zero. + */ + constructor(address implementation, bytes memory _data) payable { + ERC1967Utils.upgradeToAndCall(implementation, _data); + } + + /** + * @dev Returns the current implementation address. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using + * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` + */ + function _implementation() internal view virtual override returns (address) { + return ERC1967Utils.getImplementation(); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol new file mode 100644 index 0000000..e55bae2 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol @@ -0,0 +1,193 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol) + +pragma solidity ^0.8.20; + +import {IBeacon} from "../beacon/IBeacon.sol"; +import {Address} from "../../utils/Address.sol"; +import {StorageSlot} from "../../utils/StorageSlot.sol"; + +/** + * @dev This abstract contract provides getters and event emitting update functions for + * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. + */ +library ERC1967Utils { + // We re-declare ERC-1967 events here because they can't be used directly from IERC1967. + // This will be fixed in Solidity 0.8.21. At that point we should remove these events. + /** + * @dev Emitted when the implementation is upgraded. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Emitted when the admin account has changed. + */ + event AdminChanged(address previousAdmin, address newAdmin); + + /** + * @dev Emitted when the beacon is changed. + */ + event BeaconUpgraded(address indexed beacon); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1. + */ + // solhint-disable-next-line private-vars-leading-underscore + bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev The `implementation` of the proxy is invalid. + */ + error ERC1967InvalidImplementation(address implementation); + + /** + * @dev The `admin` of the proxy is invalid. + */ + error ERC1967InvalidAdmin(address admin); + + /** + * @dev The `beacon` of the proxy is invalid. + */ + error ERC1967InvalidBeacon(address beacon); + + /** + * @dev An upgrade function sees `msg.value > 0` that may be lost. + */ + error ERC1967NonPayable(); + + /** + * @dev Returns the current implementation address. + */ + function getImplementation() internal view returns (address) { + return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value; + } + + /** + * @dev Stores a new address in the EIP1967 implementation slot. + */ + function _setImplementation(address newImplementation) private { + if (newImplementation.code.length == 0) { + revert ERC1967InvalidImplementation(newImplementation); + } + StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation; + } + + /** + * @dev Performs implementation upgrade with additional setup call if data is nonempty. + * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected + * to avoid stuck value in the contract. + * + * Emits an {IERC1967-Upgraded} event. + */ + function upgradeToAndCall(address newImplementation, bytes memory data) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + + if (data.length > 0) { + Address.functionDelegateCall(newImplementation, data); + } else { + _checkNonPayable(); + } + } + + /** + * @dev Storage slot with the admin of the contract. + * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. + */ + // solhint-disable-next-line private-vars-leading-underscore + bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + + /** + * @dev Returns the current admin. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using + * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` + */ + function getAdmin() internal view returns (address) { + return StorageSlot.getAddressSlot(ADMIN_SLOT).value; + } + + /** + * @dev Stores a new address in the EIP1967 admin slot. + */ + function _setAdmin(address newAdmin) private { + if (newAdmin == address(0)) { + revert ERC1967InvalidAdmin(address(0)); + } + StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin; + } + + /** + * @dev Changes the admin of the proxy. + * + * Emits an {IERC1967-AdminChanged} event. + */ + function changeAdmin(address newAdmin) internal { + emit AdminChanged(getAdmin(), newAdmin); + _setAdmin(newAdmin); + } + + /** + * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. + * This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1. + */ + // solhint-disable-next-line private-vars-leading-underscore + bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; + + /** + * @dev Returns the current beacon. + */ + function getBeacon() internal view returns (address) { + return StorageSlot.getAddressSlot(BEACON_SLOT).value; + } + + /** + * @dev Stores a new beacon in the EIP1967 beacon slot. + */ + function _setBeacon(address newBeacon) private { + if (newBeacon.code.length == 0) { + revert ERC1967InvalidBeacon(newBeacon); + } + + StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon; + + address beaconImplementation = IBeacon(newBeacon).implementation(); + if (beaconImplementation.code.length == 0) { + revert ERC1967InvalidImplementation(beaconImplementation); + } + } + + /** + * @dev Change the beacon and trigger a setup call if data is nonempty. + * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected + * to avoid stuck value in the contract. + * + * Emits an {IERC1967-BeaconUpgraded} event. + * + * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since + * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for + * efficiency. + */ + function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal { + _setBeacon(newBeacon); + emit BeaconUpgraded(newBeacon); + + if (data.length > 0) { + Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); + } else { + _checkNonPayable(); + } + } + + /** + * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract + * if an upgrade doesn't perform an initialization call. + */ + function _checkNonPayable() private { + if (msg.value > 0) { + revert ERC1967NonPayable(); + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/Proxy.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/Proxy.sol new file mode 100644 index 0000000..0e73651 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/Proxy.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol) + +pragma solidity ^0.8.20; + +/** + * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM + * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to + * be specified by overriding the virtual {_implementation} function. + * + * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a + * different contract through the {_delegate} function. + * + * The success and return data of the delegated call will be returned back to the caller of the proxy. + */ +abstract contract Proxy { + /** + * @dev Delegates the current call to `implementation`. + * + * This function does not return to its internal call site, it will return directly to the external caller. + */ + function _delegate(address implementation) internal virtual { + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev This is a virtual function that should be overridden so it returns the address to which the fallback + * function and {_fallback} should delegate. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates the current call to the address returned by `_implementation()`. + * + * This function does not return to its internal call site, it will return directly to the external caller. + */ + function _fallback() internal virtual { + _delegate(_implementation()); + } + + /** + * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other + * function in the contract matches the call data. + */ + fallback() external payable virtual { + _fallback(); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol new file mode 100644 index 0000000..05e26e5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/BeaconProxy.sol) + +pragma solidity ^0.8.20; + +import {IBeacon} from "./IBeacon.sol"; +import {Proxy} from "../Proxy.sol"; +import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol"; + +/** + * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}. + * + * The beacon address can only be set once during construction, and cannot be changed afterwards. It is stored in an + * immutable variable to avoid unnecessary storage reads, and also in the beacon storage slot specified by + * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] so that it can be accessed externally. + * + * CAUTION: Since the beacon address can never be changed, you must ensure that you either control the beacon, or trust + * the beacon to not upgrade the implementation maliciously. + * + * IMPORTANT: Do not use the implementation logic to modify the beacon storage slot. Doing so would leave the proxy in + * an inconsistent state where the beacon storage slot does not match the beacon address. + */ +contract BeaconProxy is Proxy { + // An immutable address for the beacon to avoid unnecessary SLOADs before each delegate call. + address private immutable _beacon; + + /** + * @dev Initializes the proxy with `beacon`. + * + * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This + * will typically be an encoded function call, and allows initializing the storage of the proxy like a Solidity + * constructor. + * + * Requirements: + * + * - `beacon` must be a contract with the interface {IBeacon}. + * - If `data` is empty, `msg.value` must be zero. + */ + constructor(address beacon, bytes memory data) payable { + ERC1967Utils.upgradeBeaconToAndCall(beacon, data); + _beacon = beacon; + } + + /** + * @dev Returns the current implementation address of the associated beacon. + */ + function _implementation() internal view virtual override returns (address) { + return IBeacon(_getBeacon()).implementation(); + } + + /** + * @dev Returns the beacon. + */ + function _getBeacon() internal view virtual returns (address) { + return _beacon; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/beacon/IBeacon.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/beacon/IBeacon.sol new file mode 100644 index 0000000..36a3c76 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/beacon/IBeacon.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol) + +pragma solidity ^0.8.20; + +/** + * @dev This is the interface that {BeaconProxy} expects of its beacon. + */ +interface IBeacon { + /** + * @dev Must return an address that can be used as a delegate call target. + * + * {UpgradeableBeacon} will check that this address is a contract. + */ + function implementation() external view returns (address); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol new file mode 100644 index 0000000..8db9bd2 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/UpgradeableBeacon.sol) + +pragma solidity ^0.8.20; + +import {IBeacon} from "./IBeacon.sol"; +import {Ownable} from "../../access/Ownable.sol"; + +/** + * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their + * implementation contract, which is where they will delegate all function calls. + * + * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon. + */ +contract UpgradeableBeacon is IBeacon, Ownable { + address private _implementation; + + /** + * @dev The `implementation` of the beacon is invalid. + */ + error BeaconInvalidImplementation(address implementation); + + /** + * @dev Emitted when the implementation returned by the beacon is changed. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Sets the address of the initial implementation, and the initial owner who can upgrade the beacon. + */ + constructor(address implementation_, address initialOwner) Ownable(initialOwner) { + _setImplementation(implementation_); + } + + /** + * @dev Returns the current implementation address. + */ + function implementation() public view virtual returns (address) { + return _implementation; + } + + /** + * @dev Upgrades the beacon to a new implementation. + * + * Emits an {Upgraded} event. + * + * Requirements: + * + * - msg.sender must be the owner of the contract. + * - `newImplementation` must be a contract. + */ + function upgradeTo(address newImplementation) public virtual onlyOwner { + _setImplementation(newImplementation); + } + + /** + * @dev Sets the implementation contract address for this beacon + * + * Requirements: + * + * - `newImplementation` must be a contract. + */ + function _setImplementation(address newImplementation) private { + if (newImplementation.code.length == 0) { + revert BeaconInvalidImplementation(newImplementation); + } + _implementation = newImplementation; + emit Upgraded(newImplementation); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/ERC20.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/ERC20.sol new file mode 100644 index 0000000..1fde527 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/ERC20.sol @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) + +pragma solidity ^0.8.20; + +import {IERC20} from "./IERC20.sol"; +import {IERC20Metadata} from "./extensions/IERC20Metadata.sol"; +import {Context} from "../../utils/Context.sol"; +import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol"; + +/** + * @dev Implementation of the {IERC20} interface. + * + * This implementation is agnostic to the way tokens are created. This means + * that a supply mechanism has to be added in a derived contract using {_mint}. + * + * TIP: For a detailed writeup see our guide + * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * The default value of {decimals} is 18. To change this, you should override + * this function so it returns a different value. + * + * We have followed general OpenZeppelin Contracts guidelines: functions revert + * instead returning `false` on failure. This behavior is nonetheless + * conventional and does not conflict with the expectations of ERC20 + * applications. + * + * Additionally, an {Approval} event is emitted on calls to {transferFrom}. + * This allows applications to reconstruct the allowance for all accounts just + * by listening to said events. Other implementations of the EIP may not emit + * these events, as it isn't required by the specification. + */ +abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { + mapping(address account => uint256) private _balances; + + mapping(address account => mapping(address spender => uint256)) private _allowances; + + uint256 private _totalSupply; + + string private _name; + string private _symbol; + + /** + * @dev Sets the values for {name} and {symbol}. + * + * All two of these values are immutable: they can only be set once during + * construction. + */ + constructor(string memory name_, string memory symbol_) { + _name = name_; + _symbol = symbol_; + } + + /** + * @dev Returns the name of the token. + */ + function name() public view virtual returns (string memory) { + return _name; + } + + /** + * @dev Returns the symbol of the token, usually a shorter version of the + * name. + */ + function symbol() public view virtual returns (string memory) { + return _symbol; + } + + /** + * @dev Returns the number of decimals used to get its user representation. + * For example, if `decimals` equals `2`, a balance of `505` tokens should + * be displayed to a user as `5.05` (`505 / 10 ** 2`). + * + * Tokens usually opt for a value of 18, imitating the relationship between + * Ether and Wei. This is the default value returned by this function, unless + * it's overridden. + * + * NOTE: This information is only used for _display_ purposes: it in + * no way affects any of the arithmetic of the contract, including + * {IERC20-balanceOf} and {IERC20-transfer}. + */ + function decimals() public view virtual returns (uint8) { + return 18; + } + + /** + * @dev See {IERC20-totalSupply}. + */ + function totalSupply() public view virtual returns (uint256) { + return _totalSupply; + } + + /** + * @dev See {IERC20-balanceOf}. + */ + function balanceOf(address account) public view virtual returns (uint256) { + return _balances[account]; + } + + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `to` cannot be the zero address. + * - the caller must have a balance of at least `value`. + */ + function transfer(address to, uint256 value) public virtual returns (bool) { + address owner = _msgSender(); + _transfer(owner, to, value); + return true; + } + + /** + * @dev See {IERC20-allowance}. + */ + function allowance(address owner, address spender) public view virtual returns (uint256) { + return _allowances[owner][spender]; + } + + /** + * @dev See {IERC20-approve}. + * + * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on + * `transferFrom`. This is semantically equivalent to an infinite approval. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 value) public virtual returns (bool) { + address owner = _msgSender(); + _approve(owner, spender, value); + return true; + } + + /** + * @dev See {IERC20-transferFrom}. + * + * Emits an {Approval} event indicating the updated allowance. This is not + * required by the EIP. See the note at the beginning of {ERC20}. + * + * NOTE: Does not update the allowance if the current allowance + * is the maximum `uint256`. + * + * Requirements: + * + * - `from` and `to` cannot be the zero address. + * - `from` must have a balance of at least `value`. + * - the caller must have allowance for ``from``'s tokens of at least + * `value`. + */ + function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { + address spender = _msgSender(); + _spendAllowance(from, spender, value); + _transfer(from, to, value); + return true; + } + + /** + * @dev Moves a `value` amount of tokens from `from` to `to`. + * + * This internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * NOTE: This function is not virtual, {_update} should be overridden instead. + */ + function _transfer(address from, address to, uint256 value) internal { + if (from == address(0)) { + revert ERC20InvalidSender(address(0)); + } + if (to == address(0)) { + revert ERC20InvalidReceiver(address(0)); + } + _update(from, to, value); + } + + /** + * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` + * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding + * this function. + * + * Emits a {Transfer} event. + */ + function _update(address from, address to, uint256 value) internal virtual { + if (from == address(0)) { + // Overflow check required: The rest of the code assumes that totalSupply never overflows + _totalSupply += value; + } else { + uint256 fromBalance = _balances[from]; + if (fromBalance < value) { + revert ERC20InsufficientBalance(from, fromBalance, value); + } + unchecked { + // Overflow not possible: value <= fromBalance <= totalSupply. + _balances[from] = fromBalance - value; + } + } + + if (to == address(0)) { + unchecked { + // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. + _totalSupply -= value; + } + } else { + unchecked { + // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. + _balances[to] += value; + } + } + + emit Transfer(from, to, value); + } + + /** + * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). + * Relies on the `_update` mechanism + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * NOTE: This function is not virtual, {_update} should be overridden instead. + */ + function _mint(address account, uint256 value) internal { + if (account == address(0)) { + revert ERC20InvalidReceiver(address(0)); + } + _update(address(0), account, value); + } + + /** + * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. + * Relies on the `_update` mechanism. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * NOTE: This function is not virtual, {_update} should be overridden instead + */ + function _burn(address account, uint256 value) internal { + if (account == address(0)) { + revert ERC20InvalidSender(address(0)); + } + _update(account, address(0), value); + } + + /** + * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. + * + * This internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + * + * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. + */ + function _approve(address owner, address spender, uint256 value) internal { + _approve(owner, spender, value, true); + } + + /** + * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. + * + * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by + * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any + * `Approval` event during `transferFrom` operations. + * + * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to + * true using the following override: + * ``` + * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { + * super._approve(owner, spender, value, true); + * } + * ``` + * + * Requirements are the same as {_approve}. + */ + function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { + if (owner == address(0)) { + revert ERC20InvalidApprover(address(0)); + } + if (spender == address(0)) { + revert ERC20InvalidSpender(address(0)); + } + _allowances[owner][spender] = value; + if (emitEvent) { + emit Approval(owner, spender, value); + } + } + + /** + * @dev Updates `owner` s allowance for `spender` based on spent `value`. + * + * Does not update the allowance value in case of infinite allowance. + * Revert if not enough allowance is available. + * + * Does not emit an {Approval} event. + */ + function _spendAllowance(address owner, address spender, uint256 value) internal virtual { + uint256 currentAllowance = allowance(owner, spender); + if (currentAllowance != type(uint256).max) { + if (currentAllowance < value) { + revert ERC20InsufficientAllowance(spender, currentAllowance, value); + } + unchecked { + _approve(owner, spender, currentAllowance - value, false); + } + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/IERC20.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/IERC20.sol new file mode 100644 index 0000000..db01cf4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/IERC20.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); + + /** + * @dev Returns the value of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the value of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves a `value` amount of tokens from the caller's account to `to`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address to, uint256 value) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets a `value` amount of tokens as the allowance of `spender` over the + * caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 value) external returns (bool); + + /** + * @dev Moves a `value` amount of tokens from `from` to `to` using the + * allowance mechanism. `value` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address from, address to, uint256 value) external returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol new file mode 100644 index 0000000..4d482d8 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol) + +pragma solidity ^0.8.20; + +import {ERC20} from "../ERC20.sol"; +import {Context} from "../../../utils/Context.sol"; + +/** + * @dev Extension of {ERC20} that allows token holders to destroy both their own + * tokens and those that they have an allowance for, in a way that can be + * recognized off-chain (via event analysis). + */ +abstract contract ERC20Burnable is Context, ERC20 { + /** + * @dev Destroys a `value` amount of tokens from the caller. + * + * See {ERC20-_burn}. + */ + function burn(uint256 value) public virtual { + _burn(_msgSender(), value); + } + + /** + * @dev Destroys a `value` amount of tokens from `account`, deducting from + * the caller's allowance. + * + * See {ERC20-_burn} and {ERC20-allowance}. + * + * Requirements: + * + * - the caller must have allowance for ``accounts``'s tokens of at least + * `value`. + */ + function burnFrom(address account, uint256 value) public virtual { + _spendAllowance(account, _msgSender(), value); + _burn(account, value); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol new file mode 100644 index 0000000..1a38cba --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) + +pragma solidity ^0.8.20; + +import {IERC20} from "../IERC20.sol"; + +/** + * @dev Interface for the optional metadata functions from the ERC20 standard. + */ +interface IERC20Metadata is IERC20 { + /** + * @dev Returns the name of the token. + */ + function name() external view returns (string memory); + + /** + * @dev Returns the symbol of the token. + */ + function symbol() external view returns (string memory); + + /** + * @dev Returns the decimals places of the token. + */ + function decimals() external view returns (uint8); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol new file mode 100644 index 0000000..5af4810 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in + * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. + * + * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by + * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't + * need to send a transaction, and thus is not required to hold Ether at all. + * + * ==== Security Considerations + * + * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature + * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be + * considered as an intention to spend the allowance in any specific way. The second is that because permits have + * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should + * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be + * generally recommended is: + * + * ```solidity + * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { + * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} + * doThing(..., value); + * } + * + * function doThing(..., uint256 value) public { + * token.safeTransferFrom(msg.sender, address(this), value); + * ... + * } + * ``` + * + * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of + * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also + * {SafeERC20-safeTransferFrom}). + * + * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so + * contracts should have entry points that don't rely on permit. + */ +interface IERC20Permit { + /** + * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, + * given ``owner``'s signed approval. + * + * IMPORTANT: The same issues {IERC20-approve} has related to transaction + * ordering also apply here. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `deadline` must be a timestamp in the future. + * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` + * over the EIP712-formatted function arguments. + * - the signature must use ``owner``'s current nonce (see {nonces}). + * + * For more information on the signature format, see the + * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP + * section]. + * + * CAUTION: See Security Considerations above. + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @dev Returns the current nonce for `owner`. This value must be + * included whenever a signature is generated for {permit}. + * + * Every successful call to {permit} increases ``owner``'s nonce by one. This + * prevents a signature from being used multiple times. + */ + function nonces(address owner) external view returns (uint256); + + /** + * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. + */ + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view returns (bytes32); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol new file mode 100644 index 0000000..bb65709 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) + +pragma solidity ^0.8.20; + +import {IERC20} from "../IERC20.sol"; +import {IERC20Permit} from "../extensions/IERC20Permit.sol"; +import {Address} from "../../../utils/Address.sol"; + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using Address for address; + + /** + * @dev An operation with an ERC20 token failed. + */ + error SafeERC20FailedOperation(address token); + + /** + * @dev Indicates a failed `decreaseAllowance` request. + */ + error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); + + /** + * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeTransfer(IERC20 token, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); + } + + /** + * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the + * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. + */ + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); + } + + /** + * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + uint256 oldAllowance = token.allowance(address(this), spender); + forceApprove(token, spender, oldAllowance + value); + } + + /** + * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no + * value, non-reverting calls are assumed to be successful. + */ + function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { + unchecked { + uint256 currentAllowance = token.allowance(address(this), spender); + if (currentAllowance < requestedDecrease) { + revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); + } + forceApprove(token, spender, currentAllowance - requestedDecrease); + } + } + + /** + * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval + * to be set to zero before setting it to a non-zero value, such as USDT. + */ + function forceApprove(IERC20 token, address spender, uint256 value) internal { + bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); + + if (!_callOptionalReturnBool(token, approvalCall)) { + _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); + _callOptionalReturn(token, approvalCall); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function _callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that + // the target address contains contract code and also asserts for success in the low-level call. + + bytes memory returndata = address(token).functionCall(data); + if (returndata.length != 0 && !abi.decode(returndata, (bool))) { + revert SafeERC20FailedOperation(address(token)); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + * + * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. + */ + function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false + // and not revert is the subcall reverts. + + (bool success, bytes memory returndata) = address(token).call(data); + return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/ERC721.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/ERC721.sol new file mode 100644 index 0000000..98a80e5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/ERC721.sol @@ -0,0 +1,483 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol) + +pragma solidity ^0.8.20; + +import {IERC721} from "./IERC721.sol"; +import {IERC721Receiver} from "./IERC721Receiver.sol"; +import {IERC721Metadata} from "./extensions/IERC721Metadata.sol"; +import {Context} from "../../utils/Context.sol"; +import {Strings} from "../../utils/Strings.sol"; +import {IERC165, ERC165} from "../../utils/introspection/ERC165.sol"; +import {IERC721Errors} from "../../interfaces/draft-IERC6093.sol"; + +/** + * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including + * the Metadata extension, but not including the Enumerable extension, which is available separately as + * {ERC721Enumerable}. + */ +abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { + using Strings for uint256; + + // Token name + string private _name; + + // Token symbol + string private _symbol; + + mapping(uint256 tokenId => address) private _owners; + + mapping(address owner => uint256) private _balances; + + mapping(uint256 tokenId => address) private _tokenApprovals; + + mapping(address owner => mapping(address operator => bool)) private _operatorApprovals; + + /** + * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. + */ + constructor(string memory name_, string memory symbol_) { + _name = name_; + _symbol = symbol_; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { + return + interfaceId == type(IERC721).interfaceId || + interfaceId == type(IERC721Metadata).interfaceId || + super.supportsInterface(interfaceId); + } + + /** + * @dev See {IERC721-balanceOf}. + */ + function balanceOf(address owner) public view virtual returns (uint256) { + if (owner == address(0)) { + revert ERC721InvalidOwner(address(0)); + } + return _balances[owner]; + } + + /** + * @dev See {IERC721-ownerOf}. + */ + function ownerOf(uint256 tokenId) public view virtual returns (address) { + return _requireOwned(tokenId); + } + + /** + * @dev See {IERC721Metadata-name}. + */ + function name() public view virtual returns (string memory) { + return _name; + } + + /** + * @dev See {IERC721Metadata-symbol}. + */ + function symbol() public view virtual returns (string memory) { + return _symbol; + } + + /** + * @dev See {IERC721Metadata-tokenURI}. + */ + function tokenURI(uint256 tokenId) public view virtual returns (string memory) { + _requireOwned(tokenId); + + string memory baseURI = _baseURI(); + return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : ""; + } + + /** + * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each + * token will be the concatenation of the `baseURI` and the `tokenId`. Empty + * by default, can be overridden in child contracts. + */ + function _baseURI() internal view virtual returns (string memory) { + return ""; + } + + /** + * @dev See {IERC721-approve}. + */ + function approve(address to, uint256 tokenId) public virtual { + _approve(to, tokenId, _msgSender()); + } + + /** + * @dev See {IERC721-getApproved}. + */ + function getApproved(uint256 tokenId) public view virtual returns (address) { + _requireOwned(tokenId); + + return _getApproved(tokenId); + } + + /** + * @dev See {IERC721-setApprovalForAll}. + */ + function setApprovalForAll(address operator, bool approved) public virtual { + _setApprovalForAll(_msgSender(), operator, approved); + } + + /** + * @dev See {IERC721-isApprovedForAll}. + */ + function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { + return _operatorApprovals[owner][operator]; + } + + /** + * @dev See {IERC721-transferFrom}. + */ + function transferFrom(address from, address to, uint256 tokenId) public virtual { + if (to == address(0)) { + revert ERC721InvalidReceiver(address(0)); + } + // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists + // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. + address previousOwner = _update(to, tokenId, _msgSender()); + if (previousOwner != from) { + revert ERC721IncorrectOwner(from, tokenId, previousOwner); + } + } + + /** + * @dev See {IERC721-safeTransferFrom}. + */ + function safeTransferFrom(address from, address to, uint256 tokenId) public { + safeTransferFrom(from, to, tokenId, ""); + } + + /** + * @dev See {IERC721-safeTransferFrom}. + */ + function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { + transferFrom(from, to, tokenId); + _checkOnERC721Received(from, to, tokenId, data); + } + + /** + * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist + * + * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the + * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances + * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by + * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`. + */ + function _ownerOf(uint256 tokenId) internal view virtual returns (address) { + return _owners[tokenId]; + } + + /** + * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. + */ + function _getApproved(uint256 tokenId) internal view virtual returns (address) { + return _tokenApprovals[tokenId]; + } + + /** + * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in + * particular (ignoring whether it is owned by `owner`). + * + * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this + * assumption. + */ + function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { + return + spender != address(0) && + (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); + } + + /** + * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. + * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets + * the `spender` for the specific `tokenId`. + * + * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this + * assumption. + */ + function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { + if (!_isAuthorized(owner, spender, tokenId)) { + if (owner == address(0)) { + revert ERC721NonexistentToken(tokenId); + } else { + revert ERC721InsufficientApproval(spender, tokenId); + } + } + } + + /** + * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. + * + * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that + * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. + * + * WARNING: Increasing an account's balance using this function tends to be paired with an override of the + * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership + * remain consistent with one another. + */ + function _increaseBalance(address account, uint128 value) internal virtual { + unchecked { + _balances[account] += value; + } + } + + /** + * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner + * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. + * + * The `auth` argument is optional. If the value passed is non 0, then this function will check that + * `auth` is either the owner of the token, or approved to operate on the token (by the owner). + * + * Emits a {Transfer} event. + * + * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. + */ + function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { + address from = _ownerOf(tokenId); + + // Perform (optional) operator check + if (auth != address(0)) { + _checkAuthorized(from, auth, tokenId); + } + + // Execute the update + if (from != address(0)) { + // Clear approval. No need to re-authorize or emit the Approval event + _approve(address(0), tokenId, address(0), false); + + unchecked { + _balances[from] -= 1; + } + } + + if (to != address(0)) { + unchecked { + _balances[to] += 1; + } + } + + _owners[tokenId] = to; + + emit Transfer(from, to, tokenId); + + return from; + } + + /** + * @dev Mints `tokenId` and transfers it to `to`. + * + * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible + * + * Requirements: + * + * - `tokenId` must not exist. + * - `to` cannot be the zero address. + * + * Emits a {Transfer} event. + */ + function _mint(address to, uint256 tokenId) internal { + if (to == address(0)) { + revert ERC721InvalidReceiver(address(0)); + } + address previousOwner = _update(to, tokenId, address(0)); + if (previousOwner != address(0)) { + revert ERC721InvalidSender(address(0)); + } + } + + /** + * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. + * + * Requirements: + * + * - `tokenId` must not exist. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. + * + * Emits a {Transfer} event. + */ + function _safeMint(address to, uint256 tokenId) internal { + _safeMint(to, tokenId, ""); + } + + /** + * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is + * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. + */ + function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { + _mint(to, tokenId); + _checkOnERC721Received(address(0), to, tokenId, data); + } + + /** + * @dev Destroys `tokenId`. + * The approval is cleared when the token is burned. + * This is an internal function that does not check if the sender is authorized to operate on the token. + * + * Requirements: + * + * - `tokenId` must exist. + * + * Emits a {Transfer} event. + */ + function _burn(uint256 tokenId) internal { + address previousOwner = _update(address(0), tokenId, address(0)); + if (previousOwner == address(0)) { + revert ERC721NonexistentToken(tokenId); + } + } + + /** + * @dev Transfers `tokenId` from `from` to `to`. + * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. + * + * Requirements: + * + * - `to` cannot be the zero address. + * - `tokenId` token must be owned by `from`. + * + * Emits a {Transfer} event. + */ + function _transfer(address from, address to, uint256 tokenId) internal { + if (to == address(0)) { + revert ERC721InvalidReceiver(address(0)); + } + address previousOwner = _update(to, tokenId, address(0)); + if (previousOwner == address(0)) { + revert ERC721NonexistentToken(tokenId); + } else if (previousOwner != from) { + revert ERC721IncorrectOwner(from, tokenId, previousOwner); + } + } + + /** + * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients + * are aware of the ERC721 standard to prevent tokens from being forever locked. + * + * `data` is additional data, it has no specified format and it is sent in call to `to`. + * + * This internal function is like {safeTransferFrom} in the sense that it invokes + * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. + * implement alternative mechanisms to perform token transfer, such as signature-based. + * + * Requirements: + * + * - `tokenId` token must exist and be owned by `from`. + * - `to` cannot be the zero address. + * - `from` cannot be the zero address. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. + * + * Emits a {Transfer} event. + */ + function _safeTransfer(address from, address to, uint256 tokenId) internal { + _safeTransfer(from, to, tokenId, ""); + } + + /** + * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is + * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. + */ + function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { + _transfer(from, to, tokenId); + _checkOnERC721Received(from, to, tokenId, data); + } + + /** + * @dev Approve `to` to operate on `tokenId` + * + * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is + * either the owner of the token, or approved to operate on all tokens held by this owner. + * + * Emits an {Approval} event. + * + * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. + */ + function _approve(address to, uint256 tokenId, address auth) internal { + _approve(to, tokenId, auth, true); + } + + /** + * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not + * emitted in the context of transfers. + */ + function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { + // Avoid reading the owner unless necessary + if (emitEvent || auth != address(0)) { + address owner = _requireOwned(tokenId); + + // We do not use _isAuthorized because single-token approvals should not be able to call approve + if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { + revert ERC721InvalidApprover(auth); + } + + if (emitEvent) { + emit Approval(owner, to, tokenId); + } + } + + _tokenApprovals[tokenId] = to; + } + + /** + * @dev Approve `operator` to operate on all of `owner` tokens + * + * Requirements: + * - operator can't be the address zero. + * + * Emits an {ApprovalForAll} event. + */ + function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { + if (operator == address(0)) { + revert ERC721InvalidOperator(operator); + } + _operatorApprovals[owner][operator] = approved; + emit ApprovalForAll(owner, operator, approved); + } + + /** + * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). + * Returns the owner. + * + * Overrides to ownership logic should be done to {_ownerOf}. + */ + function _requireOwned(uint256 tokenId) internal view returns (address) { + address owner = _ownerOf(tokenId); + if (owner == address(0)) { + revert ERC721NonexistentToken(tokenId); + } + return owner; + } + + /** + * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the + * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract. + * + * @param from address representing the previous owner of the given token ID + * @param to target address that will receive the tokens + * @param tokenId uint256 ID of the token to be transferred + * @param data bytes optional data to send along with the call + */ + function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { + if (to.code.length > 0) { + try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { + if (retval != IERC721Receiver.onERC721Received.selector) { + revert ERC721InvalidReceiver(to); + } + } catch (bytes memory reason) { + if (reason.length == 0) { + revert ERC721InvalidReceiver(to); + } else { + /// @solidity memory-safe-assembly + assembly { + revert(add(32, reason), mload(reason)) + } + } + } + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/IERC721.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/IERC721.sol new file mode 100644 index 0000000..12f3236 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/IERC721.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "../../utils/introspection/IERC165.sol"; + +/** + * @dev Required interface of an ERC721 compliant contract. + */ +interface IERC721 is IERC165 { + /** + * @dev Emitted when `tokenId` token is transferred from `from` to `to`. + */ + event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); + + /** + * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. + */ + event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); + + /** + * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. + */ + event ApprovalForAll(address indexed owner, address indexed operator, bool approved); + + /** + * @dev Returns the number of tokens in ``owner``'s account. + */ + function balanceOf(address owner) external view returns (uint256 balance); + + /** + * @dev Returns the owner of the `tokenId` token. + * + * Requirements: + * + * - `tokenId` must exist. + */ + function ownerOf(uint256 tokenId) external view returns (address owner); + + /** + * @dev Safely transfers `tokenId` token from `from` to `to`. + * + * Requirements: + * + * - `from` cannot be the zero address. + * - `to` cannot be the zero address. + * - `tokenId` token must exist and be owned by `from`. + * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon + * a safe transfer. + * + * Emits a {Transfer} event. + */ + function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; + + /** + * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients + * are aware of the ERC721 protocol to prevent tokens from being forever locked. + * + * Requirements: + * + * - `from` cannot be the zero address. + * - `to` cannot be the zero address. + * - `tokenId` token must exist and be owned by `from`. + * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or + * {setApprovalForAll}. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon + * a safe transfer. + * + * Emits a {Transfer} event. + */ + function safeTransferFrom(address from, address to, uint256 tokenId) external; + + /** + * @dev Transfers `tokenId` token from `from` to `to`. + * + * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 + * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must + * understand this adds an external call which potentially creates a reentrancy vulnerability. + * + * Requirements: + * + * - `from` cannot be the zero address. + * - `to` cannot be the zero address. + * - `tokenId` token must be owned by `from`. + * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. + * + * Emits a {Transfer} event. + */ + function transferFrom(address from, address to, uint256 tokenId) external; + + /** + * @dev Gives permission to `to` to transfer `tokenId` token to another account. + * The approval is cleared when the token is transferred. + * + * Only a single account can be approved at a time, so approving the zero address clears previous approvals. + * + * Requirements: + * + * - The caller must own the token or be an approved operator. + * - `tokenId` must exist. + * + * Emits an {Approval} event. + */ + function approve(address to, uint256 tokenId) external; + + /** + * @dev Approve or remove `operator` as an operator for the caller. + * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. + * + * Requirements: + * + * - The `operator` cannot be the address zero. + * + * Emits an {ApprovalForAll} event. + */ + function setApprovalForAll(address operator, bool approved) external; + + /** + * @dev Returns the account approved for `tokenId` token. + * + * Requirements: + * + * - `tokenId` must exist. + */ + function getApproved(uint256 tokenId) external view returns (address operator); + + /** + * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. + * + * See {setApprovalForAll} + */ + function isApprovedForAll(address owner, address operator) external view returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol new file mode 100644 index 0000000..f9dc133 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) + +pragma solidity ^0.8.20; + +/** + * @title ERC721 token receiver interface + * @dev Interface for any contract that wants to support safeTransfers + * from ERC721 asset contracts. + */ +interface IERC721Receiver { + /** + * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} + * by `operator` from `from`, this function is called. + * + * It must return its Solidity selector to confirm the token transfer. + * If any other value is returned or the interface is not implemented by the recipient, the transfer will be + * reverted. + * + * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. + */ + function onERC721Received( + address operator, + address from, + uint256 tokenId, + bytes calldata data + ) external returns (bytes4); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol new file mode 100644 index 0000000..2584cb5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol) + +pragma solidity ^0.8.20; + +import {ERC721} from "../ERC721.sol"; +import {Strings} from "../../../utils/Strings.sol"; +import {IERC4906} from "../../../interfaces/IERC4906.sol"; +import {IERC165} from "../../../interfaces/IERC165.sol"; + +/** + * @dev ERC721 token with storage based token URI management. + */ +abstract contract ERC721URIStorage is IERC4906, ERC721 { + using Strings for uint256; + + // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only + // defines events and does not include any external function. + bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906); + + // Optional mapping for token URIs + mapping(uint256 tokenId => string) private _tokenURIs; + + /** + * @dev See {IERC165-supportsInterface} + */ + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) { + return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId); + } + + /** + * @dev See {IERC721Metadata-tokenURI}. + */ + function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { + _requireOwned(tokenId); + + string memory _tokenURI = _tokenURIs[tokenId]; + string memory base = _baseURI(); + + // If there is no base URI, return the token URI. + if (bytes(base).length == 0) { + return _tokenURI; + } + // If both are set, concatenate the baseURI and tokenURI (via string.concat). + if (bytes(_tokenURI).length > 0) { + return string.concat(base, _tokenURI); + } + + return super.tokenURI(tokenId); + } + + /** + * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. + * + * Emits {MetadataUpdate}. + */ + function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { + _tokenURIs[tokenId] = _tokenURI; + emit MetadataUpdate(tokenId); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol new file mode 100644 index 0000000..e9e00fa --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) + +pragma solidity ^0.8.20; + +import {IERC721} from "../IERC721.sol"; + +/** + * @title ERC-721 Non-Fungible Token Standard, optional metadata extension + * @dev See https://eips.ethereum.org/EIPS/eip-721 + */ +interface IERC721Metadata is IERC721 { + /** + * @dev Returns the token collection name. + */ + function name() external view returns (string memory); + + /** + * @dev Returns the token collection symbol. + */ + function symbol() external view returns (string memory); + + /** + * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. + */ + function tokenURI(uint256 tokenId) external view returns (string memory); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Address.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Address.sol new file mode 100644 index 0000000..b7e3059 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Address.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev The ETH balance of the account is not enough to perform the operation. + */ + error AddressInsufficientBalance(address account); + + /** + * @dev There's no code at `target` (it is not a contract). + */ + error AddressEmptyCode(address target); + + /** + * @dev A call to an address target failed. The target may have reverted. + */ + error FailedInnerCall(); + + /** + * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + if (address(this).balance < amount) { + revert AddressInsufficientBalance(address(this)); + } + + (bool success, ) = recipient.call{value: amount}(""); + if (!success) { + revert FailedInnerCall(); + } + } + + /** + * @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 or custom error, it is bubbled + * up by this function (like regular Solidity function calls). However, if + * the call reverted with no returned reason, this function reverts with a + * {FailedInnerCall} error. + * + * 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. + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0); + } + + /** + * @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`. + */ + function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { + if (address(this).balance < value) { + revert AddressInsufficientBalance(address(this)); + } + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + */ + function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target + * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an + * unsuccessful call. + */ + function verifyCallResultFromTarget( + address target, + bool success, + bytes memory returndata + ) internal view returns (bytes memory) { + if (!success) { + _revert(returndata); + } else { + // only check if target is a contract if the call was successful and the return data is empty + // otherwise we already know that it was a contract + if (returndata.length == 0 && target.code.length == 0) { + revert AddressEmptyCode(target); + } + return returndata; + } + } + + /** + * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the + * revert reason or with a default {FailedInnerCall} error. + */ + function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { + if (!success) { + _revert(returndata); + } else { + return returndata; + } + } + + /** + * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. + */ + function _revert(bytes memory returndata) private pure { + // 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 FailedInnerCall(); + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Base64.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Base64.sol new file mode 100644 index 0000000..0124cdd --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Base64.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.2) (utils/Base64.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Provides a set of functions to operate with Base64 strings. + */ +library Base64 { + /** + * @dev Base64 Encoding/Decoding Table + */ + string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + /** + * @dev Converts a `bytes` to its Bytes64 `string` representation. + */ + function encode(bytes memory data) internal pure returns (string memory) { + /** + * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence + * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol + */ + if (data.length == 0) return ""; + + // Loads the table into memory + string memory table = _TABLE; + + // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter + // and split into 4 numbers of 6 bits. + // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up + // - `data.length + 2` -> Round up + // - `/ 3` -> Number of 3-bytes chunks + // - `4 *` -> 4 characters for each chunk + string memory result = new string(4 * ((data.length + 2) / 3)); + + /// @solidity memory-safe-assembly + assembly { + // Prepare the lookup table (skip the first "length" byte) + let tablePtr := add(table, 1) + + // Prepare result pointer, jump over length + let resultPtr := add(result, 0x20) + let dataPtr := data + let endPtr := add(data, mload(data)) + + // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and + // set it to zero to make sure no dirty bytes are read in that section. + let afterPtr := add(endPtr, 0x20) + let afterCache := mload(afterPtr) + mstore(afterPtr, 0x00) + + // Run over the input, 3 bytes at a time + for { + + } lt(dataPtr, endPtr) { + + } { + // Advance 3 bytes + dataPtr := add(dataPtr, 3) + let input := mload(dataPtr) + + // To write each character, shift the 3 byte (24 bits) chunk + // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) + // and apply logical AND with 0x3F to bitmask the least significant 6 bits. + // Use this as an index into the lookup table, mload an entire word + // so the desired character is in the least significant byte, and + // mstore8 this least significant byte into the result and continue. + + mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) + resultPtr := add(resultPtr, 1) // Advance + + mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) + resultPtr := add(resultPtr, 1) // Advance + + mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) + resultPtr := add(resultPtr, 1) // Advance + + mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) + resultPtr := add(resultPtr, 1) // Advance + } + + // Reset the value that was cached + mstore(afterPtr, afterCache) + + // When data `bytes` is not exactly 3 bytes long + // it is padded with `=` characters at the end + switch mod(mload(data), 3) + case 1 { + mstore8(sub(resultPtr, 1), 0x3d) + mstore8(sub(resultPtr, 2), 0x3d) + } + case 2 { + mstore8(sub(resultPtr, 1), 0x3d) + } + } + + return result; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Context.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Context.sol new file mode 100644 index 0000000..4e535fe --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Context.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address) { + return msg.sender; + } + + function _msgData() internal view virtual returns (bytes calldata) { + return msg.data; + } + + function _contextSuffixLength() internal view virtual returns (uint256) { + return 0; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Pausable.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Pausable.sol new file mode 100644 index 0000000..312f1cb --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Pausable.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) + +pragma solidity ^0.8.20; + +import {Context} from "../utils/Context.sol"; + +/** + * @dev Contract module which allows children to implement an emergency stop + * mechanism that can be triggered by an authorized account. + * + * This module is used through inheritance. It will make available the + * modifiers `whenNotPaused` and `whenPaused`, which can be applied to + * the functions of your contract. Note that they will not be pausable by + * simply including this module, only once the modifiers are put in place. + */ +abstract contract Pausable is Context { + bool private _paused; + + /** + * @dev Emitted when the pause is triggered by `account`. + */ + event Paused(address account); + + /** + * @dev Emitted when the pause is lifted by `account`. + */ + event Unpaused(address account); + + /** + * @dev The operation failed because the contract is paused. + */ + error EnforcedPause(); + + /** + * @dev The operation failed because the contract is not paused. + */ + error ExpectedPause(); + + /** + * @dev Initializes the contract in unpaused state. + */ + constructor() { + _paused = false; + } + + /** + * @dev Modifier to make a function callable only when the contract is not paused. + * + * Requirements: + * + * - The contract must not be paused. + */ + modifier whenNotPaused() { + _requireNotPaused(); + _; + } + + /** + * @dev Modifier to make a function callable only when the contract is paused. + * + * Requirements: + * + * - The contract must be paused. + */ + modifier whenPaused() { + _requirePaused(); + _; + } + + /** + * @dev Returns true if the contract is paused, and false otherwise. + */ + function paused() public view virtual returns (bool) { + return _paused; + } + + /** + * @dev Throws if the contract is paused. + */ + function _requireNotPaused() internal view virtual { + if (paused()) { + revert EnforcedPause(); + } + } + + /** + * @dev Throws if the contract is not paused. + */ + function _requirePaused() internal view virtual { + if (!paused()) { + revert ExpectedPause(); + } + } + + /** + * @dev Triggers stopped state. + * + * Requirements: + * + * - The contract must not be paused. + */ + function _pause() internal virtual whenNotPaused { + _paused = true; + emit Paused(_msgSender()); + } + + /** + * @dev Returns to normal state. + * + * Requirements: + * + * - The contract must be paused. + */ + function _unpause() internal virtual whenPaused { + _paused = false; + emit Unpaused(_msgSender()); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/ReentrancyGuard.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/ReentrancyGuard.sol new file mode 100644 index 0000000..291d92f --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/ReentrancyGuard.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuard { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant NOT_ENTERED = 1; + uint256 private constant ENTERED = 2; + + uint256 private _status; + + /** + * @dev Unauthorized reentrant call. + */ + error ReentrancyGuardReentrantCall(); + + constructor() { + _status = NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and making it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + _nonReentrantBefore(); + _; + _nonReentrantAfter(); + } + + function _nonReentrantBefore() private { + // On the first call to nonReentrant, _status will be NOT_ENTERED + if (_status == ENTERED) { + revert ReentrancyGuardReentrantCall(); + } + + // Any calls to nonReentrant after this point will fail + _status = ENTERED; + } + + function _nonReentrantAfter() private { + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + _status = NOT_ENTERED; + } + + /** + * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a + * `nonReentrant` function in the call stack. + */ + function _reentrancyGuardEntered() internal view returns (bool) { + return _status == ENTERED; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/ShortStrings.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/ShortStrings.sol new file mode 100644 index 0000000..fdfe774 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/ShortStrings.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/ShortStrings.sol) + +pragma solidity ^0.8.20; + +import {StorageSlot} from "./StorageSlot.sol"; + +// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | +// | length | 0x BB | +type ShortString is bytes32; + +/** + * @dev This library provides functions to convert short memory strings + * into a `ShortString` type that can be used as an immutable variable. + * + * Strings of arbitrary length can be optimized using this library if + * they are short enough (up to 31 bytes) by packing them with their + * length (1 byte) in a single EVM word (32 bytes). Additionally, a + * fallback mechanism can be used for every other case. + * + * Usage example: + * + * ```solidity + * contract Named { + * using ShortStrings for *; + * + * ShortString private immutable _name; + * string private _nameFallback; + * + * constructor(string memory contractName) { + * _name = contractName.toShortStringWithFallback(_nameFallback); + * } + * + * function name() external view returns (string memory) { + * return _name.toStringWithFallback(_nameFallback); + * } + * } + * ``` + */ +library ShortStrings { + // Used as an identifier for strings longer than 31 bytes. + bytes32 private constant FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF; + + error StringTooLong(string str); + error InvalidShortString(); + + /** + * @dev Encode a string of at most 31 chars into a `ShortString`. + * + * This will trigger a `StringTooLong` error is the input string is too long. + */ + function toShortString(string memory str) internal pure returns (ShortString) { + bytes memory bstr = bytes(str); + if (bstr.length > 31) { + revert StringTooLong(str); + } + return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length)); + } + + /** + * @dev Decode a `ShortString` back to a "normal" string. + */ + function toString(ShortString sstr) internal pure returns (string memory) { + uint256 len = byteLength(sstr); + // using `new string(len)` would work locally but is not memory safe. + string memory str = new string(32); + /// @solidity memory-safe-assembly + assembly { + mstore(str, len) + mstore(add(str, 0x20), sstr) + } + return str; + } + + /** + * @dev Return the length of a `ShortString`. + */ + function byteLength(ShortString sstr) internal pure returns (uint256) { + uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF; + if (result > 31) { + revert InvalidShortString(); + } + return result; + } + + /** + * @dev Encode a string into a `ShortString`, or write it to storage if it is too long. + */ + function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) { + if (bytes(value).length < 32) { + return toShortString(value); + } else { + StorageSlot.getStringSlot(store).value = value; + return ShortString.wrap(FALLBACK_SENTINEL); + } + } + + /** + * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}. + */ + function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) { + if (ShortString.unwrap(value) != FALLBACK_SENTINEL) { + return toString(value); + } else { + return store; + } + } + + /** + * @dev Return the length of a string that was encoded to `ShortString` or written to storage using + * {setWithFallback}. + * + * WARNING: This will return the "byte length" of the string. This may not reflect the actual length in terms of + * actual characters as the UTF-8 encoding of a single character can span over multiple bytes. + */ + function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) { + if (ShortString.unwrap(value) != FALLBACK_SENTINEL) { + return byteLength(value); + } else { + return bytes(store).length; + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/StorageSlot.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/StorageSlot.sol new file mode 100644 index 0000000..0841832 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/StorageSlot.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol) +// This file was procedurally generated from scripts/generate/templates/StorageSlot.js. + +pragma solidity ^0.8.20; + +/** + * @dev Library for reading and writing primitive types to specific storage slots. + * + * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. + * This library helps with reading and writing to such slots without the need for inline assembly. + * + * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. + * + * Example usage to set ERC1967 implementation slot: + * ```solidity + * contract ERC1967 { + * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + * + * function _getImplementation() internal view returns (address) { + * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; + * } + * + * function _setImplementation(address newImplementation) internal { + * require(newImplementation.code.length > 0); + * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; + * } + * } + * ``` + */ +library StorageSlot { + struct AddressSlot { + address value; + } + + struct BooleanSlot { + bool value; + } + + struct Bytes32Slot { + bytes32 value; + } + + struct Uint256Slot { + uint256 value; + } + + struct StringSlot { + string value; + } + + struct BytesSlot { + bytes value; + } + + /** + * @dev Returns an `AddressSlot` with member `value` located at `slot`. + */ + function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `BooleanSlot` with member `value` located at `slot`. + */ + function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. + */ + function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `Uint256Slot` with member `value` located at `slot`. + */ + function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `StringSlot` with member `value` located at `slot`. + */ + function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `StringSlot` representation of the string storage pointer `store`. + */ + function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := store.slot + } + } + + /** + * @dev Returns an `BytesSlot` with member `value` located at `slot`. + */ + function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. + */ + function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := store.slot + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Strings.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Strings.sol new file mode 100644 index 0000000..b2c0a40 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/Strings.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) + +pragma solidity ^0.8.20; + +import {Math} from "./math/Math.sol"; +import {SignedMath} from "./math/SignedMath.sol"; + +/** + * @dev String operations. + */ +library Strings { + bytes16 private constant HEX_DIGITS = "0123456789abcdef"; + uint8 private constant ADDRESS_LENGTH = 20; + + /** + * @dev The `value` string doesn't fit in the specified `length`. + */ + error StringsInsufficientHexLength(uint256 value, uint256 length); + + /** + * @dev Converts a `uint256` to its ASCII `string` decimal representation. + */ + function toString(uint256 value) internal pure returns (string memory) { + unchecked { + uint256 length = Math.log10(value) + 1; + string memory buffer = new string(length); + uint256 ptr; + /// @solidity memory-safe-assembly + assembly { + ptr := add(buffer, add(32, length)) + } + while (true) { + ptr--; + /// @solidity memory-safe-assembly + assembly { + mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) + } + value /= 10; + if (value == 0) break; + } + return buffer; + } + } + + /** + * @dev Converts a `int256` to its ASCII `string` decimal representation. + */ + function toStringSigned(int256 value) internal pure returns (string memory) { + return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. + */ + function toHexString(uint256 value) internal pure returns (string memory) { + unchecked { + return toHexString(value, Math.log256(value) + 1); + } + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. + */ + function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { + uint256 localValue = value; + bytes memory buffer = new bytes(2 * length + 2); + buffer[0] = "0"; + buffer[1] = "x"; + for (uint256 i = 2 * length + 1; i > 1; --i) { + buffer[i] = HEX_DIGITS[localValue & 0xf]; + localValue >>= 4; + } + if (localValue != 0) { + revert StringsInsufficientHexLength(value, length); + } + return string(buffer); + } + + /** + * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal + * representation. + */ + function toHexString(address addr) internal pure returns (string memory) { + return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); + } + + /** + * @dev Returns true if the two strings are equal. + */ + function equal(string memory a, string memory b) internal pure returns (bool) { + return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/cryptography/ECDSA.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/cryptography/ECDSA.sol new file mode 100644 index 0000000..04b3e5e --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/cryptography/ECDSA.sol @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. + * + * These functions can be used to verify that a message was signed by the holder + * of the private keys of a given address. + */ +library ECDSA { + enum RecoverError { + NoError, + InvalidSignature, + InvalidSignatureLength, + InvalidSignatureS + } + + /** + * @dev The signature derives the `address(0)`. + */ + error ECDSAInvalidSignature(); + + /** + * @dev The signature has an invalid length. + */ + error ECDSAInvalidSignatureLength(uint256 length); + + /** + * @dev The signature has an S value that is in the upper half order. + */ + error ECDSAInvalidSignatureS(bytes32 s); + + /** + * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not + * return address(0) without also returning an error description. Errors are documented using an enum (error type) + * and a bytes32 providing additional information about the error. + * + * If no error is returned, then the address can be used for verification purposes. + * + * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: + * this function rejects them by requiring the `s` value to be in the lower + * half order, and the `v` value to be either 27 or 28. + * + * IMPORTANT: `hash` _must_ be the result of a hash operation for the + * verification to be secure: it is possible to craft signatures that + * recover to arbitrary addresses for non-hashed data. A safe way to ensure + * this is by receiving a hash of the original message (which may otherwise + * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. + * + * Documentation for signature generation: + * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] + * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] + */ + function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) { + if (signature.length == 65) { + bytes32 r; + bytes32 s; + uint8 v; + // ecrecover takes the signature parameters, and the only way to get them + // currently is to use assembly. + /// @solidity memory-safe-assembly + assembly { + r := mload(add(signature, 0x20)) + s := mload(add(signature, 0x40)) + v := byte(0, mload(add(signature, 0x60))) + } + return tryRecover(hash, v, r, s); + } else { + return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length)); + } + } + + /** + * @dev Returns the address that signed a hashed message (`hash`) with + * `signature`. This address can then be used for verification purposes. + * + * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: + * this function rejects them by requiring the `s` value to be in the lower + * half order, and the `v` value to be either 27 or 28. + * + * IMPORTANT: `hash` _must_ be the result of a hash operation for the + * verification to be secure: it is possible to craft signatures that + * recover to arbitrary addresses for non-hashed data. A safe way to ensure + * this is by receiving a hash of the original message (which may otherwise + * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. + */ + function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { + (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature); + _throwError(error, errorArg); + return recovered; + } + + /** + * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. + * + * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] + */ + function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) { + unchecked { + bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); + // We do not check for an overflow here since the shift operation results in 0 or 1. + uint8 v = uint8((uint256(vs) >> 255) + 27); + return tryRecover(hash, v, r, s); + } + } + + /** + * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. + */ + function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { + (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs); + _throwError(error, errorArg); + return recovered; + } + + /** + * @dev Overload of {ECDSA-tryRecover} that receives the `v`, + * `r` and `s` signature fields separately. + */ + function tryRecover( + bytes32 hash, + uint8 v, + bytes32 r, + bytes32 s + ) internal pure returns (address, RecoverError, bytes32) { + // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature + // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines + // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most + // signatures from current libraries generate a unique signature with an s-value in the lower half order. + // + // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value + // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or + // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept + // these malleable signatures as well. + if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { + return (address(0), RecoverError.InvalidSignatureS, s); + } + + // If the signature is valid (and not malleable), return the signer address + address signer = ecrecover(hash, v, r, s); + if (signer == address(0)) { + return (address(0), RecoverError.InvalidSignature, bytes32(0)); + } + + return (signer, RecoverError.NoError, bytes32(0)); + } + + /** + * @dev Overload of {ECDSA-recover} that receives the `v`, + * `r` and `s` signature fields separately. + */ + function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { + (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s); + _throwError(error, errorArg); + return recovered; + } + + /** + * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided. + */ + function _throwError(RecoverError error, bytes32 errorArg) private pure { + if (error == RecoverError.NoError) { + return; // no error: do nothing + } else if (error == RecoverError.InvalidSignature) { + revert ECDSAInvalidSignature(); + } else if (error == RecoverError.InvalidSignatureLength) { + revert ECDSAInvalidSignatureLength(uint256(errorArg)); + } else if (error == RecoverError.InvalidSignatureS) { + revert ECDSAInvalidSignatureS(errorArg); + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/cryptography/EIP712.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/cryptography/EIP712.sol new file mode 100644 index 0000000..8e548cd --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/cryptography/EIP712.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/EIP712.sol) + +pragma solidity ^0.8.20; + +import {MessageHashUtils} from "./MessageHashUtils.sol"; +import {ShortStrings, ShortString} from "../ShortStrings.sol"; +import {IERC5267} from "../../interfaces/IERC5267.sol"; + +/** + * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. + * + * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose + * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract + * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to + * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`. + * + * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding + * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA + * ({_hashTypedDataV4}). + * + * The implementation of the domain separator was designed to be as efficient as possible while still properly updating + * the chain id to protect against replay attacks on an eventual fork of the chain. + * + * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method + * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. + * + * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain + * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the + * separator from the immutable values, which is cheaper than accessing a cached version in cold storage. + * + * @custom:oz-upgrades-unsafe-allow state-variable-immutable + */ +abstract contract EIP712 is IERC5267 { + using ShortStrings for *; + + bytes32 private constant TYPE_HASH = + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); + + // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to + // invalidate the cached domain separator if the chain id changes. + bytes32 private immutable _cachedDomainSeparator; + uint256 private immutable _cachedChainId; + address private immutable _cachedThis; + + bytes32 private immutable _hashedName; + bytes32 private immutable _hashedVersion; + + ShortString private immutable _name; + ShortString private immutable _version; + string private _nameFallback; + string private _versionFallback; + + /** + * @dev Initializes the domain separator and parameter caches. + * + * The meaning of `name` and `version` is specified in + * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: + * + * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. + * - `version`: the current major version of the signing domain. + * + * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart + * contract upgrade]. + */ + constructor(string memory name, string memory version) { + _name = name.toShortStringWithFallback(_nameFallback); + _version = version.toShortStringWithFallback(_versionFallback); + _hashedName = keccak256(bytes(name)); + _hashedVersion = keccak256(bytes(version)); + + _cachedChainId = block.chainid; + _cachedDomainSeparator = _buildDomainSeparator(); + _cachedThis = address(this); + } + + /** + * @dev Returns the domain separator for the current chain. + */ + function _domainSeparatorV4() internal view returns (bytes32) { + if (address(this) == _cachedThis && block.chainid == _cachedChainId) { + return _cachedDomainSeparator; + } else { + return _buildDomainSeparator(); + } + } + + function _buildDomainSeparator() private view returns (bytes32) { + return keccak256(abi.encode(TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this))); + } + + /** + * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this + * function returns the hash of the fully encoded EIP712 message for this domain. + * + * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: + * + * ```solidity + * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( + * keccak256("Mail(address to,string contents)"), + * mailTo, + * keccak256(bytes(mailContents)) + * ))); + * address signer = ECDSA.recover(digest, signature); + * ``` + */ + function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { + return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash); + } + + /** + * @dev See {IERC-5267}. + */ + function eip712Domain() + public + view + virtual + returns ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 salt, + uint256[] memory extensions + ) + { + return ( + hex"0f", // 01111 + _EIP712Name(), + _EIP712Version(), + block.chainid, + address(this), + bytes32(0), + new uint256[](0) + ); + } + + /** + * @dev The name parameter for the EIP712 domain. + * + * NOTE: By default this function reads _name which is an immutable value. + * It only reads from storage if necessary (in case the value is too large to fit in a ShortString). + */ + // solhint-disable-next-line func-name-mixedcase + function _EIP712Name() internal view returns (string memory) { + return _name.toStringWithFallback(_nameFallback); + } + + /** + * @dev The version parameter for the EIP712 domain. + * + * NOTE: By default this function reads _version which is an immutable value. + * It only reads from storage if necessary (in case the value is too large to fit in a ShortString). + */ + // solhint-disable-next-line func-name-mixedcase + function _EIP712Version() internal view returns (string memory) { + return _version.toStringWithFallback(_versionFallback); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol new file mode 100644 index 0000000..8836693 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MessageHashUtils.sol) + +pragma solidity ^0.8.20; + +import {Strings} from "../Strings.sol"; + +/** + * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing. + * + * The library provides methods for generating a hash of a message that conforms to the + * https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712] + * specifications. + */ +library MessageHashUtils { + /** + * @dev Returns the keccak256 digest of an EIP-191 signed data with version + * `0x45` (`personal_sign` messages). + * + * The digest is calculated by prefixing a bytes32 `messageHash` with + * `"\x19Ethereum Signed Message:\n32"` and hashing the result. It corresponds with the + * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method. + * + * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with + * keccak256, although any bytes32 value can be safely used because the final digest will + * be re-hashed. + * + * See {ECDSA-recover}. + */ + function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) { + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, "\x19Ethereum Signed Message:\n32") // 32 is the bytes-length of messageHash + mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix + digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20) + } + } + + /** + * @dev Returns the keccak256 digest of an EIP-191 signed data with version + * `0x45` (`personal_sign` messages). + * + * The digest is calculated by prefixing an arbitrary `message` with + * `"\x19Ethereum Signed Message:\n" + len(message)` and hashing the result. It corresponds with the + * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method. + * + * See {ECDSA-recover}. + */ + function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) { + return + keccak256(bytes.concat("\x19Ethereum Signed Message:\n", bytes(Strings.toString(message.length)), message)); + } + + /** + * @dev Returns the keccak256 digest of an EIP-191 signed data with version + * `0x00` (data with intended validator). + * + * The digest is calculated by prefixing an arbitrary `data` with `"\x19\x00"` and the intended + * `validator` address. Then hashing the result. + * + * See {ECDSA-recover}. + */ + function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(hex"19_00", validator, data)); + } + + /** + * @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`). + * + * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with + * `\x19\x01` and hashing the result. It corresponds to the hash signed by the + * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712. + * + * See {ECDSA-recover}. + */ + function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) { + /// @solidity memory-safe-assembly + assembly { + let ptr := mload(0x40) + mstore(ptr, hex"19_01") + mstore(add(ptr, 0x02), domainSeparator) + mstore(add(ptr, 0x22), structHash) + digest := keccak256(ptr, 0x42) + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/introspection/ERC165.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/introspection/ERC165.sol new file mode 100644 index 0000000..1e77b60 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/introspection/ERC165.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "./IERC165.sol"; + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + */ +abstract contract ERC165 is IERC165 { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/introspection/IERC165.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/introspection/IERC165.sol new file mode 100644 index 0000000..c09f31f --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/introspection/IERC165.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[EIP]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/math/Math.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/math/Math.sol new file mode 100644 index 0000000..9681524 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/math/Math.sol @@ -0,0 +1,415 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Standard math utilities missing in the Solidity language. + */ +library Math { + /** + * @dev Muldiv operation overflow. + */ + error MathOverflowedMulDiv(); + + enum Rounding { + Floor, // Toward negative infinity + Ceil, // Toward positive infinity + Trunc, // Toward zero + Expand // Away from zero + } + + /** + * @dev Returns the addition of two unsigned integers, with an overflow flag. + */ + function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + uint256 c = a + b; + if (c < a) return (false, 0); + return (true, c); + } + } + + /** + * @dev Returns the subtraction of two unsigned integers, with an overflow flag. + */ + function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + if (b > a) return (false, 0); + return (true, a - b); + } + } + + /** + * @dev Returns the multiplication of two unsigned integers, with an overflow flag. + */ + function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) return (true, 0); + uint256 c = a * b; + if (c / a != b) return (false, 0); + return (true, c); + } + } + + /** + * @dev Returns the division of two unsigned integers, with a division by zero flag. + */ + function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + if (b == 0) return (false, 0); + return (true, a / b); + } + } + + /** + * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. + */ + function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + if (b == 0) return (false, 0); + return (true, a % b); + } + } + + /** + * @dev Returns the largest of two numbers. + */ + function max(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a : b; + } + + /** + * @dev Returns the smallest of two numbers. + */ + function min(uint256 a, uint256 b) internal pure returns (uint256) { + return a < b ? a : b; + } + + /** + * @dev Returns the average of two numbers. The result is rounded towards + * zero. + */ + function average(uint256 a, uint256 b) internal pure returns (uint256) { + // (a + b) / 2 can overflow. + return (a & b) + (a ^ b) / 2; + } + + /** + * @dev Returns the ceiling of the division of two numbers. + * + * This differs from standard division with `/` in that it rounds towards infinity instead + * of rounding towards zero. + */ + function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { + if (b == 0) { + // Guarantee the same behavior as in a regular Solidity division. + return a / b; + } + + // (a + b - 1) / b can overflow on addition, so we distribute. + return a == 0 ? 0 : (a - 1) / b + 1; + } + + /** + * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or + * denominator == 0. + * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by + * Uniswap Labs also under MIT license. + */ + function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { + unchecked { + // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use + // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 + // variables such that product = prod1 * 2^256 + prod0. + uint256 prod0 = x * y; // Least significant 256 bits of the product + uint256 prod1; // Most significant 256 bits of the product + assembly { + let mm := mulmod(x, y, not(0)) + prod1 := sub(sub(mm, prod0), lt(mm, prod0)) + } + + // Handle non-overflow cases, 256 by 256 division. + if (prod1 == 0) { + // Solidity will revert if denominator == 0, unlike the div opcode on its own. + // The surrounding unchecked block does not change this fact. + // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. + return prod0 / denominator; + } + + // Make sure the result is less than 2^256. Also prevents denominator == 0. + if (denominator <= prod1) { + revert MathOverflowedMulDiv(); + } + + /////////////////////////////////////////////// + // 512 by 256 division. + /////////////////////////////////////////////// + + // Make division exact by subtracting the remainder from [prod1 prod0]. + uint256 remainder; + assembly { + // Compute remainder using mulmod. + remainder := mulmod(x, y, denominator) + + // Subtract 256 bit number from 512 bit number. + prod1 := sub(prod1, gt(remainder, prod0)) + prod0 := sub(prod0, remainder) + } + + // Factor powers of two out of denominator and compute largest power of two divisor of denominator. + // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. + + uint256 twos = denominator & (0 - denominator); + assembly { + // Divide denominator by twos. + denominator := div(denominator, twos) + + // Divide [prod1 prod0] by twos. + prod0 := div(prod0, twos) + + // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. + twos := add(div(sub(0, twos), twos), 1) + } + + // Shift in bits from prod1 into prod0. + prod0 |= prod1 * twos; + + // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such + // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for + // four bits. That is, denominator * inv = 1 mod 2^4. + uint256 inverse = (3 * denominator) ^ 2; + + // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also + // works in modular arithmetic, doubling the correct bits in each step. + inverse *= 2 - denominator * inverse; // inverse mod 2^8 + inverse *= 2 - denominator * inverse; // inverse mod 2^16 + inverse *= 2 - denominator * inverse; // inverse mod 2^32 + inverse *= 2 - denominator * inverse; // inverse mod 2^64 + inverse *= 2 - denominator * inverse; // inverse mod 2^128 + inverse *= 2 - denominator * inverse; // inverse mod 2^256 + + // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. + // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is + // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 + // is no longer required. + result = prod0 * inverse; + return result; + } + } + + /** + * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. + */ + function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { + uint256 result = mulDiv(x, y, denominator); + if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { + result += 1; + } + return result; + } + + /** + * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded + * towards zero. + * + * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). + */ + function sqrt(uint256 a) internal pure returns (uint256) { + if (a == 0) { + return 0; + } + + // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. + // + // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have + // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. + // + // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` + // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` + // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` + // + // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. + uint256 result = 1 << (log2(a) >> 1); + + // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, + // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at + // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision + // into the expected uint128 result. + unchecked { + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + return min(result, a / result); + } + } + + /** + * @notice Calculates sqrt(a), following the selected rounding direction. + */ + function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = sqrt(a); + return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); + } + } + + /** + * @dev Return the log in base 2 of a positive value rounded towards zero. + * Returns 0 if given 0. + */ + function log2(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >> 128 > 0) { + value >>= 128; + result += 128; + } + if (value >> 64 > 0) { + value >>= 64; + result += 64; + } + if (value >> 32 > 0) { + value >>= 32; + result += 32; + } + if (value >> 16 > 0) { + value >>= 16; + result += 16; + } + if (value >> 8 > 0) { + value >>= 8; + result += 8; + } + if (value >> 4 > 0) { + value >>= 4; + result += 4; + } + if (value >> 2 > 0) { + value >>= 2; + result += 2; + } + if (value >> 1 > 0) { + result += 1; + } + } + return result; + } + + /** + * @dev Return the log in base 2, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log2(value); + return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); + } + } + + /** + * @dev Return the log in base 10 of a positive value rounded towards zero. + * Returns 0 if given 0. + */ + function log10(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >= 10 ** 64) { + value /= 10 ** 64; + result += 64; + } + if (value >= 10 ** 32) { + value /= 10 ** 32; + result += 32; + } + if (value >= 10 ** 16) { + value /= 10 ** 16; + result += 16; + } + if (value >= 10 ** 8) { + value /= 10 ** 8; + result += 8; + } + if (value >= 10 ** 4) { + value /= 10 ** 4; + result += 4; + } + if (value >= 10 ** 2) { + value /= 10 ** 2; + result += 2; + } + if (value >= 10 ** 1) { + result += 1; + } + } + return result; + } + + /** + * @dev Return the log in base 10, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log10(value); + return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); + } + } + + /** + * @dev Return the log in base 256 of a positive value rounded towards zero. + * Returns 0 if given 0. + * + * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. + */ + function log256(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >> 128 > 0) { + value >>= 128; + result += 16; + } + if (value >> 64 > 0) { + value >>= 64; + result += 8; + } + if (value >> 32 > 0) { + value >>= 32; + result += 4; + } + if (value >> 16 > 0) { + value >>= 16; + result += 2; + } + if (value >> 8 > 0) { + result += 1; + } + } + return result; + } + + /** + * @dev Return the log in base 256, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log256(value); + return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); + } + } + + /** + * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. + */ + function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { + return uint8(rounding) % 2 == 1; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/math/SignedMath.sol b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/math/SignedMath.sol new file mode 100644 index 0000000..66a6151 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/@openzeppelin/contracts/utils/math/SignedMath.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Standard signed math utilities missing in the Solidity language. + */ +library SignedMath { + /** + * @dev Returns the largest of two signed numbers. + */ + function max(int256 a, int256 b) internal pure returns (int256) { + return a > b ? a : b; + } + + /** + * @dev Returns the smallest of two signed numbers. + */ + function min(int256 a, int256 b) internal pure returns (int256) { + return a < b ? a : b; + } + + /** + * @dev Returns the average of two signed numbers without overflow. + * The result is rounded towards zero. + */ + function average(int256 a, int256 b) internal pure returns (int256) { + // Formula from the book "Hacker's Delight" + int256 x = (a & b) + ((a ^ b) >> 1); + return x + (int256(uint256(x) >> 255) & (a ^ b)); + } + + /** + * @dev Returns the absolute unsigned value of a signed value. + */ + function abs(int256 n) internal pure returns (uint256) { + unchecked { + // must be unchecked in order to support `n = type(int256).min` + return uint256(n >= 0 ? n : -n); + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/AlltraCustomBridge.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/AlltraCustomBridge.sol new file mode 100644 index 0000000..6a1aca6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/AlltraCustomBridge.sol @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./interfaces/IAlltraTransport.sol"; + +/** + * @title AlltraCustomBridge + * @notice Custom transport for 138 <-> ALL Mainnet (651940). Locks tokens and emits event; no CCIP. + * @dev Deploy at same address on 138 and 651940 via CREATE2. On 138: lock + emit LockForAlltra. + * Off-chain relayer or contract on 651940 completes mint/unlock. On 651940: implement + * unlockOrMint (called by relayer or same contract) to complete the flow. + */ +contract AlltraCustomBridge is IAlltraTransport, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE"); + uint256 public constant ALL_MAINNET_CHAIN_ID = 651940; + + mapping(bytes32 => LockRecord) public locks; + mapping(bytes32 => bool) public releasedOnAlltra; // on 651940: prevent double release + mapping(address => uint256) public nonces; + bool private _hasRelayer; + + struct LockRecord { + address sender; + address token; + uint256 amount; + address recipient; + uint256 createdAt; + bool released; + } + + event LockForAlltra( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + address recipient, + uint256 sourceChainId + ); + + event UnlockOnAlltra( + bytes32 indexed requestId, + address indexed recipient, + address indexed token, + uint256 amount + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(RELAYER_ROLE, admin); + _hasRelayer = true; + } + + /** + * @notice Lock tokens and emit event for relay to ALL Mainnet. Does not use CCIP. + */ + function lockAndRelay( + address token, + uint256 amount, + address recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(recipient != address(0), "zero recipient"); + require(amount > 0, "zero amount"); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + recipient, + nonces[msg.sender]++, + block.chainid, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "insufficient value"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + locks[requestId] = LockRecord({ + sender: msg.sender, + token: token, + amount: amount, + recipient: recipient, + createdAt: block.timestamp, + released: false + }); + + emit LockForAlltra(requestId, msg.sender, token, amount, recipient, block.chainid); + return requestId; + } + + function isConfigured() external view override returns (bool) { + return _hasRelayer; + } + + /** + * @notice On ALL Mainnet (651940): release tokens to recipient after relay proof. + * @dev Only RELAYER_ROLE; in production, verify merkle proof or signature from source chain. + * Uses releasedOnAlltra[requestId] to prevent double release on this chain. + */ + function releaseOnAlltra( + bytes32 requestId, + address token, + uint256 amount, + address recipient + ) external onlyRole(RELAYER_ROLE) nonReentrant { + require(!releasedOnAlltra[requestId], "already released"); + releasedOnAlltra[requestId] = true; + + if (token == address(0)) { + (bool sent,) = payable(recipient).call{value: amount}(""); + require(sent, "transfer failed"); + } else { + IERC20(token).safeTransfer(recipient, amount); + } + + emit UnlockOnAlltra(requestId, recipient, token, amount); + } + + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/BridgeOrchestrator.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/BridgeOrchestrator.sol new file mode 100644 index 0000000..327ec2b --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/BridgeOrchestrator.sol @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../registry/UniversalAssetRegistry.sol"; +import "./UniversalCCIPBridge.sol"; + +/** + * @title BridgeOrchestrator + * @notice Routes bridge requests to appropriate asset-specific bridges + * @dev Central routing layer for multi-asset bridge system + */ +contract BridgeOrchestrator is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant ROUTER_ADMIN_ROLE = keccak256("ROUTER_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + // Core dependencies + UniversalAssetRegistry public assetRegistry; + UniversalCCIPBridge public defaultBridge; + + // Asset type to bridge mapping + mapping(bytes32 => address) public assetTypeToBridge; + mapping(address => bool) public isRegisteredBridge; + + // Routing statistics + struct RoutingStats { + uint256 totalBridges; + uint256 successfulBridges; + uint256 failedBridges; + uint256 lastBridgeTime; + } + + mapping(address => RoutingStats) public bridgeStats; + mapping(UniversalAssetRegistry.AssetType => RoutingStats) public assetTypeStats; + + event BridgeRouted( + address indexed token, + UniversalAssetRegistry.AssetType assetType, + address indexed bridgeContract, + bytes32 indexed messageId + ); + + event AssetTypeBridgeRegistered( + bytes32 indexed assetTypeHash, + UniversalAssetRegistry.AssetType assetType, + address bridgeContract + ); + + event BridgeUnregistered( + bytes32 indexed assetTypeHash, + address bridgeContract + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + address _assetRegistry, + address _defaultBridge, + address admin + ) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + require(_assetRegistry != address(0), "Zero registry"); + require(_defaultBridge != address(0), "Zero bridge"); + + assetRegistry = UniversalAssetRegistry(_assetRegistry); + defaultBridge = UniversalCCIPBridge(payable(_defaultBridge)); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ROUTER_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Route bridge request to appropriate bridge + */ + function bridge( + UniversalCCIPBridge.BridgeOperation calldata op + ) external payable returns (bytes32 messageId) { + // Get asset information + UniversalAssetRegistry.UniversalAsset memory asset = assetRegistry.getAsset(op.token); + require(asset.isActive, "Asset not active"); + + // Get bridge contract for this asset type + bytes32 assetTypeHash = bytes32(uint256(asset.assetType)); + address bridgeContract = assetTypeToBridge[assetTypeHash]; + + // Use default bridge if no specialized bridge + if (bridgeContract == address(0)) { + bridgeContract = address(defaultBridge); + } + + require(isRegisteredBridge[bridgeContract], "Bridge not registered"); + + // Forward call to specialized bridge + (bool success, bytes memory data) = bridgeContract.call{value: msg.value}( + abi.encodeWithSelector( + UniversalCCIPBridge.bridge.selector, + op + ) + ); + + require(success, "Bridge call failed"); + messageId = abi.decode(data, (bytes32)); + + // Update statistics + _updateStats(bridgeContract, asset.assetType, true); + + emit BridgeRouted(op.token, asset.assetType, bridgeContract, messageId); + + return messageId; + } + + /** + * @notice Register asset type bridge + */ + function registerAssetTypeBridge( + UniversalAssetRegistry.AssetType assetType, + address bridgeContract + ) external onlyRole(ROUTER_ADMIN_ROLE) { + require(bridgeContract != address(0), "Zero address"); + require(bridgeContract.code.length > 0, "Not a contract"); + + bytes32 assetTypeHash = bytes32(uint256(assetType)); + assetTypeToBridge[assetTypeHash] = bridgeContract; + isRegisteredBridge[bridgeContract] = true; + + emit AssetTypeBridgeRegistered(assetTypeHash, assetType, bridgeContract); + } + + /** + * @notice Unregister bridge + */ + function unregisterBridge( + UniversalAssetRegistry.AssetType assetType + ) external onlyRole(ROUTER_ADMIN_ROLE) { + bytes32 assetTypeHash = bytes32(uint256(assetType)); + address bridgeContract = assetTypeToBridge[assetTypeHash]; + + delete assetTypeToBridge[assetTypeHash]; + // Note: We don't remove from isRegisteredBridge in case it's used elsewhere + + emit BridgeUnregistered(assetTypeHash, bridgeContract); + } + + /** + * @notice Update routing statistics + */ + function _updateStats( + address bridgeContract, + UniversalAssetRegistry.AssetType assetType, + bool success + ) internal { + RoutingStats storage bridgeStat = bridgeStats[bridgeContract]; + RoutingStats storage typeStat = assetTypeStats[assetType]; + + bridgeStat.totalBridges++; + typeStat.totalBridges++; + + if (success) { + bridgeStat.successfulBridges++; + typeStat.successfulBridges++; + } else { + bridgeStat.failedBridges++; + typeStat.failedBridges++; + } + + bridgeStat.lastBridgeTime = block.timestamp; + typeStat.lastBridgeTime = block.timestamp; + } + + /** + * @notice Set default bridge + */ + function setDefaultBridge(address _defaultBridge) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(_defaultBridge != address(0), "Zero address"); + defaultBridge = UniversalCCIPBridge(payable(_defaultBridge)); + isRegisteredBridge[_defaultBridge] = true; + } + + // View functions + + function getBridgeForAssetType(UniversalAssetRegistry.AssetType assetType) + external view returns (address) { + bytes32 assetTypeHash = bytes32(uint256(assetType)); + address bridge = assetTypeToBridge[assetTypeHash]; + return bridge != address(0) ? bridge : address(defaultBridge); + } + + function getBridgeStats(address bridgeContract) + external view returns (RoutingStats memory) { + return bridgeStats[bridgeContract]; + } + + function getAssetTypeStats(UniversalAssetRegistry.AssetType assetType) + external view returns (RoutingStats memory) { + return assetTypeStats[assetType]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/CommodityCCIPBridge.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/CommodityCCIPBridge.sol new file mode 100644 index 0000000..3565c92 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/CommodityCCIPBridge.sol @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "./UniversalCCIPBridge.sol"; + +/** + * @title CommodityCCIPBridge + * @notice Specialized bridge for commodity-backed tokens (gold, oil, etc.) + * @dev Includes certificate validation and physical delivery coordination + */ +contract CommodityCCIPBridge is UniversalCCIPBridge { + + // Certificate registry (authenticity verification) + mapping(address => mapping(bytes32 => bool)) public validCertificates; + mapping(address => mapping(bytes32 => CertificateInfo)) public certificates; + + struct CertificateInfo { + bytes32 certificateHash; + address custodian; + uint256 quantity; + string commodityType; + uint256 issuedAt; + uint256 expiresAt; + bool isValid; + } + + // Custodian registry + mapping(address => address) public tokenCustodians; + mapping(address => bool) public approvedCustodians; + + // Physical delivery tracking + struct DeliveryRequest { + bytes32 messageId; + address token; + uint256 amount; + address requester; + string deliveryAddress; + uint256 requestedAt; + DeliveryStatus status; + } + + enum DeliveryStatus { + Requested, + Confirmed, + InTransit, + Delivered, + Cancelled + } + + mapping(bytes32 => DeliveryRequest) public deliveryRequests; + bytes32[] public deliveryIds; + + event CertificateRegistered( + address indexed token, + bytes32 indexed certificateHash, + address custodian + ); + + event PhysicalDeliveryRequested( + bytes32 indexed deliveryId, + bytes32 indexed messageId, + address token, + uint256 amount + ); + + event DeliveryStatusUpdated( + bytes32 indexed deliveryId, + DeliveryStatus status + ); + + /** + * @notice Bridge commodity token with certificate validation + */ + function bridgeCommodity( + address token, + uint256 amount, + uint64 destinationChain, + address recipient, + bytes32 certificateHash, + bytes calldata custodianSignature + ) external nonReentrant returns (bytes32 messageId) { + // Verify asset is Commodity type + UniversalAssetRegistry.UniversalAsset memory asset = assetRegistry.getAsset(token); + require(asset.assetType == UniversalAssetRegistry.AssetType.Commodity, "Not commodity"); + require(asset.isActive, "Asset not active"); + + // Verify certificate + require(validCertificates[token][certificateHash], "Invalid certificate"); + + CertificateInfo memory cert = certificates[token][certificateHash]; + require(cert.isValid, "Certificate not valid"); + require(block.timestamp < cert.expiresAt, "Certificate expired"); + require(cert.quantity >= amount, "Certificate insufficient"); + + // Verify custodian + require(approvedCustodians[cert.custodian], "Custodian not approved"); + + // Verify custodian signature + _verifyCustodianSignature(token, amount, certificateHash, custodianSignature, cert.custodian); + + // Execute bridge + BridgeOperation memory op = BridgeOperation({ + token: token, + amount: amount, + destinationChain: destinationChain, + recipient: recipient, + assetType: bytes32(uint256(UniversalAssetRegistry.AssetType.Commodity)), + usePMM: true, // Commodities can use PMM + useVault: false, + complianceProof: abi.encode(certificateHash), + vaultInstructions: "" + }); + + messageId = this.bridge(op); + + return messageId; + } + + /** + * @notice Initiate physical delivery of commodity + */ + function initiatePhysicalDelivery( + bytes32 messageId, + string calldata deliveryAddress + ) external returns (bytes32 deliveryId) { + require(messageId != bytes32(0), "Invalid message ID"); + + deliveryId = keccak256(abi.encode(messageId, msg.sender, block.timestamp)); + + // This would integrate with off-chain logistics systems + deliveryRequests[deliveryId] = DeliveryRequest({ + messageId: messageId, + token: address(0), // Would be fetched from bridge record + amount: 0, // Would be fetched from bridge record + requester: msg.sender, + deliveryAddress: deliveryAddress, + requestedAt: block.timestamp, + status: DeliveryStatus.Requested + }); + + deliveryIds.push(deliveryId); + + emit PhysicalDeliveryRequested(deliveryId, messageId, address(0), 0); + + return deliveryId; + } + + /** + * @notice Update physical delivery status + */ + function updateDeliveryStatus( + bytes32 deliveryId, + DeliveryStatus status + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + require(deliveryRequests[deliveryId].requestedAt > 0, "Delivery not found"); + + deliveryRequests[deliveryId].status = status; + + emit DeliveryStatusUpdated(deliveryId, status); + } + + /** + * @notice Verify custodian signature + */ + function _verifyCustodianSignature( + address token, + uint256 amount, + bytes32 certificateHash, + bytes memory signature, + address custodian + ) internal view { + // In production, this would use EIP-712 signature verification + // For now, simplified check + require(signature.length > 0, "Missing signature"); + require(custodian != address(0), "Invalid custodian"); + } + + // Admin functions + + function registerCertificate( + address token, + bytes32 certificateHash, + address custodian, + uint256 quantity, + string calldata commodityType, + uint256 expiresAt + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + validCertificates[token][certificateHash] = true; + + certificates[token][certificateHash] = CertificateInfo({ + certificateHash: certificateHash, + custodian: custodian, + quantity: quantity, + commodityType: commodityType, + issuedAt: block.timestamp, + expiresAt: expiresAt, + isValid: true + }); + + emit CertificateRegistered(token, certificateHash, custodian); + } + + function approveCustodian(address custodian, bool approved) external onlyRole(DEFAULT_ADMIN_ROLE) { + approvedCustodians[custodian] = approved; + } + + function revokeCertificate(address token, bytes32 certificateHash) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + validCertificates[token][certificateHash] = false; + certificates[token][certificateHash].isValid = false; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/EtherlinkRelayReceiver.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/EtherlinkRelayReceiver.sol new file mode 100644 index 0000000..778abea --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/EtherlinkRelayReceiver.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title EtherlinkRelayReceiver + * @notice Relay-compatible receiver on Etherlink (chain 42793). Accepts relayMintOrUnlock from off-chain relay. + * @dev When CCIP does not support Etherlink, custom relay monitors source and calls this contract. + * Idempotency via messageId; only RELAYER_ROLE can call. + */ +contract EtherlinkRelayReceiver is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE"); + + mapping(bytes32 => bool) public processed; + + event RelayMintOrUnlock( + bytes32 indexed messageId, + address indexed token, + address indexed recipient, + uint256 amount + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(RELAYER_ROLE, admin); + } + + /** + * @notice Mint or unlock tokens to recipient. Only relayer; idempotent per messageId. + * @param messageId Source chain message id (for idempotency). + * @param token Token address (address(0) for native). + * @param recipient Recipient on Etherlink. + * @param amount Amount to transfer. + */ + function relayMintOrUnlock( + bytes32 messageId, + address token, + address recipient, + uint256 amount + ) external onlyRole(RELAYER_ROLE) nonReentrant { + require(!processed[messageId], "already processed"); + require(recipient != address(0), "zero recipient"); + require(amount > 0, "zero amount"); + processed[messageId] = true; + + if (token == address(0)) { + (bool sent,) = payable(recipient).call{value: amount}(""); + require(sent, "transfer failed"); + } else { + IERC20(token).safeTransfer(recipient, amount); + } + + emit RelayMintOrUnlock(messageId, token, recipient, amount); + } + + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/GRUCCIPBridge.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/GRUCCIPBridge.sol new file mode 100644 index 0000000..13d9eda --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/GRUCCIPBridge.sol @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "./UniversalCCIPBridge.sol"; +import "../vault/libraries/GRUConstants.sol"; + +/** + * @title GRUCCIPBridge + * @notice Specialized bridge for Global Reserve Unit (GRU) tokens + * @dev Supports layer conversions (M00/M0/M1) and XAU triangulation + */ +contract GRUCCIPBridge is UniversalCCIPBridge { + using GRUConstants for *; + + struct GRUBridgeOperation { + address token; + uint256 amount; + uint64 destinationChain; + address recipient; + string sourceLayer; + string targetLayer; + bool useXAUTriangulation; + } + + event GRULayerConversion( + bytes32 indexed messageId, + string sourceLayer, + string targetLayer, + uint256 sourceAmount, + uint256 targetAmount + ); + + event GRUCrossCurrencyBridge( + bytes32 indexed messageId, + address sourceToken, + address destToken, + uint256 amount + ); + + /** + * @notice Bridge GRU with layer conversion + */ + function bridgeGRUWithConversion( + address token, + string calldata sourceLayer, + uint256 amount, + uint64 destinationChain, + string calldata targetLayer, + address recipient + ) external nonReentrant returns (bytes32 messageId) { + require(GRUConstants.isValidGRULayer(sourceLayer), "Invalid source layer"); + require(GRUConstants.isValidGRULayer(targetLayer), "Invalid target layer"); + + UniversalAssetRegistry.UniversalAsset memory asset = assetRegistry.getAsset(token); + require(asset.assetType == UniversalAssetRegistry.AssetType.GRU, "Not GRU asset"); + require(asset.isActive, "Asset not active"); + + uint256 targetAmount = _convertGRULayers(sourceLayer, targetLayer, amount); + + BridgeOperation memory op = BridgeOperation({ + token: token, + amount: amount, + destinationChain: destinationChain, + recipient: recipient, + assetType: bytes32(uint256(UniversalAssetRegistry.AssetType.GRU)), + usePMM: false, + useVault: false, + complianceProof: "", + vaultInstructions: "" + }); + + messageId = this.bridge(op); + + emit GRULayerConversion(messageId, sourceLayer, targetLayer, amount, targetAmount); + + return messageId; + } + + /** + * @notice Convert between GRU layers + */ + function _convertGRULayers( + string memory sourceLayer, + string memory targetLayer, + uint256 amount + ) internal pure returns (uint256) { + bytes32 sourceHash = keccak256(bytes(sourceLayer)); + bytes32 targetHash = keccak256(bytes(targetLayer)); + bytes32 m00Hash = keccak256(bytes(GRUConstants.GRU_M00)); + bytes32 m0Hash = keccak256(bytes(GRUConstants.GRU_M0)); + bytes32 m1Hash = keccak256(bytes(GRUConstants.GRU_M1)); + + if (sourceHash == m00Hash && targetHash == m0Hash) { + return GRUConstants.m00ToM0(amount); + } + if (sourceHash == m00Hash && targetHash == m1Hash) { + return GRUConstants.m00ToM1(amount); + } + if (sourceHash == m0Hash && targetHash == m00Hash) { + return GRUConstants.m0ToM00(amount); + } + if (sourceHash == m0Hash && targetHash == m1Hash) { + return GRUConstants.m0ToM1(amount); + } + if (sourceHash == m1Hash && targetHash == m00Hash) { + return GRUConstants.m1ToM00(amount); + } + if (sourceHash == m1Hash && targetHash == m0Hash) { + return GRUConstants.m1ToM0(amount); + } + + return amount; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/ISO4217WCCIPBridge.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/ISO4217WCCIPBridge.sol new file mode 100644 index 0000000..8c624d8 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/ISO4217WCCIPBridge.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "./UniversalCCIPBridge.sol"; +import "../iso4217w/interfaces/IISO4217WToken.sol"; + +/** + * @title ISO4217WCCIPBridge + * @notice Specialized bridge for ISO-4217W eMoney/CBDC tokens + * @dev Enforces KYC compliance and reserve backing verification + */ +contract ISO4217WCCIPBridge is UniversalCCIPBridge { + + mapping(address => bool) public kycVerified; + mapping(address => uint256) public kycExpiration; + mapping(string => bool) public allowedJurisdictions; + mapping(address => string) public userJurisdictions; + mapping(address => uint256) public verifiedReserves; + + event KYCVerified(address indexed user, uint256 expirationTime); + event KYCRevoked(address indexed user); + event JurisdictionEnabled(string indexed jurisdiction); + event ReserveVerified(address indexed token, uint256 amount); + + function bridgeISO4217W( + address token, + uint256 amount, + uint64 destinationChain, + address recipient, + bytes calldata complianceProof + ) external nonReentrant returns (bytes32 messageId) { + UniversalAssetRegistry.UniversalAsset memory asset = assetRegistry.getAsset(token); + require(asset.assetType == UniversalAssetRegistry.AssetType.ISO4217W, "Not ISO-4217W"); + require(asset.isActive, "Asset not active"); + + require(_checkKYC(msg.sender), "KYC required"); + require(_checkKYC(recipient), "Recipient KYC required"); + + string memory senderJurisdiction = userJurisdictions[msg.sender]; + string memory recipientJurisdiction = userJurisdictions[recipient]; + require( + allowedJurisdictions[senderJurisdiction] && + allowedJurisdictions[recipientJurisdiction], + "Jurisdiction not allowed" + ); + + require(_verifyReserveBacking(token, amount), "Insufficient reserves"); + + BridgeOperation memory op = BridgeOperation({ + token: token, + amount: amount, + destinationChain: destinationChain, + recipient: recipient, + assetType: bytes32(uint256(UniversalAssetRegistry.AssetType.ISO4217W)), + usePMM: false, + useVault: false, + complianceProof: complianceProof, + vaultInstructions: "" + }); + + messageId = this.bridge(op); + + return messageId; + } + + function _verifyReserveBacking(address token, uint256 amount) internal view returns (bool) { + try IISO4217WToken(token).verifiedReserve() returns (uint256 reserve) { + return reserve >= amount; + } catch { + return verifiedReserves[token] >= amount; + } + } + + function _checkKYC(address user) internal view returns (bool) { + return kycVerified[user] && block.timestamp < kycExpiration[user]; + } + + function setKYCStatus(address user, bool status, uint256 expirationTime) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + kycVerified[user] = status; + kycExpiration[user] = expirationTime; + + if (status) { + emit KYCVerified(user, expirationTime); + } else { + emit KYCRevoked(user); + } + } + + function enableJurisdiction(string calldata jurisdiction) external onlyRole(DEFAULT_ADMIN_ROLE) { + allowedJurisdictions[jurisdiction] = true; + emit JurisdictionEnabled(jurisdiction); + } + + function setUserJurisdiction(address user, string calldata jurisdiction) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + userJurisdictions[user] = jurisdiction; + } + + function updateVerifiedReserve(address token, uint256 reserve) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + verifiedReserves[token] = reserve; + emit ReserveVerified(token, reserve); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/TwoWayTokenBridgeL1.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/TwoWayTokenBridgeL1.sol new file mode 100644 index 0000000..71ad72c --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/TwoWayTokenBridgeL1.sol @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "../ccip/IRouterClient.sol"; + +interface IERC20 { + function transferFrom(address from, address to, uint256 amount) external returns (bool); + function transfer(address to, uint256 amount) external returns (bool); + function approve(address spender, uint256 amount) external returns (bool); + function balanceOf(address account) external view returns (uint256); +} + +/** + * @title TwoWayTokenBridgeL1 + * @notice L1/LMain chain side: locks canonical tokens and triggers CCIP message to mint on L2 + * @dev Uses escrow for locked tokens; release on inbound messages + */ +contract TwoWayTokenBridgeL1 { + IRouterClient public immutable ccipRouter; + address public immutable canonicalToken; + address public feeToken; // LINK + address public admin; + + struct DestinationConfig { + uint64 chainSelector; + address l2Bridge; + bool enabled; + } + + mapping(uint64 => DestinationConfig) public destinations; + uint64[] public destinationChains; + + mapping(bytes32 => bool) public processed; // replay protection + + event Locked(address indexed user, uint256 amount); + event Released(address indexed recipient, uint256 amount); + event CcipSend(bytes32 indexed messageId, uint64 destChain, address recipient, uint256 amount); + event DestinationAdded(uint64 chainSelector, address l2Bridge); + event DestinationUpdated(uint64 chainSelector, address l2Bridge); + event DestinationRemoved(uint64 chainSelector); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(ccipRouter), "only router"); + _; + } + + constructor(address _router, address _token, address _feeToken) { + require(_router != address(0) && _token != address(0) && _feeToken != address(0), "zero addr"); + ccipRouter = IRouterClient(_router); + canonicalToken = _token; + feeToken = _feeToken; + admin = msg.sender; + } + + function addDestination(uint64 chainSelector, address l2Bridge) external onlyAdmin { + require(l2Bridge != address(0), "zero l2"); + require(!destinations[chainSelector].enabled, "exists"); + destinations[chainSelector] = DestinationConfig(chainSelector, l2Bridge, true); + destinationChains.push(chainSelector); + emit DestinationAdded(chainSelector, l2Bridge); + } + + function updateDestination(uint64 chainSelector, address l2Bridge) external onlyAdmin { + require(destinations[chainSelector].enabled, "missing"); + require(l2Bridge != address(0), "zero l2"); + destinations[chainSelector].l2Bridge = l2Bridge; + emit DestinationUpdated(chainSelector, l2Bridge); + } + + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "missing"); + destinations[chainSelector].enabled = false; + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + emit DestinationRemoved(chainSelector); + } + + function updateFeeToken(address newFee) external onlyAdmin { + require(newFee != address(0), "zero"); + feeToken = newFee; + } + + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero"); + admin = newAdmin; + } + + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } + + // User-facing: lock canonical tokens and send CCIP to mint on L2 + function lockAndSend(uint64 destSelector, address recipient, uint256 amount) external returns (bytes32 messageId) { + require(amount > 0 && recipient != address(0), "bad args"); + DestinationConfig memory dest = destinations[destSelector]; + require(dest.enabled, "dest disabled"); + + // Pull tokens into escrow + require(IERC20(canonicalToken).transferFrom(msg.sender, address(this), amount), "pull fail"); + emit Locked(msg.sender, amount); + + // Encode payload + bytes memory data = abi.encode(recipient, amount); + + // Build message + IRouterClient.EVM2AnyMessage memory m = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.l2Bridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: feeToken, + extraArgs: "" + }); + + // Get fee and pay in LINK held by user: bridge expects to have LINK pre-funded by admin or via separate topup + uint256 fee = ccipRouter.getFee(destSelector, m); + if (fee > 0) { + // Expect admin has prefunded LINK to this contract; otherwise approvals/pull pattern can be added + require(IERC20(feeToken).approve(address(ccipRouter), fee), "fee approve"); + } + + (messageId, ) = ccipRouter.ccipSend(destSelector, m); + emit CcipSend(messageId, destSelector, recipient, amount); + return messageId; + } + + // Inbound from L2: release canonical tokens to recipient + function ccipReceive(IRouterClient.Any2EVMMessage calldata message) external onlyRouter { + require(!processed[message.messageId], "replayed"); + processed[message.messageId] = true; + (address recipient, uint256 amount) = abi.decode(message.data, (address, uint256)); + require(recipient != address(0) && amount > 0, "bad msg"); + require(IERC20(canonicalToken).transfer(recipient, amount), "release fail"); + emit Released(recipient, amount); + } +} + + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/TwoWayTokenBridgeL2.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/TwoWayTokenBridgeL2.sol new file mode 100644 index 0000000..d676520 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/TwoWayTokenBridgeL2.sol @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import "../ccip/IRouterClient.sol"; + +interface IMintableERC20 { + function mint(address to, uint256 amount) external; + function burnFrom(address from, uint256 amount) external; + function balanceOf(address account) external view returns (uint256); +} + +/** + * @title TwoWayTokenBridgeL2 + * @notice L2/secondary chain side: mints mirrored tokens on inbound and burns on outbound + */ +contract TwoWayTokenBridgeL2 { + IRouterClient public immutable ccipRouter; + address public immutable mirroredToken; + address public feeToken; // LINK + address public admin; + + struct DestinationConfig { + uint64 chainSelector; + address l1Bridge; + bool enabled; + } + + mapping(uint64 => DestinationConfig) public destinations; + uint64[] public destinationChains; + mapping(bytes32 => bool) public processed; + + event Minted(address indexed recipient, uint256 amount); + event Burned(address indexed user, uint256 amount); + event CcipSend(bytes32 indexed messageId, uint64 destChain, address recipient, uint256 amount); + event DestinationAdded(uint64 chainSelector, address l1Bridge); + event DestinationUpdated(uint64 chainSelector, address l1Bridge); + event DestinationRemoved(uint64 chainSelector); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(ccipRouter), "only router"); + _; + } + + constructor(address _router, address _token, address _feeToken) { + require(_router != address(0) && _token != address(0) && _feeToken != address(0), "zero addr"); + ccipRouter = IRouterClient(_router); + mirroredToken = _token; + feeToken = _feeToken; + admin = msg.sender; + } + + function addDestination(uint64 chainSelector, address l1Bridge) external onlyAdmin { + require(l1Bridge != address(0), "zero l1"); + require(!destinations[chainSelector].enabled, "exists"); + destinations[chainSelector] = DestinationConfig(chainSelector, l1Bridge, true); + destinationChains.push(chainSelector); + emit DestinationAdded(chainSelector, l1Bridge); + } + + function updateDestination(uint64 chainSelector, address l1Bridge) external onlyAdmin { + require(destinations[chainSelector].enabled, "missing"); + require(l1Bridge != address(0), "zero l1"); + destinations[chainSelector].l1Bridge = l1Bridge; + emit DestinationUpdated(chainSelector, l1Bridge); + } + + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "missing"); + destinations[chainSelector].enabled = false; + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + emit DestinationRemoved(chainSelector); + } + + function updateFeeToken(address newFee) external onlyAdmin { + require(newFee != address(0), "zero"); + feeToken = newFee; + } + + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero"); + admin = newAdmin; + } + + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } + + // Inbound from L1: mint mirrored tokens to recipient + function ccipReceive(IRouterClient.Any2EVMMessage calldata message) external onlyRouter { + require(!processed[message.messageId], "replayed"); + processed[message.messageId] = true; + (address recipient, uint256 amount) = abi.decode(message.data, (address, uint256)); + require(recipient != address(0) && amount > 0, "bad msg"); + IMintableERC20(mirroredToken).mint(recipient, amount); + emit Minted(recipient, amount); + } + + // Outbound to L1: burn mirrored tokens and signal release on L1 + function burnAndSend(uint64 destSelector, address recipient, uint256 amount) external returns (bytes32 messageId) { + require(amount > 0 && recipient != address(0), "bad args"); + DestinationConfig memory dest = destinations[destSelector]; + require(dest.enabled, "dest disabled"); + + IMintableERC20(mirroredToken).burnFrom(msg.sender, amount); + emit Burned(msg.sender, amount); + + bytes memory data = abi.encode(recipient, amount); + IRouterClient.EVM2AnyMessage memory m = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.l1Bridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: feeToken, + extraArgs: "" + }); + uint256 fee = ccipRouter.getFee(destSelector, m); + if (fee > 0) { + require(IERC20(feeToken).approve(address(ccipRouter), fee), "fee approve"); + } + (messageId, ) = ccipRouter.ccipSend(destSelector, m); + emit CcipSend(messageId, destSelector, recipient, amount); + return messageId; + } +} + + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/UniversalCCIPBridge.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/UniversalCCIPBridge.sol new file mode 100644 index 0000000..3d31274 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/UniversalCCIPBridge.sol @@ -0,0 +1,350 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "../registry/UniversalAssetRegistry.sol"; +import "../ccip/IRouterClient.sol"; + +/** + * @title UniversalCCIPBridge + * @notice Main bridge contract supporting all asset types via CCIP + * @dev Extends CCIP infrastructure with dynamic asset routing and PMM integration + */ +contract UniversalCCIPBridge is + Initializable, + AccessControlUpgradeable, + ReentrancyGuardUpgradeable, + UUPSUpgradeable +{ + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + struct BridgeOperation { + address token; + uint256 amount; + uint64 destinationChain; + address recipient; + bytes32 assetType; + bool usePMM; + bool useVault; + bytes complianceProof; + bytes vaultInstructions; + } + + struct Destination { + address receiverBridge; + bool enabled; + uint256 addedAt; + } + + // Core dependencies + UniversalAssetRegistry public assetRegistry; + IRouterClient public ccipRouter; + address public liquidityManager; + address public vaultFactory; + + // State + mapping(address => mapping(uint64 => Destination)) public destinations; + mapping(address => address) public userVaults; + mapping(bytes32 => bool) public processedMessages; + mapping(address => uint256) public nonces; + + // Events + event BridgeExecuted( + bytes32 indexed messageId, + address indexed token, + address indexed sender, + uint256 amount, + uint64 destinationChain, + address recipient, + bool usedPMM + ); + + event DestinationAdded( + address indexed token, + uint64 indexed chainSelector, + address receiverBridge + ); + + event DestinationRemoved( + address indexed token, + uint64 indexed chainSelector + ); + + event MessageReceived( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + address token, + uint256 amount + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + address _assetRegistry, + address _ccipRouter, + address admin + ) external initializer { + __AccessControl_init(); + __ReentrancyGuard_init(); + __UUPSUpgradeable_init(); + + require(_assetRegistry != address(0), "Zero registry"); + + assetRegistry = UniversalAssetRegistry(_assetRegistry); + if (_ccipRouter != address(0)) { + ccipRouter = IRouterClient(_ccipRouter); + } + // If _ccipRouter is zero, set via setCCIPRouter() after deployment (enables same initData for deterministic proxy address) + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Set CCIP router (for deterministic deployment: initialize with router=0, then set per chain) + */ + function setCCIPRouter(address _ccipRouter) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(_ccipRouter != address(0), "Zero router"); + ccipRouter = IRouterClient(_ccipRouter); + } + + /** + * @notice Main bridge function with asset type routing + */ + function bridge( + BridgeOperation calldata op + ) external payable nonReentrant returns (bytes32 messageId) { + // Validate asset is registered and active + UniversalAssetRegistry.UniversalAsset memory asset = assetRegistry.getAsset(op.token); + require(asset.isActive, "Asset not active"); + require(asset.tokenAddress != address(0), "Asset not registered"); + + // Verify destination is enabled + Destination memory dest = destinations[op.token][op.destinationChain]; + require(dest.enabled, "Destination not enabled"); + require(dest.receiverBridge != address(0), "Invalid receiver"); + + // Validate amounts + require(op.amount > 0, "Invalid amount"); + require(op.amount >= asset.minBridgeAmount, "Below minimum"); + require(op.amount <= asset.maxBridgeAmount, "Above maximum"); + + // Transfer tokens from user + IERC20(op.token).safeTransferFrom(msg.sender, address(this), op.amount); + + // Execute bridge with optional PMM + if (op.usePMM && liquidityManager != address(0)) { + _executeBridgeWithPMM(op); + } + + // Execute bridge with optional vault + if (op.useVault && vaultFactory != address(0)) { + _executeBridgeWithVault(op); + } + + // Send CCIP message + messageId = _sendCCIPMessage(op, dest); + + // Increment nonce + nonces[msg.sender]++; + + emit BridgeExecuted( + messageId, + op.token, + msg.sender, + op.amount, + op.destinationChain, + op.recipient, + op.usePMM + ); + + return messageId; + } + + /** + * @notice Execute bridge with PMM liquidity + */ + function _executeBridgeWithPMM(BridgeOperation calldata op) internal { + if (liquidityManager == address(0)) return; + + // Call liquidity manager to provide liquidity + (bool success, ) = liquidityManager.call( + abi.encodeWithSignature( + "provideLiquidity(address,uint256,bytes)", + op.token, + op.amount, + "" + ) + ); + + // PMM is optional, don't revert if it fails + if (!success) { + // Log or handle PMM failure gracefully + } + } + + /** + * @notice Execute bridge with vault + */ + function _executeBridgeWithVault(BridgeOperation calldata op) internal { + if (vaultFactory == address(0)) return; + + // Get or create vault for user + address vault = userVaults[msg.sender]; + if (vault == address(0)) { + // Call vault factory to create vault + (bool success, bytes memory data) = vaultFactory.call( + abi.encodeWithSignature("createVault(address)", msg.sender) + ); + if (success) { + vault = abi.decode(data, (address)); + userVaults[msg.sender] = vault; + } + } + + // If vault exists, record operation + if (vault != address(0)) { + // Call vault to record bridge operation + (bool success, ) = vault.call( + abi.encodeWithSignature( + "recordBridgeOperation(bytes32,address,uint256,uint64)", + bytes32(0), // messageId will be set after CCIP send + op.token, + op.amount, + op.destinationChain + ) + ); + // Vault recording is optional + } + } + + /** + * @notice Send CCIP message + */ + function _sendCCIPMessage( + BridgeOperation calldata op, + Destination memory dest + ) internal returns (bytes32 messageId) { + // Encode message data + bytes memory data = abi.encode( + op.recipient, + op.amount, + msg.sender, + nonces[msg.sender] + ); + + // Prepare CCIP message + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: address(0), // Pay in native + extraArgs: "" + }); + + // Set token amount + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: op.token, + amount: op.amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + // Calculate fee + uint256 fee = ccipRouter.getFee(op.destinationChain, message); + require(address(this).balance >= fee, "Insufficient fee"); + + // Send via CCIP + (messageId, ) = ccipRouter.ccipSend{value: fee}(op.destinationChain, message); + + return messageId; + } + + /** + * @notice Add destination for token + */ + function addDestination( + address token, + uint64 chainSelector, + address receiverBridge + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + require(token != address(0), "Zero token"); + require(receiverBridge != address(0), "Zero receiver"); + + destinations[token][chainSelector] = Destination({ + receiverBridge: receiverBridge, + enabled: true, + addedAt: block.timestamp + }); + + emit DestinationAdded(token, chainSelector, receiverBridge); + } + + /** + * @notice Remove destination + */ + function removeDestination( + address token, + uint64 chainSelector + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + destinations[token][chainSelector].enabled = false; + + emit DestinationRemoved(token, chainSelector); + } + + /** + * @notice Set liquidity manager + */ + function setLiquidityManager(address _liquidityManager) external onlyRole(DEFAULT_ADMIN_ROLE) { + liquidityManager = _liquidityManager; + } + + /** + * @notice Set vault factory + */ + function setVaultFactory(address _vaultFactory) external onlyRole(DEFAULT_ADMIN_ROLE) { + vaultFactory = _vaultFactory; + } + + /** + * @notice Receive native tokens + */ + receive() external payable {} + + /** + * @notice Withdraw native tokens + */ + function withdraw() external onlyRole(DEFAULT_ADMIN_ROLE) { + payable(msg.sender).transfer(address(this).balance); + } + + // View functions + + function getDestination(address token, uint64 chainSelector) + external view returns (Destination memory) { + return destinations[token][chainSelector]; + } + + function getUserVault(address user) external view returns (address) { + return userVaults[user]; + } + + function getUserNonce(address user) external view returns (uint256) { + return nonces[user]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/VaultBridgeAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/VaultBridgeAdapter.sol new file mode 100644 index 0000000..9ecd12d --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/VaultBridgeAdapter.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./UniversalCCIPBridge.sol"; + +contract VaultBridgeAdapter is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant ADAPTER_ADMIN_ROLE = keccak256("ADAPTER_ADMIN_ROLE"); + + address public vaultFactory; + UniversalCCIPBridge public bridge; + + mapping(address => address) public userVaults; + + event VaultCreated(address indexed user, address indexed vault); + + constructor(address _vaultFactory, address _bridge, address admin) { + require(_vaultFactory != address(0), "Zero factory"); + require(_bridge != address(0), "Zero bridge"); + + vaultFactory = _vaultFactory; + bridge = UniversalCCIPBridge(payable(_bridge)); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ADAPTER_ADMIN_ROLE, admin); + } + + function getOrCreateVault(address user) public returns (address vault) { + vault = userVaults[user]; + if (vault == address(0)) { + (bool success, bytes memory data) = vaultFactory.call( + abi.encodeWithSignature("createVault(address)", user) + ); + if (success) { + vault = abi.decode(data, (address)); + userVaults[user] = vault; + emit VaultCreated(user, vault); + } + } + return vault; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/evm/AlltraAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/evm/AlltraAdapter.sol new file mode 100644 index 0000000..9828c87 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/evm/AlltraAdapter.sol @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; +import "../../interfaces/IAlltraTransport.sol"; +import "../../UniversalCCIPBridge.sol"; + +/** + * @title AlltraAdapter + * @notice Bridge adapter for ALL Mainnet (EVM-compatible) + * @dev ALL Mainnet (651940) is not supported by CCIP. Use setAlltraTransport() to set + * AlltraCustomBridge (or other IAlltraTransport) for 138 <-> 651940 flows. + * @dev Chain ID: 651940 (0x9f2a4) - https://chainlist.org/chain/651940 + */ +contract AlltraAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + + // ALL Mainnet Chain ID - confirmed from ChainList + uint256 public constant ALLTRA_MAINNET = 651940; + + UniversalCCIPBridge public universalBridge; + IAlltraTransport public alltraTransport; // When set, used for 651940 instead of CCIP + bool public isActive; + /// @notice Configurable bridge fee (default 0.001 ALL). Set via setBridgeFee() after deployment. + uint256 public bridgeFee; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(address => uint256) public nonces; + + event AlltraBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + address recipient + ); + + event AlltraBridgeConfirmed( + bytes32 indexed requestId, + bytes32 indexed alltraTxHash + ); + + constructor(address admin, address _bridge) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + universalBridge = UniversalCCIPBridge(payable(_bridge)); + isActive = true; + bridgeFee = 1000000000000000; // 0.001 ALL default; update via setBridgeFee() per ALL Mainnet fee structure + } + + /** + * @notice Set custom transport for 138 <-> 651940 (no CCIP). When set, bridge() uses this instead of UniversalCCIPBridge. + */ + function setAlltraTransport(address _transport) external onlyRole(DEFAULT_ADMIN_ROLE) { + alltraTransport = IAlltraTransport(_transport); + } + + function getChainType() external pure override returns (string memory) { + return "EVM"; // Generic chain type to distinguish from ALLTRA (orchestration layer) + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (ALLTRA_MAINNET, "ALL-Mainnet"); // Updated identifier + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + // Standard EVM address validation + if (destination.length != 20) return false; + address dest = address(bytes20(destination)); + return dest != address(0); + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + require(this.validateDestination(destination), "Invalid destination"); + + address recipientAddr = address(bytes20(destination)); + + // Generate request ID + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + recipientAddr, + nonces[msg.sender]++, + block.timestamp + )); + + // Lock tokens + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + // Create bridge request + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + // ALL Mainnet (651940) is not supported by CCIP. Use custom transport when set. + if (address(alltraTransport) != address(0) && alltraTransport.isConfigured()) { + alltraTransport.lockAndRelay{value: msg.value}(token, amount, recipientAddr); + } else { + // Fallback to UniversalCCIPBridge only if destination were CCIP-supported; 651940 is not. + revert("AlltraAdapter: set AlltraCustomBridge via setAlltraTransport for 651940"); + } + + emit AlltraBridgeInitiated(requestId, msg.sender, token, amount, recipientAddr); + + return requestId; + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + // Refund tokens + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + /// @notice Returns the current bridge fee (configurable via setBridgeFee). + /// @param token Unused; fee is global per adapter. + /// @param amount Unused. + /// @param destination Unused. + /// @return fee Current bridgeFee in wei. + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return bridgeFee; + } + + /// @notice Update bridge fee. Call after deployment when ALL Mainnet fee structure is known. + function setBridgeFee(uint256 _fee) external onlyRole(DEFAULT_ADMIN_ROLE) { + bridgeFee = _fee; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } + + function confirmBridge(bytes32 requestId, bytes32 alltraTxHash) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + + emit AlltraBridgeConfirmed(requestId, alltraTxHash); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/evm/EVMAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/evm/EVMAdapter.sol new file mode 100644 index 0000000..8a29eea --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/evm/EVMAdapter.sol @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; +import "../../UniversalCCIPBridge.sol"; + +/** + * @title EVMAdapter + * @notice Standard bridge adapter for EVM-compatible chains + * @dev Template adapter for Polygon, Arbitrum, Optimism, Base, Avalanche, BSC, Ethereum + */ +contract EVMAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + + uint256 public immutable chainId; + string public chainName; + UniversalCCIPBridge public universalBridge; + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(address => uint256) public nonces; + + event EVMBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + uint256 destinationChainId, + address recipient + ); + + event EVMBridgeConfirmed( + bytes32 indexed requestId, + bytes32 indexed txHash + ); + + constructor( + address admin, + address _bridge, + uint256 _chainId, + string memory _chainName + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + universalBridge = UniversalCCIPBridge(payable(_bridge)); + chainId = _chainId; + chainName = _chainName; + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "EVM"; + } + + function getChainIdentifier() external view override returns (uint256, string memory) { + return (chainId, chainName); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + if (destination.length != 20) return false; + address dest = address(bytes20(destination)); + return dest != address(0); + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + require(this.validateDestination(destination), "Invalid destination"); + + address recipientAddr = address(bytes20(destination)); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + recipientAddr, + chainId, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + IERC20(token).forceApprove(address(universalBridge), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + UniversalCCIPBridge.BridgeOperation memory op = UniversalCCIPBridge.BridgeOperation({ + token: token, + amount: amount, + destinationChain: uint64(chainId), + recipient: recipientAddr, + assetType: bytes32(0), + usePMM: false, + useVault: false, + complianceProof: "", + vaultInstructions: "" + }); + + bytes32 messageId = universalBridge.bridge{value: msg.value}(op); + + emit EVMBridgeInitiated(requestId, msg.sender, token, amount, chainId, recipientAddr); + + return requestId; + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } + + function confirmBridge(bytes32 requestId, bytes32 txHash) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + + emit EVMBridgeConfirmed(requestId, txHash); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/evm/XDCAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/evm/XDCAdapter.sol new file mode 100644 index 0000000..5d51776 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/evm/XDCAdapter.sol @@ -0,0 +1,213 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; +import "../../UniversalCCIPBridge.sol"; + +/** + * @title XDCAdapter + * @notice Bridge adapter for XDC Network (EVM-compatible with xdc address prefix) + * @dev XDC uses xdc prefix instead of 0x for addresses + */ +contract XDCAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + + uint256 public constant XDC_MAINNET = 50; + uint256 public constant XDC_APOTHEM_TESTNET = 51; + + UniversalCCIPBridge public universalBridge; + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(address => uint256) public nonces; + + event XDCBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string xdcDestination + ); + + event XDCBridgeConfirmed( + bytes32 indexed requestId, + bytes32 indexed xdcTxHash + ); + + constructor(address admin, address _bridge) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + universalBridge = UniversalCCIPBridge(payable(_bridge)); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "XDC"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (XDC_MAINNET, "XDC-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + string memory addr = string(destination); + bytes memory addrBytes = bytes(addr); + + if (addrBytes.length != 43) return false; + if (addrBytes[0] != 'x' || addrBytes[1] != 'd' || addrBytes[2] != 'c') return false; + + for (uint256 i = 3; i < 43; i++) { + bytes1 char = addrBytes[i]; + if (!((char >= 0x30 && char <= 0x39) || (char >= 0x61 && char <= 0x66))) { + return false; + } + } + return true; + } + + function convertXdcToEth(string memory xdcAddr) public pure returns (address) { + bytes memory xdcBytes = bytes(xdcAddr); + require(xdcBytes.length == 43, "Invalid XDC address length"); + require(xdcBytes[0] == 'x' && xdcBytes[1] == 'd' && xdcBytes[2] == 'c', "Invalid XDC prefix"); + // Parse 40 hex chars (20 bytes) to address; do not use bytes32(hexBytes) which truncates 42 bytes + uint160 result = 0; + for (uint256 i = 0; i < 40; i++) { + result = result * 16 + _hexCharToNibble(xdcBytes[i + 3]); + } + return address(result); + } + + function _hexCharToNibble(bytes1 c) internal pure returns (uint8) { + if (c >= 0x30 && c <= 0x39) return uint8(c) - 0x30; // '0'-'9' + if (c >= 0x61 && c <= 0x66) return uint8(c) - 0x61 + 10; // 'a'-'f' + if (c >= 0x41 && c <= 0x46) return uint8(c) - 0x41 + 10; // 'A'-'F' + revert("Invalid hex character"); + } + + function convertEthToXdc(address ethAddr) public pure returns (string memory) { + bytes20 addr = bytes20(ethAddr); + bytes memory hexString = new bytes(43); + hexString[0] = 'x'; + hexString[1] = 'd'; + hexString[2] = 'c'; + + for (uint256 i = 0; i < 20; i++) { + uint8 byteValue = uint8(addr[i]); + uint8 high = byteValue >> 4; + uint8 low = byteValue & 0x0f; + + hexString[3 + i * 2] = bytes1(high < 10 ? 48 + high : 87 + high); + hexString[4 + i * 2] = bytes1(low < 10 ? 48 + low : 87 + low); + } + + return string(hexString); + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory xdcDestination = string(destination); + require(this.validateDestination(destination), "Invalid XDC address"); + + address evmRecipient = convertXdcToEth(xdcDestination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + xdcDestination, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + UniversalCCIPBridge.BridgeOperation memory op = UniversalCCIPBridge.BridgeOperation({ + token: token, + amount: amount, + destinationChain: uint64(XDC_MAINNET), + recipient: evmRecipient, + assetType: bytes32(0), + usePMM: false, + useVault: false, + complianceProof: "", + vaultInstructions: "" + }); + + bytes32 messageId = universalBridge.bridge{value: msg.value}(op); + + emit XDCBridgeInitiated(requestId, msg.sender, token, amount, xdcDestination); + + return requestId; + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } + + function confirmBridge(bytes32 requestId, bytes32 xdcTxHash) + external onlyRole(BRIDGE_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + + emit XDCBridgeConfirmed(requestId, xdcTxHash); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/hyperledger/CactiAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/hyperledger/CactiAdapter.sol new file mode 100644 index 0000000..2c34ea0 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/hyperledger/CactiAdapter.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract CactiAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant CACTI_OPERATOR_ROLE = keccak256("CACTI_OPERATOR_ROLE"); + + bool public isActive; + string public cactiApiUrl; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public cactiTxIds; + mapping(address => uint256) public nonces; + + event CactiBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string sourceLedger, + string destLedger, + string cactiTxId + ); + + event CactiBridgeConfirmed( + bytes32 indexed requestId, + string indexed cactiTxId, + string sourceLedger, + string destLedger + ); + + constructor(address admin, string memory _cactiApiUrl) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(CACTI_OPERATOR_ROLE, admin); + cactiApiUrl = _cactiApiUrl; + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Cacti"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Cacti-Interoperability"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + (string memory sourceLedger, string memory destLedger) = abi.decode(destination, (string, string)); + require(bytes(sourceLedger).length > 0 && bytes(destLedger).length > 0, "Invalid ledgers"); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + sourceLedger, + destLedger, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit CactiBridgeInitiated(requestId, msg.sender, token, amount, sourceLedger, destLedger, ""); + return requestId; + } + + function confirmCactiOperation( + bytes32 requestId, + string calldata cactiTxId, + string calldata sourceLedger, + string calldata destLedger + ) external onlyRole(CACTI_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + cactiTxIds[requestId] = cactiTxId; + + emit CactiBridgeConfirmed(requestId, cactiTxId, sourceLedger, destLedger); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/hyperledger/FabricAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/hyperledger/FabricAdapter.sol new file mode 100644 index 0000000..4eb9f98 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/hyperledger/FabricAdapter.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract FabricAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant FABRIC_OPERATOR_ROLE = keccak256("FABRIC_OPERATOR_ROLE"); + + bool public isActive; + string public fabricChannel; + string public fabricChaincode; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public fabricTxIds; + mapping(address => uint256) public nonces; + + event FabricBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string fabricChannel, + string fabricChaincode + ); + + event FabricBridgeConfirmed( + bytes32 indexed requestId, + string indexed fabricTxId, + string fabricChannel + ); + + constructor( + address admin, + string memory _fabricChannel, + string memory _fabricChaincode + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(FABRIC_OPERATOR_ROLE, admin); + fabricChannel = _fabricChannel; + fabricChaincode = _fabricChaincode; + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Fabric"; + } + + function getChainIdentifier() external view override returns (uint256 chainId, string memory identifier) { + return (0, string(abi.encodePacked("Fabric-", fabricChannel))); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + destination, + fabricChannel, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit FabricBridgeInitiated(requestId, msg.sender, token, amount, fabricChannel, fabricChaincode); + return requestId; + } + + function confirmFabricOperation( + bytes32 requestId, + string calldata fabricTxId + ) external onlyRole(FABRIC_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + fabricTxIds[requestId] = fabricTxId; + + emit FabricBridgeConfirmed(requestId, fabricTxId, fabricChannel); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 0; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/hyperledger/FireflyAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/hyperledger/FireflyAdapter.sol new file mode 100644 index 0000000..7c03fda --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/hyperledger/FireflyAdapter.sol @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +/** + * @title FireflyAdapter + * @notice Bridge adapter for Hyperledger Firefly orchestration layer + * @dev Firefly coordinates multi-chain operations - this adapter interfaces with Firefly API + */ +contract FireflyAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant FIREFLY_OPERATOR_ROLE = keccak256("FIREFLY_OPERATOR_ROLE"); + + bool public isActive; + string public fireflyNamespace; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public fireflyTxIds; + mapping(address => uint256) public nonces; + + event FireflyBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string fireflyTxId, + string namespace + ); + + event FireflyBridgeConfirmed( + bytes32 indexed requestId, + string indexed fireflyTxId, + string sourceChain + ); + + constructor(address admin, string memory _namespace) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(FIREFLY_OPERATOR_ROLE, admin); + fireflyNamespace = _namespace; + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Firefly"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Firefly-Orchestration"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + destination, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit FireflyBridgeInitiated(requestId, msg.sender, token, amount, "", fireflyNamespace); + return requestId; + } + + function confirmFireflyOperation( + bytes32 requestId, + string calldata fireflyTxId, + string calldata sourceChain + ) external onlyRole(FIREFLY_OPERATOR_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + fireflyTxIds[requestId] = fireflyTxId; + + emit FireflyBridgeConfirmed(requestId, fireflyTxId, sourceChain); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/AlgorandAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/AlgorandAdapter.sol new file mode 100644 index 0000000..3c5aea7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/AlgorandAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract AlgorandAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event AlgorandBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event AlgorandBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Algorand"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Algorand-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit AlgorandBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit AlgorandBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/CosmosAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/CosmosAdapter.sol new file mode 100644 index 0000000..2d02e13 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/CosmosAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract CosmosAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event CosmosBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event CosmosBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Cosmos"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Cosmos-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit CosmosBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit CosmosBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/HederaAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/HederaAdapter.sol new file mode 100644 index 0000000..5583327 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/HederaAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract HederaAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event HederaBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event HederaBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Hedera"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Hedera-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit HederaBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit HederaBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/SolanaAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/SolanaAdapter.sol new file mode 100644 index 0000000..189cdf7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/SolanaAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract SolanaAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event SolanaBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event SolanaBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Solana"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Solana-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit SolanaBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit SolanaBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/StellarAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/StellarAdapter.sol new file mode 100644 index 0000000..2302430 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/StellarAdapter.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract StellarAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public stellarTxHashes; + mapping(address => uint256) public nonces; + + event StellarBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string stellarAccount + ); + + event StellarBridgeConfirmed( + bytes32 indexed requestId, + string indexed stellarTxHash, + uint256 ledgerSequence + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Stellar"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Stellar-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + string memory addr = string(destination); + bytes memory addrBytes = bytes(addr); + + // Stellar addresses: G + 55 base32 chars = 56 chars + if (addrBytes.length != 56) return false; + if (addrBytes[0] != 'G') return false; + + return true; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + require(this.validateDestination(destination), "Invalid Stellar address"); + + string memory stellarAccount = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + stellarAccount, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit StellarBridgeInitiated(requestId, msg.sender, token, amount, stellarAccount); + return requestId; + } + + function confirmStellarTransaction( + bytes32 requestId, + string calldata stellarTxHash, + uint256 ledgerSequence + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + stellarTxHashes[requestId] = stellarTxHash; + + emit StellarBridgeConfirmed(requestId, stellarTxHash, ledgerSequence); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external pure override returns (uint256 fee) { + return 100; // 0.00001 XLM (Stellar fees are very low) + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/TONAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/TONAdapter.sol new file mode 100644 index 0000000..aeed7ef --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/TONAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract TONAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event TONBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event TONBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "TON"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "TON-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit TONBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit TONBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/TezosAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/TezosAdapter.sol new file mode 100644 index 0000000..bfb657f --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/TezosAdapter.sol @@ -0,0 +1,158 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +/** + * @title TezosAdapter + * @notice Bridge adapter for Tezos L1 (native Michelson) + * @dev Lock tokens on this chain; off-chain relayer watches events and performs Tezos-side mint/transfer. + * Oracle calls confirmTransaction when Tezos tx is confirmed. + */ +contract TezosAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event TezosBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event TezosBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Tezos"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Tezos-Mainnet"); + } + + /** + * @notice Validate Tezos destination (tz1/tz2/tz3/KT1 address format; length 35-64 bytes when UTF-8) + */ + function validateDestination(bytes calldata destination) external pure override returns (bool) { + if (destination.length == 0 || destination.length > 64) return false; + // Tezos addresses: tz1, tz2, tz3 (implicit), KT1 (contract) + return destination.length >= 35 && destination.length <= 64; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + require(this.validateDestination(destination), "Invalid Tezos destination"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit TezosBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + /** + * @notice Called by oracle/relayer when Tezos tx is confirmed + */ + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit TezosBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require( + request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, + "Cannot cancel" + ); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/TronAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/TronAdapter.sol new file mode 100644 index 0000000..1a3bd35 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/TronAdapter.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +contract TronAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => string) public txHashes; + mapping(address => uint256) public nonces; + + event TronBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string destination + ); + + event TronBridgeConfirmed( + bytes32 indexed requestId, + string indexed txHash + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "Tron"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "Tron-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + return destination.length > 0; + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + + string memory dest = string(destination); + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + dest, + nonces[msg.sender]++, + block.timestamp + )); + + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit TronBridgeInitiated(requestId, msg.sender, token, amount, dest); + return requestId; + } + + function confirmTransaction( + bytes32 requestId, + string calldata txHash + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + txHashes[requestId] = txHash; + + emit TronBridgeConfirmed(requestId, txHash); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view override returns (uint256 fee) { + return 1000000000000000; + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/XRPLAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/XRPLAdapter.sol new file mode 100644 index 0000000..c7e4082 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/adapters/non-evm/XRPLAdapter.sol @@ -0,0 +1,188 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../interfaces/IChainAdapter.sol"; + +/** + * @title XRPLAdapter + * @notice Bridge adapter for XRP Ledger (XRPL) + * @dev Uses oracle/relayer pattern for non-EVM chain integration + */ +contract XRPLAdapter is IChainAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + bool public isActive; + + mapping(bytes32 => BridgeRequest) public bridgeRequests; + mapping(bytes32 => bytes32) public xrplTxHashes; // requestId => xrplTxHash + mapping(address => uint256) public nonces; + + // XRPL address validation: starts with 'r', 25-35 chars + mapping(string => bool) public validatedXRPLAddresses; + + event XRPLBridgeInitiated( + bytes32 indexed requestId, + address indexed sender, + address indexed token, + uint256 amount, + string xrplDestination, + uint32 destinationTag + ); + + event XRPLBridgeConfirmed( + bytes32 indexed requestId, + bytes32 indexed xrplTxHash, + uint256 ledgerIndex + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + isActive = true; + } + + function getChainType() external pure override returns (string memory) { + return "XRPL"; + } + + function getChainIdentifier() external pure override returns (uint256 chainId, string memory identifier) { + return (0, "XRPL-Mainnet"); + } + + function validateDestination(bytes calldata destination) external pure override returns (bool) { + string memory addr = string(destination); + bytes memory addrBytes = bytes(addr); + + // XRPL addresses: r + 25-34 base58 chars + if (addrBytes.length < 26 || addrBytes.length > 35) return false; + if (addrBytes[0] != 'r') return false; + + // Basic validation - full validation requires base58 decoding + return true; + } + + /** + * @notice Convert XRP drops to wei (1 XRP = 1,000,000 drops) + */ + function dropsToWei(uint64 drops) public pure returns (uint256) { + return uint256(drops) * 1e12; // 1 drop = 0.000001 XRP, 1 XRP = 1e18 wei + } + + /** + * @notice Convert wei to XRP drops + */ + function weiToDrops(uint256 weiAmount) public pure returns (uint64) { + return uint64(weiAmount / 1e12); + } + + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable override nonReentrant returns (bytes32 requestId) { + require(isActive, "Adapter inactive"); + require(amount > 0, "Zero amount"); + require(this.validateDestination(destination), "Invalid XRPL address"); + + string memory xrplDestination = string(destination); + uint32 destinationTag = 0; + + // Parse destination tag if provided in recipient bytes + if (recipient.length >= 4) { + destinationTag = abi.decode(recipient, (uint32)); + } + + requestId = keccak256(abi.encodePacked( + msg.sender, + token, + amount, + xrplDestination, + destinationTag, + nonces[msg.sender]++, + block.timestamp + )); + + // Lock tokens on EVM side + if (token == address(0)) { + require(msg.value >= amount, "Insufficient ETH"); + } else { + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + bridgeRequests[requestId] = BridgeRequest({ + sender: msg.sender, + token: token, + amount: amount, + destinationData: destination, + requestId: requestId, + status: BridgeStatus.Locked, + createdAt: block.timestamp, + completedAt: 0 + }); + + emit XRPLBridgeInitiated(requestId, msg.sender, token, amount, xrplDestination, destinationTag); + + return requestId; + } + + /** + * @notice Oracle confirms XRPL transaction + */ + function confirmXRPLTransaction( + bytes32 requestId, + bytes32 xrplTxHash, + uint256 ledgerIndex + ) external onlyRole(ORACLE_ROLE) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Locked, "Invalid status"); + + request.status = BridgeStatus.Confirmed; + request.completedAt = block.timestamp; + xrplTxHashes[requestId] = xrplTxHash; + + emit XRPLBridgeConfirmed(requestId, xrplTxHash, ledgerIndex); + } + + function getBridgeStatus(bytes32 requestId) + external view override returns (BridgeRequest memory) { + return bridgeRequests[requestId]; + } + + function cancelBridge(bytes32 requestId) external override returns (bool) { + BridgeRequest storage request = bridgeRequests[requestId]; + require(request.status == BridgeStatus.Pending || request.status == BridgeStatus.Locked, "Cannot cancel"); + require(msg.sender == request.sender, "Not request sender"); + + // Refund tokens + if (request.token == address(0)) { + payable(request.sender).transfer(request.amount); + } else { + IERC20(request.token).safeTransfer(request.sender, request.amount); + } + + request.status = BridgeStatus.Cancelled; + return true; + } + + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external pure override returns (uint256 fee) { + // XRPL fees are very low (~0.000012 XRP per transaction) + return 12000; // 0.000012 XRP in drops + } + + function setIsActive(bool _isActive) external onlyRole(DEFAULT_ADMIN_ROLE) { + isActive = _isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/VaultBridgeIntegration.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/VaultBridgeIntegration.sol new file mode 100644 index 0000000..e5b9bb6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/VaultBridgeIntegration.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeRegistry.sol"; +import "../../vault/VaultFactory.sol"; +import "../../vault/tokens/DepositToken.sol"; + +/** + * @title VaultBridgeIntegration + * @notice Automatically registers vault deposit tokens with BridgeRegistry + * @dev Extends VaultFactory to auto-register deposit tokens on creation + */ +contract VaultBridgeIntegration is AccessControl { + bytes32 public constant INTEGRATOR_ROLE = keccak256("INTEGRATOR_ROLE"); + + VaultFactory public vaultFactory; + BridgeRegistry public bridgeRegistry; + + // Default bridge configuration for vault tokens + uint256 public defaultMinBridgeAmount = 1e18; // 1 token minimum + uint256 public defaultMaxBridgeAmount = 1_000_000e18; // 1M tokens maximum + uint8 public defaultRiskLevel = 50; // Medium risk + uint256 public defaultBridgeFeeBps = 10; // 0.1% default fee + + // Destination chain IDs allowed by default (Polygon, Optimism, Base, Arbitrum, Avalanche, BNB Chain, Monad) + uint256[] public defaultDestinations; + + event DepositTokenRegistered( + address indexed depositToken, + address indexed vault, + uint256[] destinationChainIds + ); + + constructor( + address admin, + address vaultFactory_, + address bridgeRegistry_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(INTEGRATOR_ROLE, admin); + + require(vaultFactory_ != address(0), "VaultBridgeIntegration: zero vault factory"); + require(bridgeRegistry_ != address(0), "VaultBridgeIntegration: zero bridge registry"); + + vaultFactory = VaultFactory(vaultFactory_); + bridgeRegistry = BridgeRegistry(bridgeRegistry_); + + // Set default destinations (EVM chains only for now) + defaultDestinations.push(137); // Polygon + defaultDestinations.push(10); // Optimism + defaultDestinations.push(8453); // Base + defaultDestinations.push(42161); // Arbitrum + defaultDestinations.push(43114); // Avalanche + defaultDestinations.push(56); // BNB Chain + defaultDestinations.push(10143); // Monad (example chain ID) + defaultDestinations.push(42793); // Etherlink (Tezos EVM L2) + } + + /** + * @notice Register a deposit token with bridge registry + * @param depositToken Deposit token address + * @param destinationChainIds Array of allowed destination chain IDs + * @param minAmount Minimum bridge amount + * @param maxAmount Maximum bridge amount + * @param riskLevel Risk level (0-255) + * @param bridgeFeeBps Bridge fee in basis points + */ + function registerDepositToken( + address depositToken, + uint256[] memory destinationChainIds, + uint256 minAmount, + uint256 maxAmount, + uint8 riskLevel, + uint256 bridgeFeeBps + ) public onlyRole(INTEGRATOR_ROLE) { + require(depositToken != address(0), "VaultBridgeIntegration: zero deposit token"); + require(destinationChainIds.length > 0, "VaultBridgeIntegration: no destinations"); + + bridgeRegistry.registerToken( + depositToken, + minAmount, + maxAmount, + destinationChainIds, + riskLevel, + bridgeFeeBps + ); + + // Find associated vault (would need to track this in VaultFactory) + // For now, emit event with deposit token only + emit DepositTokenRegistered(depositToken, address(0), destinationChainIds); + } + + /** + * @notice Register a deposit token with default configuration + * @param depositToken Deposit token address + */ + function registerDepositTokenDefault(address depositToken) external onlyRole(INTEGRATOR_ROLE) { + registerDepositToken( + depositToken, + defaultDestinations, + defaultMinBridgeAmount, + defaultMaxBridgeAmount, + defaultRiskLevel, + defaultBridgeFeeBps + ); + } + + /** + * @notice Set default bridge configuration + */ + function setDefaultMinBridgeAmount(uint256 minAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + defaultMinBridgeAmount = minAmount; + } + + function setDefaultMaxBridgeAmount(uint256 maxAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + defaultMaxBridgeAmount = maxAmount; + } + + function setDefaultRiskLevel(uint8 riskLevel) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(riskLevel <= 255, "VaultBridgeIntegration: invalid risk level"); + defaultRiskLevel = riskLevel; + } + + function setDefaultBridgeFeeBps(uint256 feeBps) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(feeBps <= 10000, "VaultBridgeIntegration: fee > 100%"); + defaultBridgeFeeBps = feeBps; + } + + function setDefaultDestinations(uint256[] memory chainIds) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(chainIds.length > 0, "VaultBridgeIntegration: no destinations"); + defaultDestinations = chainIds; + } + + /** + * @notice Get default destinations + */ + function getDefaultDestinations() external view returns (uint256[] memory) { + return defaultDestinations; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/WTokenBridgeIntegration.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/WTokenBridgeIntegration.sol new file mode 100644 index 0000000..f98df6a --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/WTokenBridgeIntegration.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeRegistry.sol"; +import "../../iso4217w/TokenFactory.sol"; +import "../../iso4217w/registry/TokenRegistry.sol"; + +/** + * @title WTokenBridgeIntegration + * @notice Automatically registers ISO-4217 W tokens with BridgeRegistry + * @dev Extends TokenFactory to auto-register W tokens on creation + */ +contract WTokenBridgeIntegration is AccessControl { + bytes32 public constant INTEGRATOR_ROLE = keccak256("INTEGRATOR_ROLE"); + + TokenFactory public tokenFactory; + BridgeRegistry public bridgeRegistry; + ITokenRegistry public wTokenRegistry; + + // Default bridge configuration for W tokens (more conservative due to compliance) + uint256 public defaultMinBridgeAmount = 100e2; // 100 USD minimum + uint256 public defaultMaxBridgeAmount = 10_000_000e2; // 10M USD maximum + uint8 public defaultRiskLevel = 20; // Low risk (fiat-backed) + uint256 public defaultBridgeFeeBps = 5; // 0.05% default fee (lower due to compliance) + + // Destination chain IDs (includes XRPL and Fabric in addition to EVM) + uint256[] public defaultEvmDestinations; + uint256[] public defaultNonEvmDestinations; // 0 for XRPL, 1 for Fabric (example) + + event WTokenRegistered( + address indexed token, + string indexed currencyCode, + uint256[] destinationChainIds + ); + + constructor( + address admin, + address tokenFactory_, + address bridgeRegistry_, + address wTokenRegistry_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(INTEGRATOR_ROLE, admin); + + require(tokenFactory_ != address(0), "WTokenBridgeIntegration: zero token factory"); + require(bridgeRegistry_ != address(0), "WTokenBridgeIntegration: zero bridge registry"); + require(wTokenRegistry_ != address(0), "WTokenBridgeIntegration: zero W token registry"); + + tokenFactory = TokenFactory(tokenFactory_); + bridgeRegistry = BridgeRegistry(bridgeRegistry_); + wTokenRegistry = ITokenRegistry(wTokenRegistry_); + + // Set default EVM destinations + defaultEvmDestinations.push(137); // Polygon + defaultEvmDestinations.push(10); // Optimism + defaultEvmDestinations.push(8453); // Base + defaultEvmDestinations.push(42161); // Arbitrum + defaultEvmDestinations.push(43114); // Avalanche + defaultEvmDestinations.push(56); // BNB Chain + defaultEvmDestinations.push(10143); // Monad + defaultEvmDestinations.push(42793); // Etherlink (Tezos EVM L2) + + // Set default non-EVM destinations + defaultNonEvmDestinations.push(0); // XRPL (0 = non-EVM identifier) + defaultNonEvmDestinations.push(1); // Fabric (1 = non-EVM identifier) + } + + /** + * @notice Register a W token with bridge registry + * @param currencyCode ISO-4217 currency code (e.g., "USD") + * @param destinationChainIds Array of allowed destination chain IDs + * @param minAmount Minimum bridge amount (in token decimals) + * @param maxAmount Maximum bridge amount (in token decimals) + * @param riskLevel Risk level (0-255) + * @param bridgeFeeBps Bridge fee in basis points + */ + function registerWToken( + string memory currencyCode, + uint256[] memory destinationChainIds, + uint256 minAmount, + uint256 maxAmount, + uint8 riskLevel, + uint256 bridgeFeeBps + ) public onlyRole(INTEGRATOR_ROLE) { + address token = wTokenRegistry.getTokenAddress(currencyCode); + require(token != address(0), "WTokenBridgeIntegration: token not found"); + + require(destinationChainIds.length > 0, "WTokenBridgeIntegration: no destinations"); + require(minAmount > 0, "WTokenBridgeIntegration: zero min amount"); + require(maxAmount >= minAmount, "WTokenBridgeIntegration: max < min"); + require(bridgeFeeBps <= 10000, "WTokenBridgeIntegration: fee > 100%"); + + bridgeRegistry.registerToken( + token, + minAmount, + maxAmount, + destinationChainIds, + riskLevel, + bridgeFeeBps + ); + + emit WTokenRegistered(token, currencyCode, destinationChainIds); + } + + /** + * @notice Register a W token with default configuration + * @param currencyCode ISO-4217 currency code + */ + function registerWTokenDefault(string memory currencyCode) public onlyRole(INTEGRATOR_ROLE) { + // Combine EVM and non-EVM destinations + uint256[] memory allDestinations = new uint256[]( + defaultEvmDestinations.length + defaultNonEvmDestinations.length + ); + + uint256 i = 0; + for (uint256 j = 0; j < defaultEvmDestinations.length; j++) { + allDestinations[i++] = defaultEvmDestinations[j]; + } + for (uint256 j = 0; j < defaultNonEvmDestinations.length; j++) { + allDestinations[i++] = defaultNonEvmDestinations[j]; + } + + registerWToken( + currencyCode, + allDestinations, + defaultMinBridgeAmount, + defaultMaxBridgeAmount, + defaultRiskLevel, + defaultBridgeFeeBps + ); + } + + /** + * @notice Register multiple W tokens with default configuration + * @param currencyCodes Array of ISO-4217 currency codes + */ + function registerMultipleWTokensDefault(string[] memory currencyCodes) external onlyRole(INTEGRATOR_ROLE) { + for (uint256 i = 0; i < currencyCodes.length; i++) { + registerWTokenDefault(currencyCodes[i]); + } + } + + /** + * @notice Set default bridge configuration + */ + function setDefaultMinBridgeAmount(uint256 minAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(minAmount > 0, "WTokenBridgeIntegration: zero min amount"); + defaultMinBridgeAmount = minAmount; + } + + function setDefaultMaxBridgeAmount(uint256 maxAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(maxAmount >= defaultMinBridgeAmount, "WTokenBridgeIntegration: max < min"); + defaultMaxBridgeAmount = maxAmount; + } + + function setDefaultRiskLevel(uint8 riskLevel) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(riskLevel <= 255, "WTokenBridgeIntegration: invalid risk level"); + defaultRiskLevel = riskLevel; + } + + function setDefaultBridgeFeeBps(uint256 feeBps) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(feeBps <= 10000, "WTokenBridgeIntegration: fee > 100%"); + defaultBridgeFeeBps = feeBps; + } + + function setDefaultEvmDestinations(uint256[] memory chainIds) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(chainIds.length > 0, "WTokenBridgeIntegration: no destinations"); + defaultEvmDestinations = chainIds; + } + + function setDefaultNonEvmDestinations(uint256[] memory chainIds) external onlyRole(DEFAULT_ADMIN_ROLE) { + defaultNonEvmDestinations = chainIds; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/WTokenComplianceEnforcer.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/WTokenComplianceEnforcer.sol new file mode 100644 index 0000000..7c41e1a --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/WTokenComplianceEnforcer.sol @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeEscrowVault.sol"; +import "../../iso4217w/interfaces/IISO4217WToken.sol"; +import "../../iso4217w/ComplianceGuard.sol"; + +/** + * @title WTokenComplianceEnforcer + * @notice Enforces W token compliance rules on bridge operations + * @dev Ensures money multiplier = 1.0 and GRU isolation on bridge + */ +contract WTokenComplianceEnforcer is AccessControl { + bytes32 public constant ENFORCER_ROLE = keccak256("ENFORCER_ROLE"); + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + BridgeEscrowVault public bridgeEscrowVault; + ComplianceGuard public complianceGuard; + mapping(address => bool) public enabledTokens; // W token => enabled + + event TokenEnabled(address indexed token, bool enabled); + event ComplianceChecked( + address indexed token, + bytes32 reasonCode, + bool compliant + ); + + error ComplianceViolation(bytes32 reasonCode); + error TokenNotEnabled(); + error InvalidToken(); + + constructor( + address admin, + address bridgeEscrowVault_, + address complianceGuard_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ENFORCER_ROLE, admin); + _grantRole(OPERATOR_ROLE, admin); + + require(bridgeEscrowVault_ != address(0), "WTokenComplianceEnforcer: zero bridge"); + require(complianceGuard_ != address(0), "WTokenComplianceEnforcer: zero guard"); + + bridgeEscrowVault = BridgeEscrowVault(bridgeEscrowVault_); + complianceGuard = ComplianceGuard(complianceGuard_); + } + + /** + * @notice Check compliance before bridge operation + * @param token W token address + * @param bridgeAmount Amount to bridge + * @return compliant True if compliant + */ + function checkComplianceBeforeBridge( + address token, + uint256 bridgeAmount + ) external returns (bool compliant) { + if (!enabledTokens[token]) revert TokenNotEnabled(); + + IISO4217WToken wToken = IISO4217WToken(token); + string memory currencyCode = wToken.currencyCode(); + uint256 verifiedReserve = wToken.verifiedReserve(); + uint256 currentSupply = wToken.totalSupply(); + uint256 newSupply = currentSupply - bridgeAmount; // Supply after bridge + + // Validate mint operation (simulating future state) + (bool isValid, bytes32 reasonCode) = complianceGuard.validateMint( + currencyCode, + bridgeAmount, + newSupply, + verifiedReserve + ); + + if (!isValid) { + emit ComplianceChecked(token, reasonCode, false); + revert ComplianceViolation(reasonCode); + } + + // Validate money multiplier = 1.0 + if (!complianceGuard.validateMoneyMultiplier(verifiedReserve, newSupply)) { + bytes32 multiplierReason = keccak256("MONEY_MULTIPLIER_VIOLATION"); + emit ComplianceChecked(token, multiplierReason, false); + revert ComplianceViolation(multiplierReason); + } + + // Validate GRU isolation + if (complianceGuard.violatesGRUIsolation(currencyCode)) { + bytes32 gruReason = keccak256("GRU_ISOLATION_VIOLATION"); + emit ComplianceChecked(token, gruReason, false); + revert ComplianceViolation(gruReason); + } + + emit ComplianceChecked(token, bytes32(0), true); + compliant = true; + } + + /** + * @notice Check compliance on destination chain (before minting bridged amount) + * @param currencyCode ISO-4217 currency code + * @param bridgeAmount Amount to mint on destination + * @param destinationReserve Reserve on destination chain + * @param destinationSupply Supply on destination chain (before mint) + * @return compliant True if compliant + */ + function checkDestinationCompliance( + string memory currencyCode, + uint256 bridgeAmount, + uint256 destinationReserve, + uint256 destinationSupply + ) external returns (bool compliant) { + uint256 newSupply = destinationSupply + bridgeAmount; + + // Validate mint operation + (bool isValid, bytes32 reasonCode) = complianceGuard.validateMint( + currencyCode, + bridgeAmount, + destinationSupply, // Current supply + destinationReserve + ); + + if (!isValid) { + emit ComplianceChecked(address(0), reasonCode, false); + revert ComplianceViolation(reasonCode); + } + + // Validate money multiplier = 1.0 after mint + if (!complianceGuard.validateMoneyMultiplier(destinationReserve, newSupply)) { + bytes32 multiplierReason = keccak256("MONEY_MULTIPLIER_VIOLATION"); + emit ComplianceChecked(address(0), multiplierReason, false); + revert ComplianceViolation(multiplierReason); + } + + // Validate GRU isolation + if (complianceGuard.violatesGRUIsolation(currencyCode)) { + bytes32 gruReason = keccak256("GRU_ISOLATION_VIOLATION"); + emit ComplianceChecked(address(0), gruReason, false); + revert ComplianceViolation(gruReason); + } + + emit ComplianceChecked(address(0), bytes32(0), true); + compliant = true; + } + + /** + * @notice Enable a W token for compliance checking + * @param token W token address + */ + function enableToken(address token) external onlyRole(OPERATOR_ROLE) { + require(token != address(0), "WTokenComplianceEnforcer: zero token"); + + // Verify it's a valid W token + try IISO4217WToken(token).currencyCode() returns (string memory) { + enabledTokens[token] = true; + emit TokenEnabled(token, true); + } catch { + revert InvalidToken(); + } + } + + /** + * @notice Disable a W token + * @param token W token address + */ + function disableToken(address token) external onlyRole(OPERATOR_ROLE) { + enabledTokens[token] = false; + emit TokenEnabled(token, false); + } + + /** + * @notice Check if token is enabled + */ + function isTokenEnabled(address token) external view returns (bool) { + return enabledTokens[token]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/WTokenReserveVerifier.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/WTokenReserveVerifier.sol new file mode 100644 index 0000000..eeff586 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/WTokenReserveVerifier.sol @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeEscrowVault.sol"; +import "../../iso4217w/interfaces/IISO4217WToken.sol"; +import "../../iso4217w/oracle/ReserveOracle.sol"; + +/** + * @title WTokenReserveVerifier + * @notice Verifies W token reserves before allowing bridge operations + * @dev Ensures 1:1 backing maintained across bridge operations + */ +contract WTokenReserveVerifier is AccessControl { + bytes32 public constant VERIFIER_ROLE = keccak256("VERIFIER_ROLE"); + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + BridgeEscrowVault public bridgeEscrowVault; + ReserveOracle public reserveOracle; + mapping(address => bool) public verifiedTokens; // W token => verified + + // Reserve verification threshold (10000 = 100%) + uint256 public reserveThreshold = 10000; // 100% (must be fully backed) + + event TokenVerified(address indexed token, bool verified); + event ReserveVerified( + address indexed token, + uint256 reserve, + uint256 supply, + uint256 bridgeAmount, + bool sufficient + ); + + error InsufficientReserve(); + error TokenNotVerified(); + error InvalidToken(); + + constructor( + address admin, + address bridgeEscrowVault_, + address reserveOracle_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(VERIFIER_ROLE, admin); + _grantRole(OPERATOR_ROLE, admin); + + require(bridgeEscrowVault_ != address(0), "WTokenReserveVerifier: zero bridge"); + require(reserveOracle_ != address(0), "WTokenReserveVerifier: zero oracle"); + + bridgeEscrowVault = BridgeEscrowVault(bridgeEscrowVault_); + reserveOracle = ReserveOracle(reserveOracle_); + } + + /** + * @notice Verify reserve before bridge operation + * @param token W token address + * @param bridgeAmount Amount to bridge + * @return verified True if reserve is sufficient + */ + function verifyReserveBeforeBridge( + address token, + uint256 bridgeAmount + ) external returns (bool verified) { + if (!verifiedTokens[token]) revert TokenNotVerified(); + + IISO4217WToken wToken = IISO4217WToken(token); + + uint256 verifiedReserve = wToken.verifiedReserve(); + uint256 currentSupply = wToken.totalSupply(); + + // After bridge, supply on this chain decreases, but reserve must still cover remaining supply + // Reserve must be >= (currentSupply - bridgeAmount) * reserveThreshold / 10000 + uint256 requiredReserve = ((currentSupply - bridgeAmount) * reserveThreshold) / 10000; + + verified = verifiedReserve >= requiredReserve; + + if (!verified) revert InsufficientReserve(); + + emit ReserveVerified(token, verifiedReserve, currentSupply, bridgeAmount, verified); + } + + /** + * @notice Verify reserve on destination chain (after bridge) + * @param token W token address on destination chain + * @param bridgeAmount Amount bridged + * @param destinationReserve Reserve on destination chain + * @param destinationSupply Supply on destination chain (before minting bridged amount) + * @return verified True if destination reserve is sufficient + */ + function verifyDestinationReserve( + address token, + uint256 bridgeAmount, + uint256 destinationReserve, + uint256 destinationSupply + ) external returns (bool verified) { + // After minting bridged amount on destination: newSupply = destinationSupply + bridgeAmount + // Required reserve: (newSupply * reserveThreshold) / 10000 + uint256 newSupply = destinationSupply + bridgeAmount; + uint256 requiredReserve = (newSupply * reserveThreshold) / 10000; + + verified = destinationReserve >= requiredReserve; + + if (!verified) revert InsufficientReserve(); + + emit ReserveVerified(token, destinationReserve, newSupply, bridgeAmount, verified); + } + + /** + * @notice Verify reserve sufficiency using oracle + * @param token W token address + * @param bridgeAmount Amount to bridge + * @return verified True if reserve is sufficient according to oracle + */ + function verifyReserveWithOracle( + address token, + uint256 bridgeAmount + ) external returns (bool verified) { + if (!verifiedTokens[token]) revert TokenNotVerified(); + + IISO4217WToken wToken = IISO4217WToken(token); + + // Get currency code from token + string memory currencyCode = wToken.currencyCode(); + + // Get verified reserve from oracle (consensus) + (uint256 verifiedReserve, ) = reserveOracle.getVerifiedReserve(currencyCode); + + uint256 currentSupply = wToken.totalSupply(); + + // Required reserve after bridge + uint256 requiredReserve = ((currentSupply - bridgeAmount) * reserveThreshold) / 10000; + + verified = verifiedReserve >= requiredReserve; + + if (!verified) revert InsufficientReserve(); + + emit ReserveVerified(token, verifiedReserve, currentSupply, bridgeAmount, verified); + } + + /** + * @notice Register a W token for reserve verification + * @param token W token address + */ + function registerToken(address token) external onlyRole(OPERATOR_ROLE) { + require(token != address(0), "WTokenReserveVerifier: zero token"); + + // Verify it's a valid W token (implements IISO4217WToken) + try IISO4217WToken(token).currencyCode() returns (string memory) { + verifiedTokens[token] = true; + emit TokenVerified(token, true); + } catch { + revert InvalidToken(); + } + } + + /** + * @notice Unregister a W token + * @param token W token address + */ + function unregisterToken(address token) external onlyRole(OPERATOR_ROLE) { + verifiedTokens[token] = false; + emit TokenVerified(token, false); + } + + /** + * @notice Set reserve verification threshold + * @param threshold Threshold in basis points (10000 = 100%) + */ + function setReserveThreshold(uint256 threshold) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(threshold <= 10000, "WTokenReserveVerifier: threshold > 100%"); + require(threshold >= 10000, "WTokenReserveVerifier: threshold must be 100%"); // Hard requirement + reserveThreshold = threshold; + } + + /** + * @notice Check if token is verified + */ + function isTokenVerified(address token) external view returns (bool) { + return verifiedTokens[token]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/eMoneyBridgeIntegration.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/eMoneyBridgeIntegration.sol new file mode 100644 index 0000000..d72b7e7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/eMoneyBridgeIntegration.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeRegistry.sol"; +import "../../emoney/TokenFactory138.sol"; + +/** + * @title eMoneyBridgeIntegration + * @notice Automatically registers eMoney tokens with BridgeRegistry + * @dev Extends eMoney token system to auto-register tokens with bridge + */ +contract eMoneyBridgeIntegration is AccessControl { + bytes32 public constant INTEGRATOR_ROLE = keccak256("INTEGRATOR_ROLE"); + + BridgeRegistry public bridgeRegistry; + + // Default bridge configuration for eMoney tokens + uint256 public defaultMinBridgeAmount = 100e18; // 100 tokens minimum + uint256 public defaultMaxBridgeAmount = 1_000_000e18; // 1M tokens maximum + uint8 public defaultRiskLevel = 60; // Medium-high risk (credit instrument) + uint256 public defaultBridgeFeeBps = 15; // 0.15% default fee + + // Destination chain IDs (regulated entities only - EVM chains) + uint256[] public defaultDestinations; + + event eMoneyTokenRegistered( + address indexed token, + string indexed currencyCode, + uint256[] destinationChainIds + ); + + constructor( + address admin, + address bridgeRegistry_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(INTEGRATOR_ROLE, admin); + + require(bridgeRegistry_ != address(0), "eMoneyBridgeIntegration: zero bridge registry"); + + bridgeRegistry = BridgeRegistry(bridgeRegistry_); + + // Set default destinations (EVM chains only - regulated entities) + defaultDestinations.push(137); // Polygon + defaultDestinations.push(10); // Optimism + defaultDestinations.push(8453); // Base + defaultDestinations.push(42161); // Arbitrum + defaultDestinations.push(43114); // Avalanche + defaultDestinations.push(56); // BNB Chain + defaultDestinations.push(42793); // Etherlink (Tezos EVM L2) + } + + /** + * @notice Register an eMoney token with bridge registry + * @param token eMoney token address + * @param currencyCode Currency code (for tracking) + * @param destinationChainIds Array of allowed destination chain IDs + * @param minAmount Minimum bridge amount + * @param maxAmount Maximum bridge amount + * @param riskLevel Risk level (0-255) + * @param bridgeFeeBps Bridge fee in basis points + */ + function registereMoneyToken( + address token, + string memory currencyCode, + uint256[] memory destinationChainIds, + uint256 minAmount, + uint256 maxAmount, + uint8 riskLevel, + uint256 bridgeFeeBps + ) public onlyRole(INTEGRATOR_ROLE) { + require(token != address(0), "eMoneyBridgeIntegration: zero token"); + require(destinationChainIds.length > 0, "eMoneyBridgeIntegration: no destinations"); + require(minAmount > 0, "eMoneyBridgeIntegration: zero min amount"); + require(maxAmount >= minAmount, "eMoneyBridgeIntegration: max < min"); + require(bridgeFeeBps <= 10000, "eMoneyBridgeIntegration: fee > 100%"); + + bridgeRegistry.registerToken( + token, + minAmount, + maxAmount, + destinationChainIds, + riskLevel, + bridgeFeeBps + ); + + emit eMoneyTokenRegistered(token, currencyCode, destinationChainIds); + } + + /** + * @notice Register an eMoney token with default configuration + * @param token eMoney token address + * @param currencyCode Currency code + */ + function registereMoneyTokenDefault( + address token, + string memory currencyCode + ) external onlyRole(INTEGRATOR_ROLE) { + registereMoneyToken( + token, + currencyCode, + defaultDestinations, + defaultMinBridgeAmount, + defaultMaxBridgeAmount, + defaultRiskLevel, + defaultBridgeFeeBps + ); + } + + /** + * @notice Set default bridge configuration + */ + function setDefaultMinBridgeAmount(uint256 minAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(minAmount > 0, "eMoneyBridgeIntegration: zero min amount"); + defaultMinBridgeAmount = minAmount; + } + + function setDefaultMaxBridgeAmount(uint256 maxAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(maxAmount >= defaultMinBridgeAmount, "eMoneyBridgeIntegration: max < min"); + defaultMaxBridgeAmount = maxAmount; + } + + function setDefaultRiskLevel(uint8 riskLevel) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(riskLevel <= 255, "eMoneyBridgeIntegration: invalid risk level"); + defaultRiskLevel = riskLevel; + } + + function setDefaultBridgeFeeBps(uint256 feeBps) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(feeBps <= 10000, "eMoneyBridgeIntegration: fee > 100%"); + defaultBridgeFeeBps = feeBps; + } + + function setDefaultDestinations(uint256[] memory chainIds) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(chainIds.length > 0, "eMoneyBridgeIntegration: no destinations"); + defaultDestinations = chainIds; + } + + /** + * @notice Get default destinations + */ + function getDefaultDestinations() external view returns (uint256[] memory) { + return defaultDestinations; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/eMoneyPolicyEnforcer.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/eMoneyPolicyEnforcer.sol new file mode 100644 index 0000000..94ccfaf --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/integration/eMoneyPolicyEnforcer.sol @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interop/BridgeEscrowVault.sol"; +import "../../emoney/PolicyManager.sol"; +import "../../emoney/ComplianceRegistry.sol"; + +/** + * @title eMoneyPolicyEnforcer + * @notice Enforces eMoney transfer restrictions on bridge operations + * @dev Integrates PolicyManager and ComplianceRegistry with bridge + */ +contract eMoneyPolicyEnforcer is AccessControl { + bytes32 public constant ENFORCER_ROLE = keccak256("ENFORCER_ROLE"); + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + BridgeEscrowVault public bridgeEscrowVault; + PolicyManager public policyManager; + ComplianceRegistry public complianceRegistry; + mapping(address => bool) public enabledTokens; // eMoney token => enabled + + event TokenEnabled(address indexed token, bool enabled); + event TransferAuthorized( + address indexed token, + address indexed from, + address indexed to, + uint256 amount, + bool authorized + ); + + error TransferNotAuthorized(); + error TokenNotEnabled(); + error InvalidToken(); + + constructor( + address admin, + address bridgeEscrowVault_, + address policyManager_, + address complianceRegistry_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ENFORCER_ROLE, admin); + _grantRole(OPERATOR_ROLE, admin); + + require(bridgeEscrowVault_ != address(0), "eMoneyPolicyEnforcer: zero bridge"); + require(policyManager_ != address(0), "eMoneyPolicyEnforcer: zero policy manager"); + require(complianceRegistry_ != address(0), "eMoneyPolicyEnforcer: zero compliance registry"); + + bridgeEscrowVault = BridgeEscrowVault(bridgeEscrowVault_); + policyManager = PolicyManager(policyManager_); + complianceRegistry = ComplianceRegistry(complianceRegistry_); + } + + /** + * @notice Check if transfer is authorized before bridge operation + * @param token eMoney token address + * @param from Source address + * @param to Destination address (bridge escrow) + * @param amount Amount to bridge + * @return authorized True if transfer is authorized + */ + function checkTransferAuthorization( + address token, + address from, + address to, + uint256 amount + ) external returns (bool authorized) { + if (!enabledTokens[token]) revert TokenNotEnabled(); + + // Check PolicyManager authorization + (bool isAuthorized, bytes32 reasonCode) = policyManager.canTransfer( + token, + from, + to, + amount + ); + + if (!isAuthorized) { + emit TransferAuthorized(token, from, to, amount, false); + revert TransferNotAuthorized(); + } + + // Check ComplianceRegistry restrictions + bool complianceAllowed = complianceRegistry.canTransfer(token, from, to, amount); + + if (!complianceAllowed) { + emit TransferAuthorized(token, from, to, amount, false); + revert TransferNotAuthorized(); + } + + emit TransferAuthorized(token, from, to, amount, true); + authorized = true; + } + + /** + * @notice Check transfer authorization with additional context + * @param token eMoney token address + * @param from Source address + * @param to Destination address + * @param amount Amount to transfer + * @param context Additional context data + * @return authorized True if transfer is authorized + */ + function checkTransferAuthorizationWithContext( + address token, + address from, + address to, + uint256 amount, + bytes memory context + ) external returns (bool authorized) { + if (!enabledTokens[token]) revert TokenNotEnabled(); + + // Check PolicyManager with context + (bool isAuthorized, bytes32 reasonCode) = policyManager.canTransferWithContext( + token, + from, + to, + amount, + context + ); + + if (!isAuthorized) { + emit TransferAuthorized(token, from, to, amount, false); + revert TransferNotAuthorized(); + } + + // Check ComplianceRegistry + bool complianceAllowed = complianceRegistry.canTransfer(token, from, to, amount); + + if (!complianceAllowed) { + emit TransferAuthorized(token, from, to, amount, false); + revert TransferNotAuthorized(); + } + + emit TransferAuthorized(token, from, to, amount, true); + authorized = true; + } + + /** + * @notice Enable an eMoney token for policy enforcement + * @param token eMoney token address + */ + function enableToken(address token) external onlyRole(OPERATOR_ROLE) { + require(token != address(0), "eMoneyPolicyEnforcer: zero token"); + enabledTokens[token] = true; + emit TokenEnabled(token, true); + } + + /** + * @notice Disable an eMoney token + * @param token eMoney token address + */ + function disableToken(address token) external onlyRole(OPERATOR_ROLE) { + enabledTokens[token] = false; + emit TokenEnabled(token, false); + } + + /** + * @notice Check if token is enabled + */ + function isTokenEnabled(address token) external view returns (bool) { + return enabledTokens[token]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interfaces/IAlltraTransport.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interfaces/IAlltraTransport.sol new file mode 100644 index 0000000..d0e005d --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interfaces/IAlltraTransport.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IAlltraTransport + * @notice Transport for 138 <-> ALL Mainnet (651940); does not use CCIP. + * @dev ALL Mainnet is not supported by CCIP. This interface is used by AlltraAdapter + * to delegate the actual lock/relay/mint flow to a custom bridge or relay. + */ +interface IAlltraTransport { + /** + * @notice Lock tokens and initiate transfer to ALL Mainnet (651940). + * @param token Token address (address(0) for native). + * @param amount Amount to bridge. + * @param recipient Recipient on ALL Mainnet. + * @return requestId Unique request id for status/confirmation. + */ + function lockAndRelay( + address token, + uint256 amount, + address recipient + ) external payable returns (bytes32 requestId); + + /** + * @notice Check if this transport is configured (e.g. relayer set). + */ + function isConfigured() external view returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interfaces/IChainAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interfaces/IChainAdapter.sol new file mode 100644 index 0000000..bdfc4ba --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interfaces/IChainAdapter.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IChainAdapter + * @notice Interface for chain-specific bridge adapters + * @dev All chain adapters must implement this interface + */ +interface IChainAdapter { + enum BridgeStatus { + Pending, + Locked, + Confirmed, + Completed, + Failed, + Cancelled + } + + struct BridgeRequest { + address sender; + address token; + uint256 amount; + bytes destinationData; // Chain-specific destination (address, account, etc.) + bytes32 requestId; + BridgeStatus status; + uint256 createdAt; + uint256 completedAt; + } + + /** + * @notice Get chain type identifier + */ + function getChainType() external pure returns (string memory); + + /** + * @notice Get chain identifier (chainId for EVM, string for non-EVM) + */ + function getChainIdentifier() external view returns (uint256 chainId, string memory identifier); + + /** + * @notice Validate destination address/identifier for this chain + */ + function validateDestination(bytes calldata destination) external pure returns (bool); + + /** + * @notice Initiate bridge operation + * @param token Token address (address(0) for native) + * @param amount Amount to bridge + * @param destination Chain-specific destination data + * @param recipient Recipient address/identifier + * @return requestId Unique request identifier + */ + function bridge( + address token, + uint256 amount, + bytes calldata destination, + bytes calldata recipient + ) external payable returns (bytes32 requestId); + + /** + * @notice Get bridge request status + */ + function getBridgeStatus(bytes32 requestId) + external view returns (BridgeRequest memory); + + /** + * @notice Cancel pending bridge (if supported) + */ + function cancelBridge(bytes32 requestId) external returns (bool); + + /** + * @notice Estimate bridge fee + */ + function estimateFee( + address token, + uint256 amount, + bytes calldata destination + ) external view returns (uint256 fee); + + /** + * @notice Check if adapter is active + */ + function isActive() external view returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/BridgeEscrowVault.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/BridgeEscrowVault.sol new file mode 100644 index 0000000..5cf44ce --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/BridgeEscrowVault.sol @@ -0,0 +1,375 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/** + * @title BridgeEscrowVault + * @notice Enhanced escrow vault for multi-rail bridging (EVM, XRPL, Fabric) + * @dev Supports HSM-backed admin functions via EIP-712 signatures + */ +contract BridgeEscrowVault is ReentrancyGuard, Pausable, AccessControl, EIP712 { + using SafeERC20 for IERC20; + + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + bytes32 public constant REFUND_ROLE = keccak256("REFUND_ROLE"); + + enum DestinationType { + EVM, + XRPL, + FABRIC + } + + enum TransferStatus { + INITIATED, + DEPOSIT_CONFIRMED, + ROUTE_SELECTED, + EXECUTING, + DESTINATION_SENT, + FINALITY_CONFIRMED, + COMPLETED, + FAILED, + REFUND_PENDING, + REFUNDED + } + + struct Transfer { + bytes32 transferId; + address depositor; + address asset; // address(0) for native ETH + uint256 amount; + DestinationType destinationType; + bytes destinationData; // Encoded destination address/identifier + uint256 timestamp; + uint256 timeout; + TransferStatus status; + bool refunded; + } + + struct RefundRequest { + bytes32 transferId; + uint256 deadline; + bytes hsmSignature; + } + + // EIP-712 type hashes + bytes32 private constant REFUND_TYPEHASH = + keccak256("RefundRequest(bytes32 transferId,uint256 deadline)"); + + mapping(bytes32 => Transfer) public transfers; + mapping(bytes32 => bool) public processedTransferIds; + mapping(address => uint256) public nonces; + + event Deposit( + bytes32 indexed transferId, + address indexed depositor, + address indexed asset, + uint256 amount, + DestinationType destinationType, + bytes destinationData, + uint256 timestamp + ); + + event TransferStatusUpdated( + bytes32 indexed transferId, + TransferStatus oldStatus, + TransferStatus newStatus + ); + + event RefundInitiated( + bytes32 indexed transferId, + address indexed depositor, + uint256 amount + ); + + event RefundExecuted( + bytes32 indexed transferId, + address indexed depositor, + uint256 amount + ); + + error ZeroAmount(); + error ZeroRecipient(); + error ZeroAsset(); + error TransferAlreadyProcessed(); + error TransferNotFound(); + error TransferNotRefundable(); + error InvalidTimeout(); + error InvalidSignature(); + error TransferNotTimedOut(); + error InvalidStatus(); + + constructor(address admin) EIP712("BridgeEscrowVault", "1") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(PAUSER_ROLE, admin); + _grantRole(OPERATOR_ROLE, admin); + _grantRole(REFUND_ROLE, admin); + } + + /** + * @notice Deposit native ETH for cross-chain transfer + * @param destinationType Type of destination (EVM, XRPL, Fabric) + * @param destinationData Encoded destination address/identifier + * @param timeout Timeout in seconds for refund eligibility + * @param nonce User-provided nonce for replay protection + * @return transferId Unique transfer identifier + */ + function depositNative( + DestinationType destinationType, + bytes calldata destinationData, + uint256 timeout, + bytes32 nonce + ) external payable nonReentrant whenNotPaused returns (bytes32 transferId) { + if (msg.value == 0) revert ZeroAmount(); + if (destinationData.length == 0) revert ZeroRecipient(); + if (timeout == 0) revert InvalidTimeout(); + + nonces[msg.sender]++; + + transferId = _generateTransferId( + address(0), + msg.value, + destinationType, + destinationData, + nonce + ); + + if (processedTransferIds[transferId]) revert TransferAlreadyProcessed(); + processedTransferIds[transferId] = true; + + transfers[transferId] = Transfer({ + transferId: transferId, + depositor: msg.sender, + asset: address(0), + amount: msg.value, + destinationType: destinationType, + destinationData: destinationData, + timestamp: block.timestamp, + timeout: timeout, + status: TransferStatus.INITIATED, + refunded: false + }); + + emit Deposit( + transferId, + msg.sender, + address(0), + msg.value, + destinationType, + destinationData, + block.timestamp + ); + + return transferId; + } + + /** + * @notice Deposit ERC-20 tokens for cross-chain transfer + * @param token ERC-20 token address + * @param amount Amount to deposit + * @param destinationType Type of destination (EVM, XRPL, Fabric) + * @param destinationData Encoded destination address/identifier + * @param timeout Timeout in seconds for refund eligibility + * @param nonce User-provided nonce for replay protection + * @return transferId Unique transfer identifier + */ + function depositERC20( + address token, + uint256 amount, + DestinationType destinationType, + bytes calldata destinationData, + uint256 timeout, + bytes32 nonce + ) external nonReentrant whenNotPaused returns (bytes32 transferId) { + if (token == address(0)) revert ZeroAsset(); + if (amount == 0) revert ZeroAmount(); + if (destinationData.length == 0) revert ZeroRecipient(); + if (timeout == 0) revert InvalidTimeout(); + + nonces[msg.sender]++; + + transferId = _generateTransferId( + token, + amount, + destinationType, + destinationData, + nonce + ); + + if (processedTransferIds[transferId]) revert TransferAlreadyProcessed(); + processedTransferIds[transferId] = true; + + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + + transfers[transferId] = Transfer({ + transferId: transferId, + depositor: msg.sender, + asset: token, + amount: amount, + destinationType: destinationType, + destinationData: destinationData, + timestamp: block.timestamp, + timeout: timeout, + status: TransferStatus.INITIATED, + refunded: false + }); + + emit Deposit( + transferId, + msg.sender, + token, + amount, + destinationType, + destinationData, + block.timestamp + ); + + return transferId; + } + + /** + * @notice Update transfer status (operator only) + * @param transferId Transfer identifier + * @param newStatus New status + */ + function updateTransferStatus( + bytes32 transferId, + TransferStatus newStatus + ) external onlyRole(OPERATOR_ROLE) { + Transfer storage transfer = transfers[transferId]; + if (transfer.transferId == bytes32(0)) revert TransferNotFound(); + + TransferStatus oldStatus = transfer.status; + transfer.status = newStatus; + + emit TransferStatusUpdated(transferId, oldStatus, newStatus); + } + + /** + * @notice Initiate refund (requires HSM signature) + * @param request Refund request with HSM signature + * @param hsmSigner HSM signer address + */ + function initiateRefund( + RefundRequest calldata request, + address hsmSigner + ) external onlyRole(REFUND_ROLE) { + Transfer storage transfer = transfers[request.transferId]; + if (transfer.transferId == bytes32(0)) revert TransferNotFound(); + if (transfer.refunded) revert TransferNotRefundable(); + if (block.timestamp < transfer.timestamp + transfer.timeout) { + revert TransferNotTimedOut(); + } + + // Verify HSM signature + bytes32 structHash = keccak256( + abi.encode(REFUND_TYPEHASH, request.transferId, request.deadline) + ); + bytes32 hash = _hashTypedDataV4(structHash); + + if (ECDSA.recover(hash, request.hsmSignature) != hsmSigner) { + revert InvalidSignature(); + } + + if (block.timestamp > request.deadline) revert InvalidSignature(); + + transfer.status = TransferStatus.REFUND_PENDING; + emit RefundInitiated(request.transferId, transfer.depositor, transfer.amount); + } + + /** + * @notice Execute refund after initiation + * @param transferId Transfer identifier + */ + function executeRefund(bytes32 transferId) external nonReentrant onlyRole(REFUND_ROLE) { + Transfer storage transfer = transfers[transferId]; + if (transfer.transferId == bytes32(0)) revert TransferNotFound(); + if (transfer.refunded) revert TransferNotRefundable(); + if (transfer.status != TransferStatus.REFUND_PENDING) revert InvalidStatus(); + + transfer.refunded = true; + transfer.status = TransferStatus.REFUNDED; + + if (transfer.asset == address(0)) { + (bool success, ) = transfer.depositor.call{value: transfer.amount}(""); + require(success, "Refund failed"); + } else { + IERC20(transfer.asset).safeTransfer(transfer.depositor, transfer.amount); + } + + emit RefundExecuted(transferId, transfer.depositor, transfer.amount); + } + + /** + * @notice Get transfer details + * @param transferId Transfer identifier + * @return Transfer struct + */ + function getTransfer(bytes32 transferId) external view returns (Transfer memory) { + return transfers[transferId]; + } + + /** + * @notice Check if transfer is refundable + * @param transferId Transfer identifier + * @return True if refundable + */ + function isRefundable(bytes32 transferId) external view returns (bool) { + Transfer storage transfer = transfers[transferId]; + if (transfer.transferId == bytes32(0)) return false; + if (transfer.refunded) return false; + return block.timestamp >= transfer.timestamp + transfer.timeout; + } + + /** + * @notice Generate unique transfer ID + * @param asset Asset address + * @param amount Amount + * @param destinationType Destination type + * @param destinationData Destination data + * @param nonce User nonce + * @return transferId Unique identifier + */ + function _generateTransferId( + address asset, + uint256 amount, + DestinationType destinationType, + bytes calldata destinationData, + bytes32 nonce + ) internal view returns (bytes32) { + return + keccak256( + abi.encodePacked( + asset, + amount, + uint8(destinationType), + destinationData, + nonce, + msg.sender, + block.timestamp, + block.number + ) + ); + } + + /** + * @notice Pause contract + */ + function pause() external onlyRole(PAUSER_ROLE) { + _pause(); + } + + /** + * @notice Unpause contract + */ + function unpause() external onlyRole(PAUSER_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/BridgeRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/BridgeRegistry.sol new file mode 100644 index 0000000..408e4ed --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/BridgeRegistry.sol @@ -0,0 +1,341 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; + +/** + * @title BridgeRegistry + * @notice Registry for bridge configuration: destinations, tokens, fees, and routing + */ +contract BridgeRegistry is AccessControl, Pausable { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + + struct Destination { + uint256 chainId; // 0 for non-EVM + string chainName; + bool enabled; + uint256 minFinalityBlocks; + uint256 timeoutSeconds; + uint256 baseFee; // Base fee in basis points (10000 = 100%) + address feeRecipient; + } + + struct TokenConfig { + address tokenAddress; + bool allowed; + uint256 minAmount; + uint256 maxAmount; + uint256[] allowedDestinations; // Chain IDs or 0 for non-EVM + uint8 riskLevel; // 0-255, higher = riskier + uint256 bridgeFeeBps; // Bridge fee in basis points + } + + struct RouteHealth { + uint256 successCount; + uint256 failureCount; + uint256 lastUpdate; + uint256 avgSettlementTime; // In seconds + } + + mapping(uint256 => Destination) public destinations; // chainId -> Destination + mapping(address => TokenConfig) public tokenConfigs; + mapping(uint256 => mapping(address => RouteHealth)) public routeHealth; // chainId -> token -> health + mapping(address => bool) public allowedTokens; + + uint256[] public destinationChainIds; + address[] public registeredTokens; + + event DestinationRegistered( + uint256 indexed chainId, + string chainName, + uint256 minFinalityBlocks, + uint256 timeoutSeconds + ); + + event DestinationUpdated(uint256 indexed chainId, bool enabled); + + event TokenRegistered( + address indexed token, + uint256 minAmount, + uint256 maxAmount, + uint8 riskLevel + ); + + event TokenUpdated(address indexed token, bool allowed); + + event RouteHealthUpdated( + uint256 indexed chainId, + address indexed token, + bool success, + uint256 settlementTime + ); + + error DestinationNotFound(); + error TokenNotAllowed(); + error InvalidAmount(); + error InvalidDestination(); + error InvalidFee(); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a new destination chain + * @param chainId Chain ID (0 for non-EVM like XRPL) + * @param chainName Human-readable chain name + * @param minFinalityBlocks Minimum blocks/ledgers for finality + * @param timeoutSeconds Timeout for refund eligibility + * @param baseFee Base fee in basis points + * @param feeRecipient Address to receive fees + */ + function registerDestination( + uint256 chainId, + string calldata chainName, + uint256 minFinalityBlocks, + uint256 timeoutSeconds, + uint256 baseFee, + address feeRecipient + ) external onlyRole(REGISTRAR_ROLE) { + if (baseFee > 10000) revert InvalidFee(); // Max 100% + + destinations[chainId] = Destination({ + chainId: chainId, + chainName: chainName, + enabled: true, + minFinalityBlocks: minFinalityBlocks, + timeoutSeconds: timeoutSeconds, + baseFee: baseFee, + feeRecipient: feeRecipient + }); + + // Add to list if not already present + bool exists = false; + for (uint256 i = 0; i < destinationChainIds.length; i++) { + if (destinationChainIds[i] == chainId) { + exists = true; + break; + } + } + if (!exists) { + destinationChainIds.push(chainId); + } + + emit DestinationRegistered(chainId, chainName, minFinalityBlocks, timeoutSeconds); + } + + /** + * @notice Update destination enabled status + * @param chainId Chain ID + * @param enabled Enabled status + */ + function updateDestination( + uint256 chainId, + bool enabled + ) external onlyRole(REGISTRAR_ROLE) { + if (destinations[chainId].chainId == 0 && chainId != 0) revert DestinationNotFound(); + destinations[chainId].enabled = enabled; + emit DestinationUpdated(chainId, enabled); + } + + /** + * @notice Register a token for bridging + * @param token Token address + * @param minAmount Minimum bridge amount + * @param maxAmount Maximum bridge amount + * @param allowedDestinations Array of allowed destination chain IDs + * @param riskLevel Risk level (0-255) + * @param bridgeFeeBps Bridge fee in basis points + */ + function registerToken( + address token, + uint256 minAmount, + uint256 maxAmount, + uint256[] calldata allowedDestinations, + uint8 riskLevel, + uint256 bridgeFeeBps + ) external onlyRole(REGISTRAR_ROLE) { + if (bridgeFeeBps > 10000) revert InvalidFee(); + + tokenConfigs[token] = TokenConfig({ + tokenAddress: token, + allowed: true, + minAmount: minAmount, + maxAmount: maxAmount, + allowedDestinations: allowedDestinations, + riskLevel: riskLevel, + bridgeFeeBps: bridgeFeeBps + }); + + allowedTokens[token] = true; + + // Add to list if not already present + bool exists = false; + for (uint256 i = 0; i < registeredTokens.length; i++) { + if (registeredTokens[i] == token) { + exists = true; + break; + } + } + if (!exists) { + registeredTokens.push(token); + } + + emit TokenRegistered(token, minAmount, maxAmount, riskLevel); + } + + /** + * @notice Update token allowed status + * @param token Token address + * @param allowed Allowed status + */ + function updateToken(address token, bool allowed) external onlyRole(REGISTRAR_ROLE) { + if (tokenConfigs[token].tokenAddress == address(0)) revert TokenNotAllowed(); + tokenConfigs[token].allowed = allowed; + allowedTokens[token] = allowed; + emit TokenUpdated(token, allowed); + } + + /** + * @notice Update route health metrics + * @param chainId Destination chain ID + * @param token Token address + * @param success Whether the route succeeded + * @param settlementTime Settlement time in seconds + */ + function updateRouteHealth( + uint256 chainId, + address token, + bool success, + uint256 settlementTime + ) external onlyRole(REGISTRAR_ROLE) { + RouteHealth storage health = routeHealth[chainId][token]; + + if (success) { + health.successCount++; + // Update average settlement time (simple moving average) + if (health.successCount == 1) { + health.avgSettlementTime = settlementTime; + } else { + health.avgSettlementTime = + (health.avgSettlementTime * (health.successCount - 1) + settlementTime) / + health.successCount; + } + } else { + health.failureCount++; + } + + health.lastUpdate = block.timestamp; + + emit RouteHealthUpdated(chainId, token, success, settlementTime); + } + + /** + * @notice Validate bridge request + * @param token Token address (address(0) for native) + * @param amount Amount to bridge + * @param destinationChainId Destination chain ID + * @return isValid Whether request is valid + * @return fee Fee amount + */ + function validateBridgeRequest( + address token, + uint256 amount, + uint256 destinationChainId + ) external view returns (bool isValid, uint256 fee) { + // Check destination exists and is enabled + Destination memory dest = destinations[destinationChainId]; + if (dest.chainId == 0 && destinationChainId != 0) { + return (false, 0); + } + if (!dest.enabled) { + return (false, 0); + } + + // For native ETH, allow if destination is enabled + if (token == address(0)) { + fee = (amount * dest.baseFee) / 10000; + return (true, fee); + } + + // Check token is registered and allowed + TokenConfig memory config = tokenConfigs[token]; + if (!config.allowed || config.tokenAddress == address(0)) { + return (false, 0); + } + + // Check amount limits + if (amount < config.minAmount || amount > config.maxAmount) { + return (false, 0); + } + + // Check destination is allowed for this token + bool destAllowed = false; + for (uint256 i = 0; i < config.allowedDestinations.length; i++) { + if (config.allowedDestinations[i] == destinationChainId) { + destAllowed = true; + break; + } + } + if (!destAllowed) { + return (false, 0); + } + + // Calculate fee (base fee + token-specific fee) + uint256 baseFeeAmount = (amount * dest.baseFee) / 10000; + uint256 tokenFeeAmount = (amount * config.bridgeFeeBps) / 10000; + fee = baseFeeAmount + tokenFeeAmount; + + return (true, fee); + } + + /** + * @notice Get route health score (0-10000, higher is better) + * @param chainId Destination chain ID + * @param token Token address + * @return score Health score + */ + function getRouteHealthScore( + uint256 chainId, + address token + ) external view returns (uint256 score) { + RouteHealth memory health = routeHealth[chainId][token]; + uint256 total = health.successCount + health.failureCount; + if (total == 0) return 5000; // Default 50% if no data + + score = (health.successCount * 10000) / total; + return score; + } + + /** + * @notice Get all registered destinations + * @return chainIds Array of chain IDs + */ + function getAllDestinations() external view returns (uint256[] memory) { + return destinationChainIds; + } + + /** + * @notice Get all registered tokens + * @return tokens Array of token addresses + */ + function getAllTokens() external view returns (address[] memory) { + return registeredTokens; + } + + /** + * @notice Pause registry + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /** + * @notice Unpause registry + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/BridgeVerifier.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/BridgeVerifier.sol new file mode 100644 index 0000000..da186a7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/BridgeVerifier.sol @@ -0,0 +1,230 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/** + * @title BridgeVerifier + * @notice Verifies cross-chain proofs and attestor signatures for bridge operations + * @dev Supports multi-sig quorum for attestations + */ +contract BridgeVerifier is AccessControl, EIP712 { + using ECDSA for bytes32; + + bytes32 public constant ATTESTOR_ROLE = keccak256("ATTESTOR_ROLE"); + + bytes32 private constant ATTESTATION_TYPEHASH = + keccak256("Attestation(bytes32 transferId,bytes32 proofHash,uint256 nonce,uint256 deadline)"); + + struct Attestation { + bytes32 transferId; + bytes32 proofHash; + uint256 nonce; + uint256 deadline; + bytes signature; + } + + struct AttestorConfig { + address attestor; + bool enabled; + uint256 weight; // Weight for quorum calculation + } + + mapping(address => AttestorConfig) public attestors; + mapping(bytes32 => mapping(address => bool)) public attestations; // transferId -> attestor -> attested + mapping(bytes32 => uint256) public attestationWeights; // transferId -> total weight + mapping(uint256 => bool) public usedNonces; + + address[] public attestorList; + uint256 public totalAttestorWeight; + uint256 public quorumThreshold; // Minimum weight required (in basis points, 10000 = 100%) + + event AttestationSubmitted( + bytes32 indexed transferId, + address indexed attestor, + bytes32 proofHash + ); + + event AttestationVerified( + bytes32 indexed transferId, + uint256 totalWeight, + bool quorumMet + ); + + event AttestorAdded(address indexed attestor, uint256 weight); + event AttestorRemoved(address indexed attestor); + event AttestorUpdated(address indexed attestor, bool enabled, uint256 weight); + event QuorumThresholdUpdated(uint256 oldThreshold, uint256 newThreshold); + + error ZeroAddress(); + error AttestorNotFound(); + error InvalidSignature(); + error NonceAlreadyUsed(); + error DeadlineExpired(); + error InvalidQuorum(); + error AlreadyAttested(); + + constructor( + address admin, + uint256 _quorumThreshold + ) EIP712("BridgeVerifier", "1") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ATTESTOR_ROLE, admin); + if (_quorumThreshold > 10000) revert InvalidQuorum(); + quorumThreshold = _quorumThreshold; + } + + /** + * @notice Add an attestor + * @param attestor Attestor address + * @param weight Weight for quorum calculation + */ + function addAttestor( + address attestor, + uint256 weight + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + if (attestor == address(0)) revert ZeroAddress(); + if (attestors[attestor].attestor != address(0)) revert AttestorNotFound(); + + attestors[attestor] = AttestorConfig({ + attestor: attestor, + enabled: true, + weight: weight + }); + + attestorList.push(attestor); + totalAttestorWeight += weight; + + emit AttestorAdded(attestor, weight); + } + + /** + * @notice Remove an attestor + * @param attestor Attestor address + */ + function removeAttestor(address attestor) external onlyRole(DEFAULT_ADMIN_ROLE) { + AttestorConfig memory config = attestors[attestor]; + if (config.attestor == address(0)) revert AttestorNotFound(); + + totalAttestorWeight -= config.weight; + delete attestors[attestor]; + + // Remove from list + for (uint256 i = 0; i < attestorList.length; i++) { + if (attestorList[i] == attestor) { + attestorList[i] = attestorList[attestorList.length - 1]; + attestorList.pop(); + break; + } + } + + emit AttestorRemoved(attestor); + } + + /** + * @notice Update attestor configuration + * @param attestor Attestor address + * @param enabled Enabled status + * @param weight New weight + */ + function updateAttestor( + address attestor, + bool enabled, + uint256 weight + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + AttestorConfig storage config = attestors[attestor]; + if (config.attestor == address(0)) revert AttestorNotFound(); + + uint256 oldWeight = config.weight; + totalAttestorWeight = totalAttestorWeight - oldWeight + weight; + + config.enabled = enabled; + config.weight = weight; + + emit AttestorUpdated(attestor, enabled, weight); + } + + /** + * @notice Update quorum threshold + * @param newThreshold New threshold in basis points + */ + function setQuorumThreshold(uint256 newThreshold) external onlyRole(DEFAULT_ADMIN_ROLE) { + if (newThreshold > 10000) revert InvalidQuorum(); + uint256 oldThreshold = quorumThreshold; + quorumThreshold = newThreshold; + emit QuorumThresholdUpdated(oldThreshold, newThreshold); + } + + /** + * @notice Submit an attestation + * @param attestation Attestation with signature + */ + function submitAttestation(Attestation calldata attestation) external { + AttestorConfig memory config = attestors[msg.sender]; + if (config.attestor == address(0) || !config.enabled) revert AttestorNotFound(); + if (block.timestamp > attestation.deadline) revert DeadlineExpired(); + if (usedNonces[attestation.nonce]) revert NonceAlreadyUsed(); + if (attestations[attestation.transferId][msg.sender]) revert AlreadyAttested(); + + // Verify signature + bytes32 structHash = keccak256( + abi.encode( + ATTESTATION_TYPEHASH, + attestation.transferId, + attestation.proofHash, + attestation.nonce, + attestation.deadline + ) + ); + bytes32 hash = _hashTypedDataV4(structHash); + + if (hash.recover(attestation.signature) != msg.sender) { + revert InvalidSignature(); + } + + usedNonces[attestation.nonce] = true; + attestations[attestation.transferId][msg.sender] = true; + attestationWeights[attestation.transferId] += config.weight; + + emit AttestationSubmitted(attestation.transferId, msg.sender, attestation.proofHash); + } + + /** + * @notice Verify if quorum is met for a transfer + * @param transferId Transfer identifier + * @return quorumMet Whether quorum threshold is met + * @return totalWeight Total weight of attestations + * @return requiredWeight Required weight for quorum + */ + function verifyQuorum( + bytes32 transferId + ) external view returns (bool quorumMet, uint256 totalWeight, uint256 requiredWeight) { + totalWeight = attestationWeights[transferId]; + requiredWeight = (totalAttestorWeight * quorumThreshold) / 10000; + quorumMet = totalWeight >= requiredWeight; + return (quorumMet, totalWeight, requiredWeight); + } + + /** + * @notice Check if an attestor has attested to a transfer + * @param transferId Transfer identifier + * @param attestor Attestor address + * @return True if attested + */ + function hasAttested( + bytes32 transferId, + address attestor + ) external view returns (bool) { + return attestations[transferId][attestor]; + } + + /** + * @notice Get all attestors + * @return Array of attestor addresses + */ + function getAllAttestors() external view returns (address[] memory) { + return attestorList; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/MintBurnController.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/MintBurnController.sol new file mode 100644 index 0000000..c807ce3 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/MintBurnController.sol @@ -0,0 +1,170 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "./wXRP.sol"; + +/** + * @title MintBurnController + * @notice HSM-backed controller for wXRP mint/burn operations + * @dev Uses EIP-712 signatures for HSM authorization + */ +contract MintBurnController is AccessControl, Pausable, EIP712 { + using ECDSA for bytes32; + + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + bytes32 private constant MINT_TYPEHASH = + keccak256("MintRequest(address to,uint256 amount,bytes32 xrplTxHash,uint256 nonce,uint256 deadline)"); + bytes32 private constant BURN_TYPEHASH = + keccak256("BurnRequest(address from,uint256 amount,bytes32 xrplTxHash,uint256 nonce,uint256 deadline)"); + + wXRP public immutable wXRP_TOKEN; + + mapping(uint256 => bool) public usedNonces; + address public hsmSigner; + + event MintExecuted( + address indexed to, + uint256 amount, + bytes32 xrplTxHash, + address executor + ); + + event BurnExecuted( + address indexed from, + uint256 amount, + bytes32 xrplTxHash, + address executor + ); + + event HSMSignerUpdated(address oldSigner, address newSigner); + + struct MintRequest { + address to; + uint256 amount; + bytes32 xrplTxHash; + uint256 nonce; + uint256 deadline; + bytes hsmSignature; + } + + struct BurnRequest { + address from; + uint256 amount; + bytes32 xrplTxHash; + uint256 nonce; + uint256 deadline; + bytes hsmSignature; + } + + error ZeroAmount(); + error ZeroAddress(); + error InvalidSignature(); + error NonceAlreadyUsed(); + error DeadlineExpired(); + error InvalidNonce(); + + constructor(address admin, address _wXRP, address _hsmSigner) EIP712("MintBurnController", "1") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(OPERATOR_ROLE, admin); + wXRP_TOKEN = wXRP(_wXRP); + hsmSigner = _hsmSigner; + } + + /** + * @notice Update HSM signer address + * @param newSigner New HSM signer address + */ + function setHSMSigner(address newSigner) external onlyRole(DEFAULT_ADMIN_ROLE) { + if (newSigner == address(0)) revert ZeroAddress(); + address oldSigner = hsmSigner; + hsmSigner = newSigner; + emit HSMSignerUpdated(oldSigner, newSigner); + } + + /** + * @notice Execute mint with HSM signature + * @param request Mint request with HSM signature + */ + function executeMint(MintRequest calldata request) external onlyRole(OPERATOR_ROLE) whenNotPaused { + if (request.to == address(0)) revert ZeroAddress(); + if (request.amount == 0) revert ZeroAmount(); + if (block.timestamp > request.deadline) revert DeadlineExpired(); + if (usedNonces[request.nonce]) revert NonceAlreadyUsed(); + + // Verify HSM signature + bytes32 structHash = keccak256( + abi.encode( + MINT_TYPEHASH, + request.to, + request.amount, + request.xrplTxHash, + request.nonce, + request.deadline + ) + ); + bytes32 hash = _hashTypedDataV4(structHash); + + if (hash.recover(request.hsmSignature) != hsmSigner) { + revert InvalidSignature(); + } + + usedNonces[request.nonce] = true; + + wXRP_TOKEN.mint(request.to, request.amount, request.xrplTxHash); + + emit MintExecuted(request.to, request.amount, request.xrplTxHash, msg.sender); + } + + /** + * @notice Execute burn with HSM signature + * @param request Burn request with HSM signature + */ + function executeBurn(BurnRequest calldata request) external onlyRole(OPERATOR_ROLE) whenNotPaused { + if (request.from == address(0)) revert ZeroAddress(); + if (request.amount == 0) revert ZeroAmount(); + if (block.timestamp > request.deadline) revert DeadlineExpired(); + if (usedNonces[request.nonce]) revert NonceAlreadyUsed(); + + // Verify HSM signature + bytes32 structHash = keccak256( + abi.encode( + BURN_TYPEHASH, + request.from, + request.amount, + request.xrplTxHash, + request.nonce, + request.deadline + ) + ); + bytes32 hash = _hashTypedDataV4(structHash); + + if (hash.recover(request.hsmSignature) != hsmSigner) { + revert InvalidSignature(); + } + + usedNonces[request.nonce] = true; + + wXRP_TOKEN.burnFrom(request.from, request.amount, request.xrplTxHash); + + emit BurnExecuted(request.from, request.amount, request.xrplTxHash, msg.sender); + } + + /** + * @notice Pause controller + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /** + * @notice Unpause controller + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/wXRP.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/wXRP.sol new file mode 100644 index 0000000..dea7b1c --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/interop/wXRP.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; + +/** + * @title wXRP + * @notice Wrapped XRP token (ERC-20) representing XRP locked on XRPL + * @dev Mintable/burnable by authorized bridge controller only + */ +contract wXRP is ERC20, ERC20Burnable, AccessControl, Pausable { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + + uint8 private constant DECIMALS = 18; + + event Minted(address indexed to, uint256 amount, bytes32 xrplTxHash); + event Burned(address indexed from, uint256 amount, bytes32 xrplTxHash); + + error ZeroAmount(); + error ZeroAddress(); + + constructor(address admin) ERC20("Wrapped XRP", "wXRP") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MINTER_ROLE, admin); + _grantRole(BURNER_ROLE, admin); + } + + /** + * @notice Mint wXRP tokens (bridge controller only) + * @param to Recipient address + * @param amount Amount to mint + * @param xrplTxHash XRPL transaction hash that locked the XRP + */ + function mint( + address to, + uint256 amount, + bytes32 xrplTxHash + ) external onlyRole(MINTER_ROLE) whenNotPaused { + if (to == address(0)) revert ZeroAddress(); + if (amount == 0) revert ZeroAmount(); + + _mint(to, amount); + emit Minted(to, amount, xrplTxHash); + } + + /** + * @notice Burn wXRP tokens to unlock XRP on XRPL (bridge controller only) + * @param from Address to burn from + * @param amount Amount to burn + * @param xrplTxHash XRPL transaction hash for the unlock + */ + function burnFrom( + address from, + uint256 amount, + bytes32 xrplTxHash + ) external onlyRole(BURNER_ROLE) whenNotPaused { + if (from == address(0)) revert ZeroAddress(); + if (amount == 0) revert ZeroAmount(); + + _burn(from, amount); + emit Burned(from, amount, xrplTxHash); + } + + /** + * @notice Override decimals to return 18 + */ + function decimals() public pure override returns (uint8) { + return DECIMALS; + } + + /** + * @notice Pause token transfers + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /** + * @notice Unpause token transfers + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/modules/BridgeModuleRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/modules/BridgeModuleRegistry.sol new file mode 100644 index 0000000..b009115 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/modules/BridgeModuleRegistry.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title BridgeModuleRegistry + * @notice Registry for bridge modules (hooks, validators, fee calculators) + * @dev Enables extending bridge functionality without modifying core contracts + */ +contract BridgeModuleRegistry is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant MODULE_ADMIN_ROLE = keccak256("MODULE_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + enum ModuleType { + PreBridgeHook, // Execute before bridge (e.g., compliance check) + PostBridgeHook, // Execute after bridge (e.g., notification) + FeeCalculator, // Custom fee calculation + RateLimiter, // Rate limiting logic + Validator // Custom validation + } + + struct Module { + address implementation; + bool active; + uint256 priority; + uint256 registeredAt; + } + + // Storage + mapping(ModuleType => address[]) public modules; + mapping(ModuleType => mapping(address => Module)) public moduleInfo; + mapping(ModuleType => uint256) public moduleCount; + + event ModuleRegistered( + ModuleType indexed moduleType, + address indexed module, + uint256 priority + ); + + event ModuleUnregistered( + ModuleType indexed moduleType, + address indexed module + ); + + event ModuleExecuted( + ModuleType indexed moduleType, + address indexed module, + bool success + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MODULE_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Register module + */ + function registerModule( + ModuleType moduleType, + address module, + uint256 priority + ) external onlyRole(MODULE_ADMIN_ROLE) { + require(module != address(0), "Zero address"); + require(module.code.length > 0, "Not a contract"); + require(moduleInfo[moduleType][module].implementation == address(0), "Already registered"); + + modules[moduleType].push(module); + moduleInfo[moduleType][module] = Module({ + implementation: module, + active: true, + priority: priority, + registeredAt: block.timestamp + }); + + moduleCount[moduleType]++; + + emit ModuleRegistered(moduleType, module, priority); + } + + /** + * @notice Unregister module + */ + function unregisterModule( + ModuleType moduleType, + address module + ) external onlyRole(MODULE_ADMIN_ROLE) { + require(moduleInfo[moduleType][module].implementation != address(0), "Not registered"); + + moduleInfo[moduleType][module].active = false; + moduleCount[moduleType]--; + + emit ModuleUnregistered(moduleType, module); + } + + /** + * @notice Execute all modules of a type + */ + function executeModules( + ModuleType moduleType, + bytes calldata data + ) external returns (bytes[] memory results) { + address[] memory activeModules = modules[moduleType]; + uint256 activeCount = 0; + + // Count active modules + for (uint256 i = 0; i < activeModules.length; i++) { + if (moduleInfo[moduleType][activeModules[i]].active) { + activeCount++; + } + } + + results = new bytes[](activeCount); + uint256 resultIndex = 0; + + // Execute each active module + for (uint256 i = 0; i < activeModules.length; i++) { + address module = activeModules[i]; + + if (!moduleInfo[moduleType][module].active) continue; + + (bool success, bytes memory result) = module.call(data); + + emit ModuleExecuted(moduleType, module, success); + + if (success) { + results[resultIndex] = result; + resultIndex++; + } + } + + return results; + } + + /** + * @notice Execute single module + */ + function executeModule( + ModuleType moduleType, + address module, + bytes calldata data + ) external returns (bytes memory result) { + require(moduleInfo[moduleType][module].active, "Module not active"); + + (bool success, bytes memory returnData) = module.call(data); + + emit ModuleExecuted(moduleType, module, success); + + require(success, "Module execution failed"); + + return returnData; + } + + /** + * @notice Set module priority + */ + function setModulePriority( + ModuleType moduleType, + address module, + uint256 priority + ) external onlyRole(MODULE_ADMIN_ROLE) { + require(moduleInfo[moduleType][module].implementation != address(0), "Not registered"); + + moduleInfo[moduleType][module].priority = priority; + } + + // View functions + + function getModules(ModuleType moduleType) external view returns (address[] memory) { + return modules[moduleType]; + } + + function getActiveModules(ModuleType moduleType) external view returns (address[] memory) { + address[] memory allModules = modules[moduleType]; + uint256 activeCount = 0; + + for (uint256 i = 0; i < allModules.length; i++) { + if (moduleInfo[moduleType][allModules[i]].active) { + activeCount++; + } + } + + address[] memory activeModules = new address[](activeCount); + uint256 index = 0; + + for (uint256 i = 0; i < allModules.length; i++) { + if (moduleInfo[moduleType][allModules[i]].active) { + activeModules[index] = allModules[i]; + index++; + } + } + + return activeModules; + } + + function getModuleInfo(ModuleType moduleType, address module) + external view returns (Module memory) { + return moduleInfo[moduleType][module]; + } + + function getModuleCount(ModuleType moduleType) external view returns (uint256) { + return moduleCount[moduleType]; + } + + function isModuleActive(ModuleType moduleType, address module) external view returns (bool) { + return moduleInfo[moduleType][module].active; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/BondManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/BondManager.sol new file mode 100644 index 0000000..0683ea9 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/BondManager.sol @@ -0,0 +1,267 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title BondManager + * @notice Manages bonds for trustless bridge claims with dynamic sizing and slashing + * @dev Bonds are posted in ETH. Slashed bonds split 50% to challenger, 50% burned (sent to address(0)). + */ +contract BondManager is ReentrancyGuard { + // Bond configuration + uint256 public immutable bondMultiplier; // Basis points (11000 = 110%) + uint256 public immutable minBond; // Minimum bond amount in wei + + // Bond tracking + struct Bond { + address relayer; // Slot 0 (20 bytes) + 12 bytes padding + uint256 amount; // Slot 1 + uint256 depositId; // Slot 2 + bool slashed; // Slot 3 (1 byte) + 31 bytes padding + bool released; // Slot 4 (1 byte) + 31 bytes padding + // Note: Could pack slashed and released in same slot, but keeping separate for clarity + } + + mapping(uint256 => Bond) public bonds; // depositId => Bond + mapping(address => uint256) public totalBonds; // relayer => total bonded amount + + event BondPosted( + uint256 indexed depositId, + address indexed relayer, + uint256 bondAmount + ); + + event BondSlashed( + uint256 indexed depositId, + address indexed relayer, + address indexed challenger, + uint256 bondAmount, + uint256 challengerReward, + uint256 burnedAmount + ); + + event BondReleased( + uint256 indexed depositId, + address indexed relayer, + uint256 bondAmount + ); + + error ZeroDepositId(); + error ZeroRelayer(); + error InsufficientBond(); + error BondNotFound(); + error BondAlreadySlashed(); + error BondAlreadyReleased(); + error BondNotReleased(); + + /** + * @notice Constructor sets bond parameters + * @param _bondMultiplier Bond multiplier in basis points (11000 = 110% = 1.1x) + * @param _minBond Minimum bond amount in wei + */ + constructor(uint256 _bondMultiplier, uint256 _minBond) { + require(_bondMultiplier >= 10000, "BondManager: multiplier must be >= 100%"); + require(_minBond > 0, "BondManager: minBond must be > 0"); + bondMultiplier = _bondMultiplier; + minBond = _minBond; + } + + /** + * @notice Post bond for a claim + * @param depositId Deposit ID from source chain + * @param depositAmount Amount of the deposit (used to calculate bond size) + * @param relayer Address of the relayer posting the bond (can be different from msg.sender if called by InboxETH) + * @return bondAmount The bond amount that was posted + */ + function postBond( + uint256 depositId, + uint256 depositAmount, + address relayer + ) external payable nonReentrant returns (uint256) { + if (depositId == 0) revert ZeroDepositId(); + if (relayer == address(0)) revert ZeroRelayer(); + + // Check if bond already exists + require(bonds[depositId].relayer == address(0), "BondManager: bond already posted"); + + // Calculate required bond amount + uint256 requiredBond = getRequiredBond(depositAmount); + if (msg.value < requiredBond) revert InsufficientBond(); + + // Store bond information + bonds[depositId] = Bond({ + relayer: relayer, + amount: msg.value, + depositId: depositId, + slashed: false, + released: false + }); + + totalBonds[relayer] += msg.value; + + emit BondPosted(depositId, msg.sender, msg.value); + + return msg.value; + } + + /** + * @notice Slash bond due to fraudulent claim + * @param depositId Deposit ID associated with the bond + * @param challenger Address of the challenger proving fraud + * @return challengerReward Amount sent to challenger + * @return burnedAmount Amount burned (sent to address(0)) + */ + function slashBond( + uint256 depositId, + address challenger + ) external nonReentrant returns (uint256 challengerReward, uint256 burnedAmount) { + Bond storage bond = bonds[depositId]; + + if (bond.relayer == address(0)) revert BondNotFound(); + if (bond.slashed) revert BondAlreadySlashed(); + if (challenger == address(0)) revert ZeroRelayer(); + + // Mark bond as slashed + bond.slashed = true; + + uint256 bondAmount = bond.amount; + + // Update relayer's total bonds + totalBonds[bond.relayer] -= bondAmount; + + // Split bond: 50% to challenger, 50% burned + challengerReward = bondAmount / 2; + burnedAmount = bondAmount - challengerReward; // Handle odd amounts + + // Transfer to challenger + (bool success1, ) = payable(challenger).call{value: challengerReward}(""); + require(success1, "BondManager: challenger transfer failed"); + + // Burn remaining amount (send to address(0)) + // Note: In practice, sending ETH to address(0) doesn't actually burn it, + // but it makes the funds inaccessible. For true burning, consider using a burn mechanism. + (bool success2, ) = payable(address(0)).call{value: burnedAmount}(""); + require(success2, "BondManager: burn transfer failed"); + + emit BondSlashed( + depositId, + bond.relayer, + challenger, + bondAmount, + challengerReward, + burnedAmount + ); + + return (challengerReward, burnedAmount); + } + + /** + * @notice Release bond after successful claim finalization + * @param depositId Deposit ID associated with the bond + * @return bondAmount Amount returned to relayer + */ + function releaseBond( + uint256 depositId + ) external nonReentrant returns (uint256) { + Bond storage bond = bonds[depositId]; + + if (bond.relayer == address(0)) revert BondNotFound(); + if (bond.slashed) revert BondAlreadySlashed(); + if (bond.released) revert BondAlreadyReleased(); + + // Mark bond as released + bond.released = true; + + uint256 bondAmount = bond.amount; + address relayer = bond.relayer; // Cache to save gas + + // Update relayer's total bonds + totalBonds[relayer] -= bondAmount; + + // Transfer bond back to relayer + (bool success, ) = payable(relayer).call{value: bondAmount}(""); + require(success, "BondManager: release transfer failed"); + + emit BondReleased(depositId, relayer, bondAmount); + + return bondAmount; + } + + /** + * @notice Release multiple bonds in batch (gas optimization) + * @param depositIds Array of deposit IDs to release bonds for + * @return totalReleased Total amount released + */ + function releaseBondsBatch(uint256[] calldata depositIds) external nonReentrant returns (uint256 totalReleased) { + uint256 length = depositIds.length; + require(length > 0, "BondManager: empty array"); + require(length <= 50, "BondManager: batch too large"); // Prevent gas limit issues + + for (uint256 i = 0; i < length; i++) { + uint256 depositId = depositIds[i]; + if (depositId == 0) continue; // Skip zero IDs + + Bond storage bond = bonds[depositId]; + if (bond.relayer == address(0)) continue; // Skip non-existent bonds + if (bond.slashed) continue; // Skip slashed bonds + if (bond.released) continue; // Skip already released + + bond.released = true; + uint256 bondAmount = bond.amount; + address relayer = bond.relayer; // Cache to save gas + + totalBonds[relayer] -= bondAmount; + totalReleased += bondAmount; + + (bool success, ) = payable(relayer).call{value: bondAmount}(""); + require(success, "BondManager: release transfer failed"); + + emit BondReleased(depositId, relayer, bondAmount); + } + + return totalReleased; + } + + /** + * @notice Calculate required bond amount for a deposit + * @param depositAmount Amount of the deposit + * @return requiredBond Minimum bond amount required + */ + function getRequiredBond(uint256 depositAmount) public view returns (uint256) { + uint256 calculatedBond = (depositAmount * bondMultiplier) / 10000; + return calculatedBond > minBond ? calculatedBond : minBond; + } + + /** + * @notice Get bond information for a deposit + * @param depositId Deposit ID to check + * @return relayer Address that posted the bond + * @return amount Bond amount + * @return slashed Whether bond has been slashed + * @return released Whether bond has been released + */ + function getBond( + uint256 depositId + ) external view returns ( + address relayer, + uint256 amount, + bool slashed, + bool released + ) { + Bond memory bond = bonds[depositId]; + return (bond.relayer, bond.amount, bond.slashed, bond.released); + } + + /** + * @notice Get total bonds posted by a relayer + * @param relayer Address to check + * @return Total amount of bonds posted + */ + function getTotalBonds(address relayer) external view returns (uint256) { + return totalBonds[relayer]; + } + + // Allow contract to receive ETH + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/BridgeSwapCoordinator.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/BridgeSwapCoordinator.sol new file mode 100644 index 0000000..85ec208 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/BridgeSwapCoordinator.sol @@ -0,0 +1,171 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./InboxETH.sol"; +import "./LiquidityPoolETH.sol"; +import "./SwapRouter.sol"; +import "./ChallengeManager.sol"; + +/** + * @title BridgeSwapCoordinator + * @notice Coordinates bridge release + swap in single transaction + * @dev Verifies claim finalization, releases from liquidity pool, executes swap, transfers stablecoin + */ +contract BridgeSwapCoordinator is ReentrancyGuard { + using SafeERC20 for IERC20; + + InboxETH public immutable inbox; + LiquidityPoolETH public immutable liquidityPool; + SwapRouter public immutable swapRouter; + ChallengeManager public immutable challengeManager; + + event BridgeSwapExecuted( + uint256 indexed depositId, + address indexed recipient, + LiquidityPoolETH.AssetType inputAsset, + uint256 bridgeAmount, + address stablecoinToken, + uint256 stablecoinAmount + ); + + error ZeroDepositId(); + error ZeroRecipient(); + error ClaimNotFinalized(); + error ClaimChallenged(); + error InsufficientOutput(); + + /** + * @notice Constructor + * @param _inbox InboxETH contract address + * @param _liquidityPool LiquidityPoolETH contract address + * @param _swapRouter SwapRouter contract address + * @param _challengeManager ChallengeManager contract address + */ + constructor( + address _inbox, + address _liquidityPool, + address _swapRouter, + address _challengeManager + ) { + require(_inbox != address(0), "BridgeSwapCoordinator: zero inbox"); + require(_liquidityPool != address(0), "BridgeSwapCoordinator: zero liquidity pool"); + require(_swapRouter != address(0), "BridgeSwapCoordinator: zero swap router"); + require(_challengeManager != address(0), "BridgeSwapCoordinator: zero challenge manager"); + + inbox = InboxETH(payable(_inbox)); + liquidityPool = LiquidityPoolETH(payable(_liquidityPool)); + swapRouter = SwapRouter(payable(_swapRouter)); + challengeManager = ChallengeManager(payable(_challengeManager)); + } + + /** + * @notice Execute bridge release + swap to stablecoin + * @param depositId Deposit ID + * @param recipient Recipient address (should match claim recipient) + * @param outputAsset Asset type from bridge (ETH or WETH) + * @param stablecoinToken Target stablecoin address (USDT, USDC, or DAI) + * @param amountOutMin Minimum stablecoin output (slippage protection) + * @param routeData Optional route data for swap (for 1inch) + * @return stablecoinAmount Amount of stablecoin received + */ + function bridgeAndSwap( + uint256 depositId, + address recipient, + LiquidityPoolETH.AssetType outputAsset, + address stablecoinToken, + uint256 amountOutMin, + bytes calldata routeData + ) external nonReentrant returns (uint256 stablecoinAmount) { + if (depositId == 0) revert ZeroDepositId(); + if (recipient == address(0)) revert ZeroRecipient(); + + // Verify claim is finalized + ChallengeManager.Claim memory claim = challengeManager.getClaim(depositId); + if (claim.depositId == 0) revert("BridgeSwapCoordinator: claim not found"); + if (!claim.finalized) revert ClaimNotFinalized(); + if (claim.challenged) revert ClaimChallenged(); + if (claim.recipient != recipient) revert("BridgeSwapCoordinator: recipient mismatch"); + + // Use amount from claim (ChallengeManager has the claim data) + uint256 bridgeAmount = claim.amount; + + // Add pending claim (this should have been done during claim submission, but check anyway) + // Note: In production, you'd want to track whether funds have already been released + + // Release funds from liquidity pool to this contract + liquidityPool.releaseToRecipient(depositId, address(this), bridgeAmount, outputAsset); + + // Execute swap + if (outputAsset == LiquidityPoolETH.AssetType.ETH) { + // Swap ETH to stablecoin via SwapRouter + stablecoinAmount = swapRouter.swapToStablecoin{value: bridgeAmount}( + outputAsset, + stablecoinToken, + bridgeAmount, + amountOutMin, + routeData + ); + } else { + // WETH case: approve and swap + // Get WETH address from liquidity pool + address wethAddress = liquidityPool.getWeth(); + IERC20 wethToken = IERC20(wethAddress); + wethToken.approve(address(swapRouter), bridgeAmount); + + stablecoinAmount = swapRouter.swapToStablecoin( + outputAsset, + stablecoinToken, + bridgeAmount, + amountOutMin, + routeData + ); + } + + if (stablecoinAmount < amountOutMin) revert InsufficientOutput(); + + // Transfer stablecoin to recipient + IERC20(stablecoinToken).safeTransfer(recipient, stablecoinAmount); + + // Note: Bond release should be handled separately after finalization + // This coordinator only handles bridge release + swap + + emit BridgeSwapExecuted( + depositId, + recipient, + outputAsset, + bridgeAmount, + stablecoinToken, + stablecoinAmount + ); + + return stablecoinAmount; + } + + /** + * @notice Check if claim can be swapped + * @param depositId Deposit ID + * @return canSwap_ True if claim can be swapped + * @return reason Reason if cannot swap + */ + function canSwap(uint256 depositId) external view returns (bool canSwap_, string memory reason) { + ChallengeManager.Claim memory claim = challengeManager.getClaim(depositId); + + if (claim.depositId == 0) { + return (false, "Claim not found"); + } + if (!claim.finalized) { + return (false, "Claim not finalized"); + } + if (claim.challenged) { + return (false, "Claim was challenged"); + } + + return (true, ""); + } + + // Allow contract to receive ETH + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/ChallengeManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/ChallengeManager.sol new file mode 100644 index 0000000..a596b3f --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/ChallengeManager.sol @@ -0,0 +1,458 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./BondManager.sol"; +import "./libraries/MerkleProofVerifier.sol"; +import "./libraries/FraudProofTypes.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title ChallengeManager + * @notice Manages fraud proof challenges for trustless bridge claims + * @dev Permissionless challenging mechanism with automated slashing on successful challenges + */ +contract ChallengeManager is ReentrancyGuard { + BondManager public immutable bondManager; + uint256 public immutable challengeWindow; // Challenge window duration in seconds + + enum FraudProofType { + NonExistentDeposit, // Deposit doesn't exist on source chain + IncorrectAmount, // Amount mismatch + IncorrectRecipient, // Recipient mismatch + DoubleSpend // Deposit already claimed elsewhere + } + + struct Challenge { + address challenger; + uint256 depositId; + FraudProofType proofType; + bytes proof; + uint256 timestamp; + bool resolved; + } + + struct Claim { + uint256 depositId; // Slot 0 + address asset; // Slot 1 (20 bytes) + 12 bytes padding + address recipient; // Slot 2 (20 bytes) + 12 bytes padding + uint256 amount; // Slot 3 + uint256 challengeWindowEnd; // Slot 4 + bool finalized; // Slot 5 (1 byte) + 31 bytes padding + bool challenged; // Slot 6 (1 byte) + 31 bytes padding + // Note: Could pack finalized and challenged in same slot, but keeping separate for clarity + } + + mapping(uint256 => Claim) public claims; // depositId => Claim + mapping(uint256 => Challenge) public challenges; // depositId => Challenge + + event ClaimSubmitted( + uint256 indexed depositId, + address indexed asset, + uint256 amount, + address indexed recipient, + uint256 challengeWindowEnd + ); + + event ClaimChallenged( + uint256 indexed depositId, + address indexed challenger, + FraudProofType proofType + ); + + event FraudProven( + uint256 indexed depositId, + address indexed challenger, + FraudProofType proofType, + uint256 slashedAmount + ); + + event ChallengeRejected( + uint256 indexed depositId, + address indexed challenger + ); + + event ClaimFinalized( + uint256 indexed depositId + ); + + error ZeroDepositId(); + error ClaimNotFound(); + error ClaimAlreadyFinalized(); + error ClaimAlreadyChallenged(); + error ChallengeWindowExpired(); + error ChallengeWindowNotExpired(); + error InvalidFraudProof(); + error ChallengeNotFound(); + error ChallengeAlreadyResolved(); + + /** + * @notice Constructor + * @param _bondManager Address of BondManager contract + * @param _challengeWindow Challenge window duration in seconds + */ + constructor(address _bondManager, uint256 _challengeWindow) { + require(_bondManager != address(0), "ChallengeManager: zero bond manager"); + require(_challengeWindow > 0, "ChallengeManager: zero challenge window"); + bondManager = BondManager(payable(_bondManager)); + challengeWindow = _challengeWindow; + } + + /** + * @notice Register a claim (called by InboxETH) + * @param depositId Deposit ID from source chain + * @param asset Asset address (address(0) for native ETH) + * @param amount Deposit amount + * @param recipient Recipient address + */ + function registerClaim( + uint256 depositId, + address asset, + uint256 amount, + address recipient + ) external { + if (depositId == 0) revert ZeroDepositId(); + + // Only allow one claim per deposit ID + require(claims[depositId].depositId == 0, "ChallengeManager: claim already registered"); + + uint256 challengeWindowEnd = block.timestamp + challengeWindow; + + claims[depositId] = Claim({ + depositId: depositId, + asset: asset, + amount: amount, + recipient: recipient, + challengeWindowEnd: challengeWindowEnd, + finalized: false, + challenged: false + }); + + emit ClaimSubmitted(depositId, asset, amount, recipient, challengeWindowEnd); + } + + /** + * @notice Challenge a claim with fraud proof + * @param depositId Deposit ID of the claim to challenge + * @param proofType Type of fraud proof + * @param proof Fraud proof data (format depends on proofType) + */ + function challengeClaim( + uint256 depositId, + FraudProofType proofType, + bytes calldata proof + ) external nonReentrant { + if (depositId == 0) revert ZeroDepositId(); + + Claim storage claim = claims[depositId]; + if (claim.depositId == 0) revert ClaimNotFound(); + if (claim.finalized) revert ClaimAlreadyFinalized(); + if (claim.challenged) revert ClaimAlreadyChallenged(); + if (block.timestamp > claim.challengeWindowEnd) revert ChallengeWindowExpired(); + + // Verify fraud proof (pass storage reference to save gas) + if (!_verifyFraudProof(depositId, claim, proofType, proof)) { + revert InvalidFraudProof(); + } + + // Mark claim as challenged + claim.challenged = true; + + // Store challenge + challenges[depositId] = Challenge({ + challenger: msg.sender, + depositId: depositId, + proofType: proofType, + proof: proof, + timestamp: block.timestamp, + resolved: false + }); + + emit ClaimChallenged(depositId, msg.sender, proofType); + + // Automatically slash bond and mark challenge as resolved + (uint256 challengerReward, ) = bondManager.slashBond(depositId, msg.sender); + + challenges[depositId].resolved = true; + + emit FraudProven(depositId, msg.sender, proofType, challengerReward * 2); // Total slashed amount + } + + /** + * @notice Finalize a claim after challenge window expires without challenge + * @param depositId Deposit ID to finalize + */ + function finalizeClaim(uint256 depositId) external { + if (depositId == 0) revert ZeroDepositId(); + + Claim storage claim = claims[depositId]; + if (claim.depositId == 0) revert ClaimNotFound(); + if (claim.finalized) revert ClaimAlreadyFinalized(); + if (claim.challenged) revert ClaimAlreadyChallenged(); + if (block.timestamp <= claim.challengeWindowEnd) revert ChallengeWindowNotExpired(); + + claim.finalized = true; + + emit ClaimFinalized(depositId); + } + + /** + * @notice Finalize multiple claims in batch (gas optimization) + * @param depositIds Array of deposit IDs to finalize + */ + function finalizeClaimsBatch(uint256[] calldata depositIds) external { + uint256 length = depositIds.length; + require(length > 0, "ChallengeManager: empty array"); + require(length <= 50, "ChallengeManager: batch too large"); // Prevent gas limit issues + + for (uint256 i = 0; i < length; i++) { + uint256 depositId = depositIds[i]; + if (depositId == 0) continue; // Skip zero IDs + + Claim storage claim = claims[depositId]; + if (claim.depositId == 0) continue; // Skip non-existent claims + if (claim.finalized) continue; // Skip already finalized + if (claim.challenged) continue; // Skip challenged claims + if (block.timestamp <= claim.challengeWindowEnd) continue; // Skip if window not expired + + claim.finalized = true; + emit ClaimFinalized(depositId); + } + } + + /** + * @notice Verify fraud proof (internal function) + * @dev Verifies fraud proofs against source chain state using Merkle proofs + * @param depositId Deposit ID + * @param claim Claim data + * @param proofType Type of fraud proof + * @param proof Proof data (encoded according to proofType) + * @return True if fraud proof is valid + */ + function _verifyFraudProof( + uint256 depositId, + Claim storage claim, // Changed to storage to save gas + FraudProofType proofType, + bytes calldata proof + ) internal view returns (bool) { + if (proof.length == 0) return false; + + if (proofType == FraudProofType.NonExistentDeposit) { + return _verifyNonExistentDeposit(depositId, claim, proof); + } else if (proofType == FraudProofType.IncorrectAmount) { + return _verifyIncorrectAmount(depositId, claim, proof); + } else if (proofType == FraudProofType.IncorrectRecipient) { + return _verifyIncorrectRecipient(depositId, claim, proof); + } else if (proofType == FraudProofType.DoubleSpend) { + return _verifyDoubleSpend(depositId, claim, proof); + } + + return false; + } + + /** + * @notice Verify non-existent deposit fraud proof + * @param depositId Deposit ID + * @param claim Claim data + * @param proof Encoded NonExistentDepositProof + * @return True if proof is valid + */ + function _verifyNonExistentDeposit( + uint256 depositId, + Claim storage claim, // Changed to storage to save gas + bytes calldata proof + ) internal view returns (bool) { + FraudProofTypes.NonExistentDepositProof memory fraudProof = + FraudProofTypes.decodeNonExistentDeposit(proof); + + // Verify state root against block header + if (!MerkleProofVerifier.verifyStateRoot(fraudProof.blockHeader, fraudProof.stateRoot)) { + return false; + } + + // Hash the claimed deposit data + bytes32 claimedDepositHash = MerkleProofVerifier.hashDepositData( + depositId, + claim.asset, + claim.amount, + claim.recipient, + block.timestamp // Note: In production, use actual deposit timestamp from source chain + ); + + // Verify that the claimed deposit hash matches the proof + if (claimedDepositHash != fraudProof.depositHash) { + return false; + } + + // Verify non-existence proof (deposit doesn't exist in Merkle tree) + return MerkleProofVerifier.verifyDepositNonExistence( + fraudProof.stateRoot, + fraudProof.depositHash, + fraudProof.merkleProof, + fraudProof.leftSibling, + fraudProof.rightSibling + ); + } + + /** + * @notice Verify incorrect amount fraud proof + * @param depositId Deposit ID + * @param claim Claim data + * @param proof Encoded IncorrectAmountProof + * @return True if proof is valid + */ + function _verifyIncorrectAmount( + uint256 depositId, + Claim storage claim, // Changed to storage to save gas + bytes calldata proof + ) internal view returns (bool) { + FraudProofTypes.IncorrectAmountProof memory fraudProof = + FraudProofTypes.decodeIncorrectAmount(proof); + + // Verify state root against block header + if (!MerkleProofVerifier.verifyStateRoot(fraudProof.blockHeader, fraudProof.stateRoot)) { + return false; + } + + // Verify that actual amount differs from claimed amount + if (fraudProof.actualAmount == claim.amount) { + return false; // Amounts match, not a fraud + } + + // Hash the actual deposit data + bytes32 actualDepositHash = MerkleProofVerifier.hashDepositData( + depositId, + claim.asset, + fraudProof.actualAmount, + claim.recipient, + block.timestamp // Note: In production, use actual deposit timestamp + ); + + // Verify Merkle proof for actual deposit + return MerkleProofVerifier.verifyDepositExistence( + fraudProof.stateRoot, + actualDepositHash, + fraudProof.merkleProof + ); + } + + /** + * @notice Verify incorrect recipient fraud proof + * @param depositId Deposit ID + * @param claim Claim data + * @param proof Encoded IncorrectRecipientProof + * @return True if proof is valid + */ + function _verifyIncorrectRecipient( + uint256 depositId, + Claim storage claim, // Changed to storage to save gas + bytes calldata proof + ) internal view returns (bool) { + FraudProofTypes.IncorrectRecipientProof memory fraudProof = + FraudProofTypes.decodeIncorrectRecipient(proof); + + // Verify state root against block header + if (!MerkleProofVerifier.verifyStateRoot(fraudProof.blockHeader, fraudProof.stateRoot)) { + return false; + } + + // Verify that actual recipient differs from claimed recipient + if (fraudProof.actualRecipient == claim.recipient) { + return false; // Recipients match, not a fraud + } + + // Hash the actual deposit data + bytes32 actualDepositHash = MerkleProofVerifier.hashDepositData( + depositId, + claim.asset, + claim.amount, + fraudProof.actualRecipient, + block.timestamp // Note: In production, use actual deposit timestamp + ); + + // Verify Merkle proof for actual deposit + return MerkleProofVerifier.verifyDepositExistence( + fraudProof.stateRoot, + actualDepositHash, + fraudProof.merkleProof + ); + } + + /** + * @notice Verify double spend fraud proof + * @param depositId Deposit ID + * @param claim Claim data + * @param proof Encoded DoubleSpendProof + * @return True if proof is valid + */ + function _verifyDoubleSpend( + uint256 depositId, + Claim storage claim, // Changed to storage to save gas + bytes calldata proof + ) internal view returns (bool) { + FraudProofTypes.DoubleSpendProof memory fraudProof = + FraudProofTypes.decodeDoubleSpend(proof); + + // Verify that the previous claim ID is different (same deposit claimed twice) + if (fraudProof.previousClaimId == depositId) { + // Check if previous claim exists and is finalized (use storage to save gas) + Claim storage previousClaim = claims[fraudProof.previousClaimId]; + if (previousClaim.depositId == 0 || !previousClaim.finalized) { + return false; // Previous claim doesn't exist or isn't finalized + } + + // Verify that the deposit data matches (same deposit, different claim) + if ( + previousClaim.asset == claim.asset && + previousClaim.amount == claim.amount && + previousClaim.recipient == claim.recipient + ) { + return true; // Double spend detected + } + } + + return false; + } + + /** + * @notice Check if a claim can be finalized + * @param depositId Deposit ID to check + * @return canFinalize_ True if claim can be finalized + * @return reason Reason if cannot finalize + */ + function canFinalize(uint256 depositId) external view returns (bool canFinalize_, string memory reason) { + Claim memory claim = claims[depositId]; + + if (claim.depositId == 0) { + return (false, "Claim not found"); + } + if (claim.finalized) { + return (false, "Already finalized"); + } + if (claim.challenged) { + return (false, "Claim was challenged"); + } + if (block.timestamp <= claim.challengeWindowEnd) { + return (false, "Challenge window not expired"); + } + + return (true, ""); + } + + /** + * @notice Get claim information + * @param depositId Deposit ID + * @return Claim data + */ + function getClaim(uint256 depositId) external view returns (Claim memory) { + return claims[depositId]; + } + + /** + * @notice Get challenge information + * @param depositId Deposit ID + * @return Challenge data + */ + function getChallenge(uint256 depositId) external view returns (Challenge memory) { + return challenges[depositId]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/EnhancedSwapRouter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/EnhancedSwapRouter.sol new file mode 100644 index 0000000..4d0aa54 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/EnhancedSwapRouter.sol @@ -0,0 +1,689 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./LiquidityPoolETH.sol"; +import "./interfaces/ISwapRouter.sol"; +import "./interfaces/ICurvePool.sol"; +import "./interfaces/IAggregationRouter.sol"; +import "./interfaces/IDodoexRouter.sol"; +import "./interfaces/IBalancerVault.sol"; +import "./interfaces/IWETH.sol"; + +/** + * @title EnhancedSwapRouter + * @notice Multi-protocol swap router with intelligent routing and decision logic + * @dev Supports Uniswap V3, Curve, Dodoex PMM, Balancer, and 1inch aggregation + */ +contract EnhancedSwapRouter is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant COORDINATOR_ROLE = keccak256("COORDINATOR_ROLE"); + bytes32 public constant ROUTING_MANAGER_ROLE = keccak256("ROUTING_MANAGER_ROLE"); + + enum SwapProvider { + UniswapV3, + Curve, + Dodoex, + Balancer, + OneInch + } + + // Protocol addresses + address public immutable uniswapV3Router; + address public immutable curve3Pool; + address public immutable dodoexRouter; + address public immutable balancerVault; + address public immutable oneInchRouter; + + // Token addresses + address public immutable weth; + address public immutable usdt; + address public immutable usdc; + address public immutable dai; + + // Routing configuration + struct RoutingConfig { + SwapProvider[] providers; // Ordered list of providers to try + uint256[] sizeThresholds; // Size thresholds in wei + bool enabled; + } + + mapping(SwapProvider => bool) public providerEnabled; + mapping(uint256 => RoutingConfig) public sizeBasedRouting; // size category => config + uint256 public constant SMALL_SWAP_THRESHOLD = 10_000 * 1e18; // $10k + uint256 public constant MEDIUM_SWAP_THRESHOLD = 100_000 * 1e18; // $100k + + // Uniswap V3 fee tiers + uint24 public constant FEE_TIER_LOW = 500; + uint24 public constant FEE_TIER_MEDIUM = 3000; + uint24 public constant FEE_TIER_HIGH = 10000; + + // Balancer pool IDs (example - would be set via admin) + mapping(address => mapping(address => bytes32)) public balancerPoolIds; // tokenIn => tokenOut => poolId + + // Dodoex PMM pool addresses (tokenIn => tokenOut => PMM pool address) + mapping(address => mapping(address => address)) public dodoPoolAddresses; + + /// @dev Uniswap V3 Quoter for on-chain quotes; set via setUniswapQuoter when deployed on 138/651940 + address public uniswapQuoter; + + event SwapExecuted( + SwapProvider indexed provider, + LiquidityPoolETH.AssetType indexed inputAsset, + address indexed tokenIn, + address tokenOut, + uint256 amountIn, + uint256 amountOut, + uint256 gasUsed + ); + + event RoutingConfigUpdated(uint256 sizeCategory, SwapProvider[] providers); + event ProviderToggled(SwapProvider provider, bool enabled); + + error ZeroAddress(); + error ZeroAmount(); + error SwapFailed(); + error InvalidProvider(); + error ProviderDisabled(); + error InsufficientOutput(); + error InvalidRoutingConfig(); + + /** + * @notice Constructor + * @param _uniswapV3Router Uniswap V3 SwapRouter address + * @param _curve3Pool Curve 3pool address + * @param _dodoexRouter Dodoex Router address + * @param _balancerVault Balancer Vault address + * @param _oneInchRouter 1inch Router address (can be address(0)) + * @param _weth WETH address + * @param _usdt USDT address + * @param _usdc USDC address + * @param _dai DAI address + */ + constructor( + address _uniswapV3Router, + address _curve3Pool, + address _dodoexRouter, + address _balancerVault, + address _oneInchRouter, + address _weth, + address _usdt, + address _usdc, + address _dai + ) { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + if (_uniswapV3Router == address(0) || _curve3Pool == address(0) || + _dodoexRouter == address(0) || _balancerVault == address(0) || + _weth == address(0) || _usdt == address(0) || _usdc == address(0) || _dai == address(0)) { + revert ZeroAddress(); + } + + uniswapV3Router = _uniswapV3Router; + curve3Pool = _curve3Pool; + dodoexRouter = _dodoexRouter; + balancerVault = _balancerVault; + oneInchRouter = _oneInchRouter; + weth = _weth; + usdt = _usdt; + usdc = _usdc; + dai = _dai; + + // Enable all providers by default + providerEnabled[SwapProvider.UniswapV3] = true; + providerEnabled[SwapProvider.Curve] = true; + providerEnabled[SwapProvider.Dodoex] = true; + providerEnabled[SwapProvider.Balancer] = true; + if (_oneInchRouter != address(0)) { + providerEnabled[SwapProvider.OneInch] = true; + } + + // Initialize default routing configs + _initializeDefaultRouting(); + } + + /** + * @notice Swap to stablecoin using intelligent routing + * @param inputAsset Input asset type (ETH or WETH) + * @param stablecoinToken Target stablecoin + * @param amountIn Input amount + * @param amountOutMin Minimum output (slippage protection) + * @param preferredProvider Optional preferred provider (0 = auto-select) + * @return amountOut Output amount + * @return providerUsed Provider that executed the swap + */ + function swapToStablecoin( + LiquidityPoolETH.AssetType inputAsset, + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin, + SwapProvider preferredProvider + ) external payable nonReentrant returns (uint256 amountOut, SwapProvider providerUsed) { + if (amountIn == 0) revert ZeroAmount(); + if (stablecoinToken == address(0)) revert ZeroAddress(); + if (!_isValidStablecoin(stablecoinToken)) revert("EnhancedSwapRouter: invalid stablecoin"); + + // Convert ETH to WETH if needed + if (inputAsset == LiquidityPoolETH.AssetType.ETH) { + require(msg.value == amountIn, "EnhancedSwapRouter: ETH amount mismatch"); + IWETH(weth).deposit{value: amountIn}(); + } + + // Get routing providers based on swap size + SwapProvider[] memory providers = _getRoutingProviders(amountIn, preferredProvider); + + // Try each provider in order + for (uint256 i = 0; i < providers.length; i++) { + if (!providerEnabled[providers[i]]) continue; + + try this._executeSwap( + providers[i], + stablecoinToken, + amountIn, + amountOutMin + ) returns (uint256 output) { + if (output >= amountOutMin) { + // Transfer output to caller + IERC20(stablecoinToken).safeTransfer(msg.sender, output); + + emit SwapExecuted( + providers[i], + inputAsset, + weth, + stablecoinToken, + amountIn, + output, + gasleft() + ); + + return (output, providers[i]); + } + } catch { + // Try next provider + continue; + } + } + + revert SwapFailed(); + } + + /** + * @notice Get quote from all enabled providers + * @param stablecoinToken Target stablecoin + * @param amountIn Input amount + * @return providers Array of providers that returned quotes + * @return amounts Array of output amounts for each provider + */ + function getQuotes( + address stablecoinToken, + uint256 amountIn + ) external view returns (SwapProvider[] memory providers, uint256[] memory amounts) { + SwapProvider[] memory enabledProviders = new SwapProvider[](5); + uint256[] memory quotes = new uint256[](5); + uint256 count = 0; + + // Query each enabled provider + if (providerEnabled[SwapProvider.UniswapV3]) { + try this._getUniswapV3Quote(stablecoinToken, amountIn) returns (uint256 quote) { + enabledProviders[count] = SwapProvider.UniswapV3; + quotes[count] = quote; + count++; + } catch {} + } + + if (providerEnabled[SwapProvider.Dodoex]) { + try this._getDodoexQuote(stablecoinToken, amountIn) returns (uint256 quote) { + enabledProviders[count] = SwapProvider.Dodoex; + quotes[count] = quote; + count++; + } catch {} + } + + if (providerEnabled[SwapProvider.Balancer]) { + try this._getBalancerQuote(stablecoinToken, amountIn) returns (uint256 quote) { + enabledProviders[count] = SwapProvider.Balancer; + quotes[count] = quote; + count++; + } catch {} + } + + // Resize arrays + SwapProvider[] memory resultProviders = new SwapProvider[](count); + uint256[] memory resultQuotes = new uint256[](count); + for (uint256 i = 0; i < count; i++) { + resultProviders[i] = enabledProviders[i]; + resultQuotes[i] = quotes[i]; + } + + return (resultProviders, resultQuotes); + } + + /** + * @notice Set routing configuration for a size category + * @param sizeCategory 0 = small, 1 = medium, 2 = large + * @param providers Ordered list of providers to try + */ + function setRoutingConfig( + uint256 sizeCategory, + SwapProvider[] calldata providers + ) external onlyRole(ROUTING_MANAGER_ROLE) { + require(sizeCategory < 3, "EnhancedSwapRouter: invalid size category"); + require(providers.length > 0, "EnhancedSwapRouter: empty providers"); + + sizeBasedRouting[sizeCategory] = RoutingConfig({ + providers: providers, + sizeThresholds: new uint256[](0), + enabled: true + }); + + emit RoutingConfigUpdated(sizeCategory, providers); + } + + /** + * @notice Toggle provider on/off + * @param provider Provider to toggle + * @param enabled Whether to enable + */ + function setProviderEnabled( + SwapProvider provider, + bool enabled + ) external onlyRole(ROUTING_MANAGER_ROLE) { + providerEnabled[provider] = enabled; + emit ProviderToggled(provider, enabled); + } + + /** + * @notice Set Balancer pool ID for a token pair + * @param tokenIn Input token + * @param tokenOut Output token + * @param poolId Balancer pool ID + */ + function setBalancerPoolId( + address tokenIn, + address tokenOut, + bytes32 poolId + ) external onlyRole(ROUTING_MANAGER_ROLE) { + balancerPoolIds[tokenIn][tokenOut] = poolId; + } + + /** + * @notice Set Dodoex PMM pool address for a token pair + * @param tokenIn Input token + * @param tokenOut Output token + * @param poolAddress Dodo PMM pool address + */ + function setDodoPoolAddress( + address tokenIn, + address tokenOut, + address poolAddress + ) external onlyRole(ROUTING_MANAGER_ROLE) { + dodoPoolAddresses[tokenIn][tokenOut] = poolAddress; + } + + /** + * @notice Set Uniswap V3 Quoter address for on-chain quotes + * @param _quoter Quoter contract address (address(0) to use 0.5% slippage estimate) + */ + function setUniswapQuoter(address _quoter) external onlyRole(ROUTING_MANAGER_ROLE) { + uniswapQuoter = _quoter; + } + + /** + * @notice Swap arbitrary token pair via Dodoex when pool is configured + * @param tokenIn Input token + * @param tokenOut Output token + * @param amountIn Input amount + * @param amountOutMin Minimum output (slippage protection) + * @return amountOut Output amount + */ + function swapTokenToToken( + address tokenIn, + address tokenOut, + uint256 amountIn, + uint256 amountOutMin + ) external nonReentrant returns (uint256 amountOut) { + if (amountIn == 0) revert ZeroAmount(); + if (tokenIn == address(0) || tokenOut == address(0)) revert ZeroAddress(); + address pool = dodoPoolAddresses[tokenIn][tokenOut]; + require(pool != address(0), "EnhancedSwapRouter: Dodoex pool not configured"); + + IERC20(tokenIn).safeTransferFrom(msg.sender, address(this), amountIn); + IERC20(tokenIn).approve(dodoexRouter, amountIn); + + address[] memory dodoPairs = new address[](1); + dodoPairs[0] = pool; + + IDodoexRouter.DodoSwapParams memory params = IDodoexRouter.DodoSwapParams({ + fromToken: tokenIn, + toToken: tokenOut, + fromTokenAmount: amountIn, + minReturnAmount: amountOutMin, + dodoPairs: dodoPairs, + directions: 0, + isIncentive: false, + deadLine: block.timestamp + 300 + }); + + amountOut = IDodoexRouter(dodoexRouter).dodoSwapV2TokenToToken(params); + require(amountOut >= amountOutMin, "EnhancedSwapRouter: insufficient output"); + IERC20(tokenOut).safeTransfer(msg.sender, amountOut); + return amountOut; + } + + // ============ Internal Functions ============ + + /** + * @notice Execute swap via specified provider + */ + function _executeSwap( + SwapProvider provider, + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) external returns (uint256) { + require(msg.sender == address(this), "EnhancedSwapRouter: internal only"); + + if (provider == SwapProvider.UniswapV3) { + return _executeUniswapV3Swap(stablecoinToken, amountIn, amountOutMin); + } else if (provider == SwapProvider.Dodoex) { + return _executeDodoexSwap(stablecoinToken, amountIn, amountOutMin); + } else if (provider == SwapProvider.Balancer) { + return _executeBalancerSwap(stablecoinToken, amountIn, amountOutMin); + } else if (provider == SwapProvider.Curve) { + return _executeCurveSwap(stablecoinToken, amountIn, amountOutMin); + } else if (provider == SwapProvider.OneInch && oneInchRouter != address(0)) { + return _execute1inchSwap(stablecoinToken, amountIn, amountOutMin); + } + + revert InvalidProvider(); + } + + /** + * @notice Get routing providers based on swap size + */ + function _getRoutingProviders( + uint256 amountIn, + SwapProvider preferredProvider + ) internal view returns (SwapProvider[] memory) { + // If preferred provider is specified and enabled, use it first + if (preferredProvider != SwapProvider.UniswapV3 && providerEnabled[preferredProvider]) { + SwapProvider[] memory providers = new SwapProvider[](1); + providers[0] = preferredProvider; + return providers; + } + + // Determine size category + uint256 category; + if (amountIn < SMALL_SWAP_THRESHOLD) { + category = 0; // Small + } else if (amountIn < MEDIUM_SWAP_THRESHOLD) { + category = 1; // Medium + } else { + category = 2; // Large + } + + RoutingConfig memory config = sizeBasedRouting[category]; + if (config.enabled && config.providers.length > 0) { + return config.providers; + } + + // Default fallback routing + SwapProvider[] memory defaultProviders = new SwapProvider[](5); + defaultProviders[0] = SwapProvider.Dodoex; + defaultProviders[1] = SwapProvider.UniswapV3; + defaultProviders[2] = SwapProvider.Balancer; + defaultProviders[3] = SwapProvider.Curve; + defaultProviders[4] = SwapProvider.OneInch; + return defaultProviders; + } + + /** + * @notice Execute Uniswap V3 swap + */ + function _executeUniswapV3Swap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256) { + // Approve for swap + IERC20 wethToken = IERC20(weth); + wethToken.approve(uniswapV3Router, amountIn); + + ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ + tokenIn: weth, + tokenOut: stablecoinToken, + fee: FEE_TIER_MEDIUM, + recipient: address(this), + deadline: block.timestamp + 300, + amountIn: amountIn, + amountOutMinimum: amountOutMin, + sqrtPriceLimitX96: 0 + }); + + return ISwapRouter(uniswapV3Router).exactInputSingle(params); + } + + /** + * @notice Execute Dodoex PMM swap + */ + function _executeDodoexSwap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256) { + address pool = dodoPoolAddresses[weth][stablecoinToken]; + require(pool != address(0), "EnhancedSwapRouter: Dodoex pool not configured"); + + IERC20 wethToken = IERC20(weth); + wethToken.approve(dodoexRouter, amountIn); + + address[] memory dodoPairs = new address[](1); + dodoPairs[0] = pool; + + IDodoexRouter.DodoSwapParams memory params = IDodoexRouter.DodoSwapParams({ + fromToken: weth, + toToken: stablecoinToken, + fromTokenAmount: amountIn, + minReturnAmount: amountOutMin, + dodoPairs: dodoPairs, + directions: 0, + isIncentive: false, + deadLine: block.timestamp + 300 + }); + + return IDodoexRouter(dodoexRouter).dodoSwapV2TokenToToken(params); + } + + /** + * @notice Execute Balancer swap + */ + function _executeBalancerSwap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256) { + bytes32 poolId = balancerPoolIds[weth][stablecoinToken]; + require(poolId != bytes32(0), "EnhancedSwapRouter: pool not configured"); + + IERC20 wethToken = IERC20(weth); + wethToken.approve(balancerVault, amountIn); + + IBalancerVault.SingleSwap memory singleSwap = IBalancerVault.SingleSwap({ + poolId: poolId, + kind: IBalancerVault.SwapKind.GIVEN_IN, + assetIn: weth, + assetOut: stablecoinToken, + amount: amountIn, + userData: "" + }); + + IBalancerVault.FundManagement memory funds = IBalancerVault.FundManagement({ + sender: address(this), + fromInternalBalance: false, + recipient: payable(address(this)), + toInternalBalance: false + }); + + return IBalancerVault(balancerVault).swap( + singleSwap, + funds, + amountOutMin, + block.timestamp + 300 + ); + } + + /** + * @notice Execute Curve swap + */ + function _executeCurveSwap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256) { + // Curve 3pool doesn't support WETH directly + // Would need intermediate swap or different pool + revert("EnhancedSwapRouter: Curve direct swap not supported"); + } + + /** + * @notice Execute 1inch swap + */ + function _execute1inchSwap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256) { + if (oneInchRouter == address(0)) revert ProviderDisabled(); + + IERC20 wethToken = IERC20(weth); + wethToken.approve(oneInchRouter, amountIn); + + // 1inch: requires route data from 1inch API (e.g. /swap/v5.2/138/swap). Use 1inch SDK or API to get calldata and execute separately. + revert("EnhancedSwapRouter: 1inch requires route calldata from API; use 1inch aggregator SDK"); + } + + /** + * @notice Get Uniswap V3 quote (view) + * When UNISWAP_QUOTER_ADDRESS is configured, queries quoter. Otherwise returns + * estimate via amountIn * 9950/10000 (0.5% slippage) for stablecoin pairs. + */ + function _getUniswapV3Quote( + address stablecoinToken, + uint256 amountIn + ) external view returns (uint256) { + if (uniswapQuoter != address(0) && _isValidStablecoin(stablecoinToken)) { + // IQuoter.quoteExactInputSingle(tokenIn, tokenOut, fee, amountIn, sqrtPriceLimitX96) + (bool ok, bytes memory data) = uniswapQuoter.staticcall( + abi.encodeWithSignature( + "quoteExactInputSingle(address,address,uint24,uint256,uint160)", + weth, + stablecoinToken, + FEE_TIER_MEDIUM, + amountIn, + uint160(0) + ) + ); + if (ok && data.length >= 32) { + uint256 quoted = abi.decode(data, (uint256)); + if (quoted > 0) return quoted; + } + } + if (_isValidStablecoin(stablecoinToken)) { + return (amountIn * 9950) / 10000; // 0.5% slippage estimate for WETH->stable + } + return 0; + } + + /** + * @notice Get Dodoex quote (view) + */ + function _getDodoexQuote( + address stablecoinToken, + uint256 amountIn + ) external view returns (uint256) { + return IDodoexRouter(dodoexRouter).getDodoSwapQuote(weth, stablecoinToken, amountIn); + } + + /** + * @notice Get Balancer quote (view) + * When poolId configured, would query Balancer. Otherwise estimate for stablecoins. + */ + function _getBalancerQuote( + address stablecoinToken, + uint256 amountIn + ) external view returns (uint256) { + bytes32 poolId = balancerPoolIds[weth][stablecoinToken]; + if (poolId != bytes32(0)) { + (address[] memory tokens, uint256[] memory balances,) = + IBalancerVault(balancerVault).getPoolTokens(poolId); + if (tokens.length >= 2 && balances.length >= 2) { + uint256 wethIdx = type(uint256).max; + uint256 stableIdx = type(uint256).max; + for (uint256 i = 0; i < tokens.length; i++) { + if (tokens[i] == weth) wethIdx = i; + if (tokens[i] == stablecoinToken) stableIdx = i; + } + if (wethIdx != type(uint256).max && stableIdx != type(uint256).max && balances[wethIdx] > 0) { + uint256 amountOut = (amountIn * balances[stableIdx]) / balances[wethIdx]; + return (amountOut * 9950) / 10000; // 0.5% slippage + } + } + } + if (_isValidStablecoin(stablecoinToken)) { + return (amountIn * 9950) / 10000; // 0.5% slippage estimate when pool not configured + } + return 0; + } + + /** + * @notice Initialize default routing configurations + */ + function _initializeDefaultRouting() internal { + // Small swaps (< $10k): Uniswap V3, Dodoex + SwapProvider[] memory smallProviders = new SwapProvider[](2); + smallProviders[0] = SwapProvider.UniswapV3; + smallProviders[1] = SwapProvider.Dodoex; + sizeBasedRouting[0] = RoutingConfig({ + providers: smallProviders, + sizeThresholds: new uint256[](0), + enabled: true + }); + + // Medium swaps ($10k-$100k): Dodoex, Balancer, Uniswap V3 + SwapProvider[] memory mediumProviders = new SwapProvider[](3); + mediumProviders[0] = SwapProvider.Dodoex; + mediumProviders[1] = SwapProvider.Balancer; + mediumProviders[2] = SwapProvider.UniswapV3; + sizeBasedRouting[1] = RoutingConfig({ + providers: mediumProviders, + sizeThresholds: new uint256[](0), + enabled: true + }); + + // Large swaps (> $100k): Dodoex, Curve, Balancer + SwapProvider[] memory largeProviders = new SwapProvider[](3); + largeProviders[0] = SwapProvider.Dodoex; + largeProviders[1] = SwapProvider.Curve; + largeProviders[2] = SwapProvider.Balancer; + sizeBasedRouting[2] = RoutingConfig({ + providers: largeProviders, + sizeThresholds: new uint256[](0), + enabled: true + }); + } + + /** + * @notice Check if token is valid stablecoin + */ + function _isValidStablecoin(address token) internal view returns (bool) { + return token == usdt || token == usdc || token == dai; + } + + // Allow contract to receive ETH + receive() external payable {} +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/InboxETH.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/InboxETH.sol new file mode 100644 index 0000000..6772621 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/InboxETH.sol @@ -0,0 +1,426 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./BondManager.sol"; +import "./ChallengeManager.sol"; +import "./LiquidityPoolETH.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title InboxETH + * @notice Receives and processes claims from relayers for trustless bridge deposits + * @dev Permissionless claim submission requiring bonds and challenge mechanism + */ +contract InboxETH is ReentrancyGuard { + BondManager public immutable bondManager; + ChallengeManager public immutable challengeManager; + LiquidityPoolETH public immutable liquidityPool; + + // Rate limiting + uint256 public constant MIN_DEPOSIT = 0.001 ether; // Minimum deposit to prevent dust + uint256 public constant COOLDOWN_PERIOD = 60 seconds; // Cooldown between claims per relayer + mapping(address => uint256) public lastClaimTime; // relayer => last claim timestamp + mapping(address => uint256) public claimsPerHour; // relayer => claims in current hour + mapping(address => uint256) public hourStart; // relayer => current hour start timestamp + uint256 public constant MAX_CLAIMS_PER_HOUR = 100; // Max claims per hour per relayer + + // Relayer fees (optional, can be enabled via governance) + uint256 public relayerFeeBps = 0; // Basis points (0 = disabled, 100 = 1%) + mapping(uint256 => RelayerFee) public relayerFees; // depositId => RelayerFee + + struct RelayerFee { + address relayer; + uint256 amount; + bool claimed; + } + + struct ClaimData { + uint256 depositId; + address asset; + uint256 amount; + address recipient; + address relayer; + uint256 timestamp; + bool exists; + } + + mapping(uint256 => ClaimData) public claims; // depositId => ClaimData + + event RelayerFeeSet(uint256 newFeeBps); + event RelayerFeeClaimed(uint256 indexed depositId, address indexed relayer, uint256 amount); + + event ClaimSubmitted( + uint256 indexed depositId, + address indexed relayer, + address asset, + uint256 amount, + address indexed recipient, + uint256 bondAmount, + uint256 challengeWindowEnd + ); + + error ZeroDepositId(); + error ZeroAsset(); + error ZeroAmount(); + error ZeroRecipient(); + error ClaimAlreadyExists(); + error InsufficientBond(); + error DepositTooSmall(); + error CooldownActive(); + error RateLimitExceeded(); + error RelayerFeeNotEnabled(); + + /** + * @notice Constructor + * @param _bondManager Address of BondManager contract + * @param _challengeManager Address of ChallengeManager contract + * @param _liquidityPool Address of LiquidityPoolETH contract + */ + constructor( + address _bondManager, + address _challengeManager, + address _liquidityPool + ) { + require(_bondManager != address(0), "InboxETH: zero bond manager"); + require(_challengeManager != address(0), "InboxETH: zero challenge manager"); + require(_liquidityPool != address(0), "InboxETH: zero liquidity pool"); + + bondManager = BondManager(payable(_bondManager)); + challengeManager = ChallengeManager(payable(_challengeManager)); + liquidityPool = LiquidityPoolETH(payable(_liquidityPool)); + } + + /** + * @notice Submit a claim for a deposit from source chain + * @param depositId Deposit ID from source chain (ChainID 138) + * @param asset Asset address (address(0) for native ETH) + * @param amount Deposit amount + * @param recipient Recipient address on Ethereum + * @param proof Optional proof data (not used in optimistic model, but reserved for future light client) + * @return bondAmount Amount of bond posted + */ + function submitClaim( + uint256 depositId, + address asset, + uint256 amount, + address recipient, + bytes calldata proof + ) external payable nonReentrant returns (uint256 bondAmount) { + if (depositId == 0) revert ZeroDepositId(); + if (asset == address(0) && amount == 0) revert ZeroAmount(); + if (recipient == address(0)) revert ZeroRecipient(); + + // Rate limiting checks + if (amount < MIN_DEPOSIT) revert DepositTooSmall(); + + // Cooldown check + if (block.timestamp < lastClaimTime[msg.sender] + COOLDOWN_PERIOD) { + revert CooldownActive(); + } + + // Hourly rate limit check + uint256 currentHour = block.timestamp / 3600; + if (hourStart[msg.sender] != currentHour) { + hourStart[msg.sender] = currentHour; + claimsPerHour[msg.sender] = 0; + } + if (claimsPerHour[msg.sender] >= MAX_CLAIMS_PER_HOUR) { + revert RateLimitExceeded(); + } + + // Check if claim already exists + if (claims[depositId].exists) revert ClaimAlreadyExists(); + + // Calculate required bond + uint256 requiredBond = bondManager.getRequiredBond(amount); + + // Calculate relayer fee if enabled + uint256 relayerFee = 0; + uint256 bridgeAmount = amount; + if (relayerFeeBps > 0) { + relayerFee = (amount * relayerFeeBps) / 10000; + bridgeAmount = amount - relayerFee; + + // Store relayer fee + relayerFees[depositId] = RelayerFee({ + relayer: msg.sender, + amount: relayerFee, + claimed: false + }); + } + + if (msg.value < requiredBond) revert InsufficientBond(); + + // Post bond (pass relayer address explicitly) + bondAmount = bondManager.postBond{value: requiredBond}(depositId, bridgeAmount, msg.sender); + + // Update rate limiting + lastClaimTime[msg.sender] = block.timestamp; + claimsPerHour[msg.sender]++; + + // Register claim with ChallengeManager (use bridgeAmount after fee) + challengeManager.registerClaim(depositId, asset, bridgeAmount, recipient); + + // Determine asset type for liquidity pool + LiquidityPoolETH.AssetType assetType = asset == address(0) + ? LiquidityPoolETH.AssetType.ETH + : LiquidityPoolETH.AssetType.WETH; + + // Add pending claim to liquidity pool (use bridgeAmount after fee deduction) + liquidityPool.addPendingClaim(bridgeAmount, assetType); + + // Store claim data (use bridgeAmount for amount) + claims[depositId] = ClaimData({ + depositId: depositId, + asset: asset, + amount: bridgeAmount, // Store bridge amount (after fee) + recipient: recipient, + relayer: msg.sender, + timestamp: block.timestamp, + exists: true + }); + + // Get challenge window end time + (uint256 challengeWindowEnd, ) = _getChallengeWindowEnd(depositId); + + emit ClaimSubmitted( + depositId, + msg.sender, + asset, + bridgeAmount, // Emit bridge amount (after fee) + recipient, + bondAmount, + challengeWindowEnd + ); + + return bondAmount; + } + + /** + * @notice Submit multiple claims in batch (gas optimization) + * @param depositIds Array of deposit IDs + * @param assets Array of asset addresses + * @param amounts Array of deposit amounts + * @param recipients Array of recipient addresses + * @param proofs Array of proof data + * @return totalBondAmount Total bond amount posted + */ + function submitClaimsBatch( + uint256[] calldata depositIds, + address[] calldata assets, + uint256[] calldata amounts, + address[] calldata recipients, + bytes[] calldata proofs + ) external payable nonReentrant returns (uint256 totalBondAmount) { + uint256 length = depositIds.length; + require(length > 0, "InboxETH: empty array"); + require(length <= 20, "InboxETH: batch too large"); // Prevent gas limit issues + require(length == assets.length && length == amounts.length && + length == recipients.length && length == proofs.length, + "InboxETH: length mismatch"); + + // Calculate total required bond + uint256 totalRequiredBond = 0; + for (uint256 i = 0; i < length; i++) { + if (depositIds[i] == 0) revert ZeroDepositId(); + if (assets[i] == address(0) && amounts[i] == 0) revert ZeroAmount(); + if (recipients[i] == address(0)) revert ZeroRecipient(); + if (claims[depositIds[i]].exists) revert ClaimAlreadyExists(); + + totalRequiredBond += bondManager.getRequiredBond(amounts[i]); + } + + if (msg.value < totalRequiredBond) revert InsufficientBond(); + + // Process each claim + for (uint256 i = 0; i < length; i++) { + // Rate limiting checks (simplified for batch - check first item) + if (i == 0) { + if (amounts[i] < MIN_DEPOSIT) revert DepositTooSmall(); + if (block.timestamp < lastClaimTime[msg.sender] + COOLDOWN_PERIOD) { + revert CooldownActive(); + } + uint256 currentHour = block.timestamp / 3600; + if (hourStart[msg.sender] != currentHour) { + hourStart[msg.sender] = currentHour; + claimsPerHour[msg.sender] = 0; + } + } + if (claimsPerHour[msg.sender] + i >= MAX_CLAIMS_PER_HOUR) { + revert RateLimitExceeded(); + } + + // Calculate relayer fee if enabled + uint256 relayerFee = 0; + uint256 bridgeAmount = amounts[i]; + if (relayerFeeBps > 0) { + relayerFee = (amounts[i] * relayerFeeBps) / 10000; + bridgeAmount = amounts[i] - relayerFee; + relayerFees[depositIds[i]] = RelayerFee({ + relayer: msg.sender, + amount: relayerFee, + claimed: false + }); + } + + uint256 requiredBond = bondManager.getRequiredBond(bridgeAmount); + + // Post bond + uint256 bondAmount = bondManager.postBond{value: requiredBond}( + depositIds[i], + bridgeAmount, + msg.sender + ); + totalBondAmount += bondAmount; + + // Register claim (use bridgeAmount) + challengeManager.registerClaim(depositIds[i], assets[i], bridgeAmount, recipients[i]); + + // Determine asset type + LiquidityPoolETH.AssetType assetType = assets[i] == address(0) + ? LiquidityPoolETH.AssetType.ETH + : LiquidityPoolETH.AssetType.WETH; + + // Add pending claim (use bridgeAmount) + liquidityPool.addPendingClaim(bridgeAmount, assetType); + + // Store claim data (use bridgeAmount) + claims[depositIds[i]] = ClaimData({ + depositId: depositIds[i], + asset: assets[i], + amount: bridgeAmount, + recipient: recipients[i], + relayer: msg.sender, + timestamp: block.timestamp, + exists: true + }); + + // Get challenge window end time + (uint256 challengeWindowEnd, ) = _getChallengeWindowEnd(depositIds[i]); + + emit ClaimSubmitted( + depositIds[i], + msg.sender, + assets[i], + bridgeAmount, + recipients[i], + bondAmount, + challengeWindowEnd + ); + } + + // Update rate limiting + lastClaimTime[msg.sender] = block.timestamp; + claimsPerHour[msg.sender] += length; + + // Refund excess bond if any + if (msg.value > totalBondAmount) { + (bool success, ) = payable(msg.sender).call{value: msg.value - totalBondAmount}(""); + require(success, "InboxETH: refund failed"); + } + + return totalBondAmount; + } + + /** + * @notice Get claim status + * @param depositId Deposit ID + * @return exists True if claim exists + * @return finalized True if claim is finalized + * @return challenged True if claim was challenged + * @return challengeWindowEnd Timestamp when challenge window ends + */ + function getClaimStatus( + uint256 depositId + ) external view returns ( + bool exists, + bool finalized, + bool challenged, + uint256 challengeWindowEnd + ) { + if (!claims[depositId].exists) { + return (false, false, false, 0); + } + + ChallengeManager.Claim memory claim = challengeManager.getClaim(depositId); + (challengeWindowEnd, ) = _getChallengeWindowEnd(depositId); + + return ( + true, + claim.finalized, + claim.challenged, + challengeWindowEnd + ); + } + + /** + * @notice Get claim data + * @param depositId Deposit ID + * @return Claim data + */ + function getClaim(uint256 depositId) external view returns (ClaimData memory) { + return claims[depositId]; + } + + /** + * @notice Internal function to get challenge window end time + * @param depositId Deposit ID + * @return challengeWindowEnd Timestamp + * @return exists True if claim exists + */ + function _getChallengeWindowEnd( + uint256 depositId + ) internal view returns (uint256 challengeWindowEnd, bool exists) { + ChallengeManager.Claim memory claim = challengeManager.getClaim(depositId); + if (claim.depositId == 0) { + return (0, false); + } + return (claim.challengeWindowEnd, true); + } + + /** + * @notice Set relayer fee (only callable by owner/multisig in future upgrade) + * @param _relayerFeeBps New relayer fee in basis points (0 = disabled) + */ + function setRelayerFee(uint256 _relayerFeeBps) external { + // Note: In production, add access control (owner/multisig) + // For now, this is a placeholder for future governance + require(_relayerFeeBps <= 1000, "InboxETH: fee too high"); // Max 10% + relayerFeeBps = _relayerFeeBps; + emit RelayerFeeSet(_relayerFeeBps); + } + + /** + * @notice Claim relayer fee for a finalized deposit + * @param depositId Deposit ID to claim fee for + */ + function claimRelayerFee(uint256 depositId) external nonReentrant { + if (relayerFeeBps == 0) revert RelayerFeeNotEnabled(); + + RelayerFee storage fee = relayerFees[depositId]; + if (fee.relayer == address(0)) revert("InboxETH: no fee for deposit"); + if (fee.claimed) revert("InboxETH: fee already claimed"); + if (fee.relayer != msg.sender) revert("InboxETH: not fee recipient"); + + // Verify claim is finalized + ChallengeManager.Claim memory claim = challengeManager.getClaim(depositId); + if (!claim.finalized) revert("InboxETH: claim not finalized"); + + fee.claimed = true; + + // Transfer fee to relayer + (bool success, ) = payable(msg.sender).call{value: fee.amount}(""); + require(success, "InboxETH: fee transfer failed"); + + emit RelayerFeeClaimed(depositId, msg.sender, fee.amount); + } + + /** + * @notice Get relayer fee for a deposit + * @param depositId Deposit ID + * @return fee Relayer fee information + */ + function getRelayerFee(uint256 depositId) external view returns (RelayerFee memory) { + return relayerFees[depositId]; + } +} \ No newline at end of file diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/LiquidityPoolETH.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/LiquidityPoolETH.sol new file mode 100644 index 0000000..ae361b4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/LiquidityPoolETH.sol @@ -0,0 +1,296 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title LiquidityPoolETH + * @notice Liquidity pool for ETH and WETH with fee model and minimum liquidity ratio enforcement + * @dev Supports separate pools for native ETH and WETH (ERC-20) + */ +contract LiquidityPoolETH is ReentrancyGuard { + using SafeERC20 for IERC20; + + enum AssetType { + ETH, // Native ETH + WETH // Wrapped ETH (ERC-20) + } + + // Pool configuration + uint256 public immutable lpFeeBps; // Liquidity provider fee in basis points (default: 5 = 0.05%) + uint256 public immutable minLiquidityRatioBps; // Minimum liquidity ratio in basis points (default: 11000 = 110%) + address public immutable weth; // WETH token address + + // WETH getter for external access + function getWeth() external view returns (address) { + return weth; + } + + // Pool state + struct PoolState { + uint256 totalLiquidity; + uint256 pendingClaims; // Total amount of pending claims to be released + mapping(address => uint256) lpShares; // LP address => amount provided + } + + mapping(AssetType => PoolState) public pools; + mapping(address => bool) public authorizedRelease; // Contracts authorized to release funds + + event LiquidityProvided( + AssetType indexed assetType, + address indexed provider, + uint256 amount + ); + + event LiquidityWithdrawn( + AssetType indexed assetType, + address indexed provider, + uint256 amount + ); + + event FundsReleased( + AssetType indexed assetType, + uint256 indexed depositId, + address indexed recipient, + uint256 amount, + uint256 feeAmount + ); + + event PendingClaimAdded( + AssetType indexed assetType, + uint256 amount + ); + + event PendingClaimRemoved( + AssetType indexed assetType, + uint256 amount + ); + + error ZeroAmount(); + error ZeroAddress(); + error InsufficientLiquidity(); + error WithdrawalBlockedByLiquidityRatio(); + error UnauthorizedRelease(); + error InvalidAssetType(); + + /** + * @notice Constructor + * @param _weth WETH token address + * @param _lpFeeBps LP fee in basis points (5 = 0.05%) + * @param _minLiquidityRatioBps Minimum liquidity ratio in basis points (11000 = 110%) + */ + constructor( + address _weth, + uint256 _lpFeeBps, + uint256 _minLiquidityRatioBps + ) { + require(_weth != address(0), "LiquidityPoolETH: zero WETH address"); + require(_lpFeeBps <= 10000, "LiquidityPoolETH: fee exceeds 100%"); + require(_minLiquidityRatioBps >= 10000, "LiquidityPoolETH: min ratio must be >= 100%"); + + weth = _weth; + lpFeeBps = _lpFeeBps; + minLiquidityRatioBps = _minLiquidityRatioBps; + } + + /** + * @notice Authorize a contract to release funds (called during deployment) + * @param releaser Address authorized to release funds + */ + function authorizeRelease(address releaser) external { + require(releaser != address(0), "LiquidityPoolETH: zero address"); + authorizedRelease[releaser] = true; + } + + /** + * @notice Provide liquidity to the pool + * @param assetType Type of asset (ETH or WETH) + */ + function provideLiquidity(AssetType assetType) external payable nonReentrant { + uint256 amount; + + if (assetType == AssetType.ETH) { + if (msg.value == 0) revert ZeroAmount(); + amount = msg.value; + } else if (assetType == AssetType.WETH) { + if (msg.value != 0) revert("LiquidityPoolETH: WETH deposits must use depositWETH()"); + revert("LiquidityPoolETH: use depositWETH() for WETH deposits"); + } else { + revert InvalidAssetType(); + } + + pools[assetType].totalLiquidity += amount; + pools[assetType].lpShares[msg.sender] += amount; + + emit LiquidityProvided(assetType, msg.sender, amount); + } + + /** + * @notice Provide WETH liquidity to the pool + * @param amount Amount of WETH to deposit + */ + function depositWETH(uint256 amount) external nonReentrant { + if (amount == 0) revert ZeroAmount(); + + IERC20(weth).safeTransferFrom(msg.sender, address(this), amount); + + pools[AssetType.WETH].totalLiquidity += amount; + pools[AssetType.WETH].lpShares[msg.sender] += amount; + + emit LiquidityProvided(AssetType.WETH, msg.sender, amount); + } + + /** + * @notice Withdraw liquidity from the pool + * @param amount Amount to withdraw + * @param assetType Type of asset (ETH or WETH) + */ + function withdrawLiquidity( + uint256 amount, + AssetType assetType + ) external nonReentrant { + if (amount == 0) revert ZeroAmount(); + if (pools[assetType].lpShares[msg.sender] < amount) revert InsufficientLiquidity(); + + // Check minimum liquidity ratio + uint256 availableLiquidity = pools[assetType].totalLiquidity - pools[assetType].pendingClaims; + uint256 newAvailableLiquidity = availableLiquidity - amount; + uint256 minRequired = (pools[assetType].pendingClaims * minLiquidityRatioBps) / 10000; + + if (newAvailableLiquidity < minRequired) { + revert WithdrawalBlockedByLiquidityRatio(); + } + + pools[assetType].totalLiquidity -= amount; + pools[assetType].lpShares[msg.sender] -= amount; + + if (assetType == AssetType.ETH) { + (bool success, ) = payable(msg.sender).call{value: amount}(""); + require(success, "LiquidityPoolETH: ETH transfer failed"); + } else { + IERC20(weth).safeTransfer(msg.sender, amount); + } + + emit LiquidityWithdrawn(assetType, msg.sender, amount); + } + + /** + * @notice Release funds to recipient (only authorized contracts) + * @param depositId Deposit ID (for event tracking) + * @param recipient Recipient address + * @param amount Amount to release (before fees) + * @param assetType Type of asset (ETH or WETH) + */ + function releaseToRecipient( + uint256 depositId, + address recipient, + uint256 amount, + AssetType assetType + ) external nonReentrant { + if (!authorizedRelease[msg.sender]) revert UnauthorizedRelease(); + if (amount == 0) revert ZeroAmount(); + if (recipient == address(0)) revert ZeroAddress(); + + // Calculate fee + uint256 feeAmount = (amount * lpFeeBps) / 10000; + uint256 releaseAmount = amount - feeAmount; + + // Check available liquidity + PoolState storage pool = pools[assetType]; + uint256 availableLiquidity = pool.totalLiquidity - pool.pendingClaims; + + if (availableLiquidity < releaseAmount) { + revert InsufficientLiquidity(); + } + + // Reduce pending claims + pool.pendingClaims -= amount; + + // Release funds to recipient + if (assetType == AssetType.ETH) { + (bool success, ) = payable(recipient).call{value: releaseAmount}(""); + require(success, "LiquidityPoolETH: ETH transfer failed"); + } else { + IERC20(weth).safeTransfer(recipient, releaseAmount); + } + + // Fee remains in pool (increases totalLiquidity effectively by reducing pendingClaims) + + emit FundsReleased(assetType, depositId, recipient, releaseAmount, feeAmount); + } + + /** + * @notice Add pending claim (called when claim is submitted) + * @param amount Amount of pending claim + * @param assetType Type of asset + */ + function addPendingClaim(uint256 amount, AssetType assetType) external { + if (!authorizedRelease[msg.sender]) revert UnauthorizedRelease(); + pools[assetType].pendingClaims += amount; + emit PendingClaimAdded(assetType, amount); + } + + /** + * @notice Remove pending claim (called when claim is challenged/slashed) + * @param amount Amount of pending claim to remove + * @param assetType Type of asset + */ + function removePendingClaim(uint256 amount, AssetType assetType) external { + if (!authorizedRelease[msg.sender]) revert UnauthorizedRelease(); + pools[assetType].pendingClaims -= amount; + emit PendingClaimRemoved(assetType, amount); + } + + /** + * @notice Get available liquidity for an asset type + * @param assetType Type of asset + * @return Available liquidity (total - pending claims) + */ + function getAvailableLiquidity(AssetType assetType) external view returns (uint256) { + PoolState storage pool = pools[assetType]; + uint256 pending = pool.pendingClaims; + if (pool.totalLiquidity <= pending) { + return 0; + } + return pool.totalLiquidity - pending; + } + + /** + * @notice Get LP share for a provider + * @param provider LP provider address + * @param assetType Type of asset + * @return LP share amount + */ + function getLpShare(address provider, AssetType assetType) external view returns (uint256) { + return pools[assetType].lpShares[provider]; + } + + /** + * @notice Get pool statistics + * @param assetType Type of asset + * @return totalLiquidity Total liquidity in pool + * @return pendingClaims Total pending claims + * @return availableLiquidity Available liquidity (total - pending) + */ + function getPoolStats( + AssetType assetType + ) external view returns ( + uint256 totalLiquidity, + uint256 pendingClaims, + uint256 availableLiquidity + ) { + PoolState storage pool = pools[assetType]; + totalLiquidity = pool.totalLiquidity; + pendingClaims = pool.pendingClaims; + if (totalLiquidity > pendingClaims) { + availableLiquidity = totalLiquidity - pendingClaims; + } else { + availableLiquidity = 0; + } + } + + // Allow contract to receive ETH + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/Lockbox138.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/Lockbox138.sol new file mode 100644 index 0000000..40da5de --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/Lockbox138.sol @@ -0,0 +1,170 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title Lockbox138 + * @notice Asset lock contract on ChainID 138 (Besu) for trustless bridge deposits + * @dev Supports both native ETH and ERC-20 tokens. Immutable after deployment (no admin functions). + */ +contract Lockbox138 is ReentrancyGuard { + using SafeERC20 for IERC20; + + // Replay protection: track nonces per user + mapping(address => uint256) public nonces; + + // Track processed deposit IDs to prevent double deposits + mapping(uint256 => bool) public processedDeposits; + + event Deposit( + uint256 indexed depositId, + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 nonce, + address depositor, + uint256 timestamp + ); + + error ZeroAmount(); + error ZeroRecipient(); + error ZeroAsset(); + error DepositAlreadyProcessed(); + error TransferFailed(); + + /** + * @notice Lock native ETH for cross-chain transfer + * @param recipient Address on destination chain (Ethereum) to receive funds + * @param nonce Unique nonce for this deposit (prevents replay attacks) + * @return depositId Unique identifier for this deposit + */ + function depositNative( + address recipient, + bytes32 nonce + ) external payable nonReentrant returns (uint256 depositId) { + if (msg.value == 0) revert ZeroAmount(); + if (recipient == address(0)) revert ZeroRecipient(); + + // Increment user nonce + nonces[msg.sender]++; + + // Generate unique deposit ID + depositId = _generateDepositId( + address(0), // Native ETH is represented as address(0) + msg.value, + recipient, + nonce + ); + + // Replay protection: ensure deposit ID hasn't been used + if (processedDeposits[depositId]) revert DepositAlreadyProcessed(); + processedDeposits[depositId] = true; + + emit Deposit( + depositId, + address(0), // address(0) represents native ETH + msg.value, + recipient, + nonce, + msg.sender, + block.timestamp + ); + + return depositId; + } + + /** + * @notice Lock ERC-20 tokens (e.g., WETH) for cross-chain transfer + * @param token ERC-20 token address to lock + * @param amount Amount of tokens to lock + * @param recipient Address on destination chain (Ethereum) to receive funds + * @param nonce Unique nonce for this deposit (prevents replay attacks) + * @return depositId Unique identifier for this deposit + */ + function depositERC20( + address token, + uint256 amount, + address recipient, + bytes32 nonce + ) external nonReentrant returns (uint256 depositId) { + if (token == address(0)) revert ZeroAsset(); + if (amount == 0) revert ZeroAmount(); + if (recipient == address(0)) revert ZeroRecipient(); + + // Increment user nonce + nonces[msg.sender]++; + + // Generate unique deposit ID + depositId = _generateDepositId(token, amount, recipient, nonce); + + // Replay protection: ensure deposit ID hasn't been used + if (processedDeposits[depositId]) revert DepositAlreadyProcessed(); + processedDeposits[depositId] = true; + + // Transfer tokens from user to this contract + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + + emit Deposit( + depositId, + token, + amount, + recipient, + nonce, + msg.sender, + block.timestamp + ); + + return depositId; + } + + /** + * @notice Get current nonce for a user + * @param user Address to check nonce for + * @return Current nonce value + */ + function getNonce(address user) external view returns (uint256) { + return nonces[user]; + } + + /** + * @notice Check if a deposit ID has been processed + * @param depositId Deposit ID to check + * @return True if deposit has been processed + */ + function isDepositProcessed(uint256 depositId) external view returns (bool) { + return processedDeposits[depositId]; + } + + /** + * @notice Generate a unique deposit ID from deposit parameters + * @dev Uses keccak256 hash of all deposit parameters + sender + timestamp to ensure uniqueness + * @param asset Asset address (address(0) for native ETH) + * @param amount Deposit amount + * @param recipient Recipient address on destination chain + * @param nonce User-provided nonce + * @return depositId Unique deposit identifier + */ + function _generateDepositId( + address asset, + uint256 amount, + address recipient, + bytes32 nonce + ) internal view returns (uint256) { + return uint256( + keccak256( + abi.encodePacked( + asset, + amount, + recipient, + nonce, + msg.sender, + block.timestamp, + block.number + ) + ) + ); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/SwapBridgeSwapCoordinator.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/SwapBridgeSwapCoordinator.sol new file mode 100644 index 0000000..30238a0 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/SwapBridgeSwapCoordinator.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../UniversalCCIPBridge.sol"; +import "./EnhancedSwapRouter.sol"; + +/** + * @title SwapBridgeSwapCoordinator + * @notice Coordinates source-chain swap (token A -> bridgeable token) then CCIP bridge in one flow + * @dev User approves coordinator for sourceToken; coordinator swaps via EnhancedSwapRouter (Dodoex) then calls UniversalCCIPBridge + */ +contract SwapBridgeSwapCoordinator is ReentrancyGuard { + using SafeERC20 for IERC20; + + EnhancedSwapRouter public immutable swapRouter; + UniversalCCIPBridge public immutable bridge; + + event SwapAndBridgeExecuted( + address indexed sourceToken, + address indexed bridgeableToken, + uint256 amountIn, + uint256 amountBridged, + uint64 destinationChain, + address indexed recipient, + bytes32 messageId + ); + + error ZeroAddress(); + error ZeroAmount(); + error InsufficientOutput(); + error SameToken(); + + constructor(address _swapRouter, address _bridge) { + if (_swapRouter == address(0) || _bridge == address(0)) revert ZeroAddress(); + swapRouter = EnhancedSwapRouter(payable(_swapRouter)); + bridge = UniversalCCIPBridge(payable(_bridge)); + } + + /** + * @notice Swap source token to bridgeable token then bridge to destination chain + * @param sourceToken Token user is sending (will be swapped if different from bridgeableToken) + * @param amountIn Amount of source token + * @param amountOutMin Minimum bridgeable token from swap (slippage protection; ignored if sourceToken == bridgeableToken) + * @param bridgeableToken Token to bridge (WETH or stablecoin); must be registered on bridge + * @param destinationChainSelector CCIP destination chain selector + * @param recipient Recipient on destination chain + * @param assetType Asset type hash for bridge (from UniversalAssetRegistry) + * @param usePMM Whether bridge should use PMM liquidity + * @param useVault Whether bridge should use vault + */ + function swapAndBridge( + address sourceToken, + uint256 amountIn, + uint256 amountOutMin, + address bridgeableToken, + uint64 destinationChainSelector, + address recipient, + bytes32 assetType, + bool usePMM, + bool useVault + ) external payable nonReentrant returns (bytes32 messageId) { + if (amountIn == 0) revert ZeroAmount(); + if (sourceToken == address(0) || bridgeableToken == address(0) || recipient == address(0)) revert ZeroAddress(); + + uint256 amountToBridge; + + if (sourceToken == bridgeableToken) { + IERC20(sourceToken).safeTransferFrom(msg.sender, address(this), amountIn); + amountToBridge = amountIn; + } else { + IERC20(sourceToken).safeTransferFrom(msg.sender, address(this), amountIn); + IERC20(sourceToken).approve(address(swapRouter), amountIn); + amountToBridge = swapRouter.swapTokenToToken(sourceToken, bridgeableToken, amountIn, amountOutMin); + if (amountToBridge < amountOutMin) revert InsufficientOutput(); + } + + UniversalCCIPBridge.BridgeOperation memory op = UniversalCCIPBridge.BridgeOperation({ + token: bridgeableToken, + amount: amountToBridge, + destinationChain: destinationChainSelector, + recipient: recipient, + assetType: assetType, + usePMM: usePMM, + useVault: useVault, + complianceProof: "", + vaultInstructions: "" + }); + + IERC20(bridgeableToken).approve(address(bridge), amountToBridge); + (bool ok, bytes memory result) = address(bridge).call{value: msg.value}( + abi.encodeWithSelector(bridge.bridge.selector, op) + ); + require(ok, "SwapBridgeSwapCoordinator: bridge failed"); + messageId = abi.decode(result, (bytes32)); + + emit SwapAndBridgeExecuted( + sourceToken, + bridgeableToken, + amountIn, + amountToBridge, + destinationChainSelector, + recipient, + messageId + ); + return messageId; + } + + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/SwapRouter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/SwapRouter.sol new file mode 100644 index 0000000..d1f91ca --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/SwapRouter.sol @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./LiquidityPoolETH.sol"; +import "./interfaces/ISwapRouter.sol"; +import "./interfaces/IWETH.sol"; +import "./interfaces/ICurvePool.sol"; +import "./interfaces/IAggregationRouter.sol"; + +/** + * @title SwapRouter + * @notice Swaps ETH/WETH to stablecoins via Uniswap V3, Curve, or 1inch + * @dev Primary: Uniswap V3, Secondary: Curve, Optional: 1inch aggregation + */ +contract SwapRouter is ReentrancyGuard { + using SafeERC20 for IERC20; + + enum SwapProvider { + UniswapV3, + Curve, + OneInch + } + + // Contract addresses (Ethereum Mainnet) + address public immutable uniswapV3Router; // 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 + address public immutable curve3Pool; // 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7 + address public immutable oneInchRouter; // 0x1111111254EEB25477B68fb85Ed929f73A960582 (optional) + + // Token addresses (Ethereum Mainnet) + address public immutable weth; // 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + address public immutable usdt; // 0xdAC17F958D2ee523a2206206994597C13D831ec7 + address public immutable usdc; // 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + address public immutable dai; // 0x6B175474E89094C44Da98b954EedeAC495271d0F + + // Uniswap V3 fee tiers (0.05% = 500, 0.3% = 3000, 1% = 10000) + uint24 public constant FEE_TIER_LOW = 500; // 0.05% + uint24 public constant FEE_TIER_MEDIUM = 3000; // 0.3% + uint24 public constant FEE_TIER_HIGH = 10000; // 1% + + event SwapExecuted( + SwapProvider provider, + LiquidityPoolETH.AssetType inputAsset, + address inputToken, + address outputToken, + uint256 amountIn, + uint256 amountOut + ); + + error ZeroAmount(); + error ZeroAddress(); + error InsufficientOutput(); + error InvalidAssetType(); + error SwapFailed(); + + /** + * @notice Constructor + * @param _uniswapV3Router Uniswap V3 SwapRouter address + * @param _curve3Pool Curve 3pool address + * @param _oneInchRouter 1inch Router address (can be address(0) if not used) + * @param _weth WETH address + * @param _usdt USDT address + * @param _usdc USDC address + * @param _dai DAI address + */ + constructor( + address _uniswapV3Router, + address _curve3Pool, + address _oneInchRouter, + address _weth, + address _usdt, + address _usdc, + address _dai + ) { + require(_uniswapV3Router != address(0), "SwapRouter: zero Uniswap router"); + require(_curve3Pool != address(0), "SwapRouter: zero Curve pool"); + require(_weth != address(0), "SwapRouter: zero WETH"); + require(_usdt != address(0), "SwapRouter: zero USDT"); + require(_usdc != address(0), "SwapRouter: zero USDC"); + require(_dai != address(0), "SwapRouter: zero DAI"); + + uniswapV3Router = _uniswapV3Router; + curve3Pool = _curve3Pool; + oneInchRouter = _oneInchRouter; + weth = _weth; + usdt = _usdt; + usdc = _usdc; + dai = _dai; + } + + /** + * @notice Swap to stablecoin using best available route + * @param inputAsset Input asset type (ETH or WETH) + * @param stablecoinToken Target stablecoin address (USDT, USDC, or DAI) + * @param amountIn Input amount + * @param amountOutMin Minimum output amount (slippage protection) + * @param routeData Optional route data for specific provider + * @return amountOut Output amount + */ + function swapToStablecoin( + LiquidityPoolETH.AssetType inputAsset, + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin, + bytes calldata routeData + ) external payable nonReentrant returns (uint256 amountOut) { + if (amountIn == 0) revert ZeroAmount(); + if (stablecoinToken == address(0)) revert ZeroAddress(); + if (!_isValidStablecoin(stablecoinToken)) revert("SwapRouter: invalid stablecoin"); + + // Convert ETH to WETH if needed + if (inputAsset == LiquidityPoolETH.AssetType.ETH) { + IWETH(weth).deposit{value: amountIn}(); + inputAsset = LiquidityPoolETH.AssetType.WETH; + } + + // Approve WETH for swap + IERC20 wethToken = IERC20(weth); + // Use forceApprove for OpenZeppelin 5.x (or approve directly) + wethToken.approve(uniswapV3Router, amountIn); + if (oneInchRouter != address(0)) { + wethToken.approve(oneInchRouter, amountIn); + } + + // Try Uniswap V3 first (primary) + uint256 outputAmount = _executeUniswapV3Swap(stablecoinToken, amountIn, amountOutMin); + if (outputAmount >= amountOutMin) { + // Transfer output to caller + IERC20(stablecoinToken).safeTransfer(msg.sender, outputAmount); + emit SwapExecuted(SwapProvider.UniswapV3, inputAsset, weth, stablecoinToken, amountIn, outputAmount); + return outputAmount; + } + + // Try Curve for stable/stable swaps (if USDT/USDC/DAI and routeData provided) + // Note: Curve 3pool doesn't support WETH directly, would need intermediate swap + // For now, revert if Uniswap fails + revert SwapFailed(); + } + + /** + * @notice Execute Uniswap V3 swap (internal) + * @param stablecoinToken Target stablecoin + * @param amountIn Input amount + * @param amountOutMin Minimum output + * @return amountOut Output amount + */ + function _executeUniswapV3Swap( + address stablecoinToken, + uint256 amountIn, + uint256 amountOutMin + ) internal returns (uint256 amountOut) { + ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ + tokenIn: weth, + tokenOut: stablecoinToken, + fee: FEE_TIER_MEDIUM, // 0.3% fee tier + recipient: address(this), + deadline: block.timestamp + 300, // 5 minutes + amountIn: amountIn, + amountOutMinimum: amountOutMin, + sqrtPriceLimitX96: 0 // No price limit + }); + + amountOut = ISwapRouter(uniswapV3Router).exactInputSingle(params); + return amountOut; + } + + /** + * @notice Check if token is a valid stablecoin + * @param token Token address to check + * @return True if valid stablecoin + */ + function _isValidStablecoin(address token) internal view returns (bool) { + return token == usdt || token == usdc || token == dai; + } + + // Allow contract to receive ETH + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/BridgeReserveCoordinator.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/BridgeReserveCoordinator.sol new file mode 100644 index 0000000..a4f1492 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/BridgeReserveCoordinator.sol @@ -0,0 +1,304 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "../BridgeSwapCoordinator.sol"; +import "../LiquidityPoolETH.sol"; +import "../../../reserve/IReserveSystem.sol"; +import "./IStablecoinPegManager.sol"; +import "./ICommodityPegManager.sol"; +import "./IISOCurrencyManager.sol"; + +/** + * @title BridgeReserveCoordinator + * @notice Orchestrates bridge operations with ReserveSystem, ensuring peg maintenance and asset backing + * @dev Connects trustless bridge to ReserveSystem for reserve verification and peg maintenance + */ +contract BridgeReserveCoordinator is Ownable, ReentrancyGuard { + using SafeERC20 for IERC20; + + BridgeSwapCoordinator public immutable bridgeSwapCoordinator; + IReserveSystem public immutable reserveSystem; + IStablecoinPegManager public immutable stablecoinPegManager; + ICommodityPegManager public immutable commodityPegManager; + IISOCurrencyManager public immutable isoCurrencyManager; + + // Reserve verification threshold (basis points: 10000 = 100%) + uint256 public reserveVerificationThresholdBps = 10000; // 100% - must have full backing + uint256 public constant MAX_RESERVE_THRESHOLD_BPS = 15000; // 150% max + + // Rebalancing parameters + uint256 public rebalancingCooldown = 1 hours; + mapping(address => uint256) public lastRebalancingTime; + + struct ReserveStatus { + address asset; + uint256 bridgeAmount; + uint256 reserveBalance; + uint256 reserveRatio; // reserveBalance / bridgeAmount * 10000 + bool isSufficient; + uint256 lastVerified; + } + + struct PegStatus { + address asset; + uint256 currentPrice; + uint256 targetPrice; + int256 deviationBps; // Can be negative + bool isMaintained; + } + + event ReserveVerified( + uint256 indexed depositId, + address indexed asset, + uint256 bridgeAmount, + uint256 reserveBalance, + bool isSufficient + ); + + event RebalancingTriggered( + address indexed asset, + uint256 amount, + address indexed recipient + ); + + event ReserveThresholdUpdated(uint256 oldThreshold, uint256 newThreshold); + + error ZeroAddress(); + error InsufficientReserve(); + error RebalancingCooldownActive(); + error InvalidReserveThreshold(); + error ReserveVerificationFailed(); + + /** + * @notice Constructor + * @param _bridgeSwapCoordinator BridgeSwapCoordinator contract address + * @param _reserveSystem ReserveSystem contract address + * @param _stablecoinPegManager StablecoinPegManager contract address + * @param _commodityPegManager CommodityPegManager contract address + * @param _isoCurrencyManager ISOCurrencyManager contract address + */ + constructor( + address _bridgeSwapCoordinator, + address _reserveSystem, + address _stablecoinPegManager, + address _commodityPegManager, + address _isoCurrencyManager + ) Ownable(msg.sender) { + if (_bridgeSwapCoordinator == address(0) || + _reserveSystem == address(0) || + _stablecoinPegManager == address(0) || + _commodityPegManager == address(0) || + _isoCurrencyManager == address(0)) { + revert ZeroAddress(); + } + + bridgeSwapCoordinator = BridgeSwapCoordinator(payable(_bridgeSwapCoordinator)); + reserveSystem = IReserveSystem(_reserveSystem); + stablecoinPegManager = IStablecoinPegManager(_stablecoinPegManager); + commodityPegManager = ICommodityPegManager(_commodityPegManager); + isoCurrencyManager = IISOCurrencyManager(_isoCurrencyManager); + } + + /** + * @notice Bridge transfer with automatic reserve verification + * @param depositId Deposit ID from bridge + * @param recipient Recipient address + * @param outputAsset Asset type (ETH or WETH) + * @param stablecoinToken Target stablecoin + * @param amountOutMin Minimum output amount + * @param routeData Optional route data for swap + * @return stablecoinAmount Amount of stablecoin received + */ + function bridgeWithReserveBacking( + uint256 depositId, + address recipient, + LiquidityPoolETH.AssetType outputAsset, + address stablecoinToken, + uint256 amountOutMin, + bytes calldata routeData + ) external nonReentrant returns (uint256 stablecoinAmount) { + // Get claim amount from bridge + // Note: We need to get the amount from ChallengeManager via BridgeSwapCoordinator + // For now, we'll verify reserves after the bridge operation + + // Execute bridge and swap + stablecoinAmount = bridgeSwapCoordinator.bridgeAndSwap( + depositId, + recipient, + outputAsset, + stablecoinToken, + amountOutMin, + routeData + ); + + // Verify reserve backing for the stablecoin + ReserveStatus memory status = verifyReserveStatus(stablecoinToken, stablecoinAmount); + + if (!status.isSufficient) { + // Trigger rebalancing if reserves insufficient + _triggerRebalancing(stablecoinToken, stablecoinAmount); + } + + emit ReserveVerified( + depositId, + stablecoinToken, + stablecoinAmount, + status.reserveBalance, + status.isSufficient + ); + + return stablecoinAmount; + } + + /** + * @notice Verify peg status for all assets + * @return pegStatuses Array of peg statuses + */ + function verifyPegStatus() external view returns (PegStatus[] memory pegStatuses) { + // Get stablecoin peg statuses + address[] memory stablecoins = stablecoinPegManager.getSupportedAssets(); + uint256 stablecoinCount = stablecoins.length; + + // Get commodity peg statuses + address[] memory commodities = commodityPegManager.getSupportedCommodities(); + uint256 commodityCount = commodities.length; + + uint256 totalCount = stablecoinCount + commodityCount; + pegStatuses = new PegStatus[](totalCount); + + uint256 index = 0; + + // Add stablecoin peg statuses + for (uint256 i = 0; i < stablecoinCount; i++) { + (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained) = + stablecoinPegManager.getPegStatus(stablecoins[i]); + + pegStatuses[index] = PegStatus({ + asset: stablecoins[i], + currentPrice: currentPrice, + targetPrice: targetPrice, + deviationBps: deviationBps, + isMaintained: isMaintained + }); + index++; + } + + // Add commodity peg statuses + for (uint256 i = 0; i < commodityCount; i++) { + (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained) = + commodityPegManager.getCommodityPegStatus(commodities[i]); + + pegStatuses[index] = PegStatus({ + asset: commodities[i], + currentPrice: currentPrice, + targetPrice: targetPrice, + deviationBps: deviationBps, + isMaintained: isMaintained + }); + index++; + } + } + + /** + * @notice Trigger rebalancing if peg deviates + * @param asset Asset address to rebalance + * @param amount Amount that needs backing + */ + function triggerRebalancing(address asset, uint256 amount) external onlyOwner nonReentrant { + if (block.timestamp < lastRebalancingTime[asset] + rebalancingCooldown) { + revert RebalancingCooldownActive(); + } + + _triggerRebalancing(asset, amount); + } + + /** + * @notice Get reserve status for an asset + * @param asset Asset address + * @param bridgeAmount Amount bridged/required + * @return status Reserve status + */ + function getReserveStatus( + address asset, + uint256 bridgeAmount + ) external view returns (ReserveStatus memory status) { + return verifyReserveStatus(asset, bridgeAmount); + } + + /** + * @notice Set reserve verification threshold + * @param newThreshold New threshold in basis points + */ + function setReserveThreshold(uint256 newThreshold) external onlyOwner { + if (newThreshold > MAX_RESERVE_THRESHOLD_BPS) { + revert InvalidReserveThreshold(); + } + + uint256 oldThreshold = reserveVerificationThresholdBps; + reserveVerificationThresholdBps = newThreshold; + + emit ReserveThresholdUpdated(oldThreshold, newThreshold); + } + + /** + * @notice Set rebalancing cooldown period + * @param newCooldown New cooldown in seconds + */ + function setRebalancingCooldown(uint256 newCooldown) external onlyOwner { + rebalancingCooldown = newCooldown; + } + + // ============ Internal Functions ============ + + /** + * @notice Verify reserve status for an asset + * @param asset Asset address + * @param bridgeAmount Amount bridged/required + * @return status Reserve status + */ + function verifyReserveStatus( + address asset, + uint256 bridgeAmount + ) internal view returns (ReserveStatus memory status) { + uint256 reserveBalance = reserveSystem.getReserveBalance(asset); + uint256 reserveRatio = bridgeAmount > 0 + ? (reserveBalance * 10000) / bridgeAmount + : type(uint256).max; + + bool isSufficient = reserveRatio >= reserveVerificationThresholdBps; + + return ReserveStatus({ + asset: asset, + bridgeAmount: bridgeAmount, + reserveBalance: reserveBalance, + reserveRatio: reserveRatio, + isSufficient: isSufficient, + lastVerified: block.timestamp + }); + } + + /** + * @notice Internal function to trigger rebalancing + * @param asset Asset address + * @param amount Amount that needs backing + */ + function _triggerRebalancing(address asset, uint256 amount) internal { + lastRebalancingTime[asset] = block.timestamp; + + // Check if we need to deposit reserves + ReserveStatus memory status = verifyReserveStatus(asset, amount); + + if (!status.isSufficient) { + uint256 shortfall = amount - status.reserveBalance; + + // In production, this would trigger reserve deposits or conversions + // For now, we emit an event for off-chain monitoring + emit RebalancingTriggered(asset, shortfall, address(this)); + } + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/CommodityPegManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/CommodityPegManager.sol new file mode 100644 index 0000000..b27c972 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/CommodityPegManager.sol @@ -0,0 +1,296 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../../reserve/IReserveSystem.sol"; +import "./ICommodityPegManager.sol"; + +/** + * @title CommodityPegManager + * @notice Manages commodity pegging (gold XAU, silver, oil, etc.) via XAU triangulation + * @dev All commodities are pegged through XAU (gold) as the base anchor + */ +contract CommodityPegManager is ICommodityPegManager, Ownable, ReentrancyGuard { + IReserveSystem public immutable reserveSystem; + + // XAU address (gold) - base anchor + address public xauAddress; + + // Commodity peg threshold (basis points: 10000 = 100%) + uint256 public commodityPegThresholdBps = 100; // ±1.0% for commodities + uint256 public constant MAX_PEG_THRESHOLD_BPS = 1000; // 10% max + + struct Commodity { + address commodityAddress; + string symbol; + uint256 xauRate; // Rate per 1 oz XAU (in 18 decimals) + bool isActive; + } + + mapping(address => Commodity) public commodities; + address[] public supportedCommodities; + + // XAU rates: 1 oz XAU = xauRate units of commodity + // Example: 1 oz XAU = 75 oz XAG (silver), so xauRate = 75e18 + + event CommodityRegistered( + address indexed commodity, + string symbol, + uint256 xauRate + ); + + event CommodityPegChecked( + address indexed commodity, + uint256 currentPrice, + uint256 targetPrice, + int256 deviationBps, + bool isMaintained + ); + + event RebalancingTriggered( + address indexed commodity, + int256 deviationBps + ); + + error ZeroAddress(); + error CommodityNotRegistered(); + error InvalidXauRate(); + error InvalidThreshold(); + error XauNotSet(); + + /** + * @notice Constructor + * @param _reserveSystem ReserveSystem contract address + */ + constructor(address _reserveSystem) Ownable(msg.sender) { + if (_reserveSystem == address(0)) revert ZeroAddress(); + reserveSystem = IReserveSystem(_reserveSystem); + } + + /** + * @notice Set XAU (gold) address + * @param _xauAddress XAU token address + */ + function setXAUAddress(address _xauAddress) external onlyOwner { + if (_xauAddress == address(0)) revert ZeroAddress(); + xauAddress = _xauAddress; + } + + /** + * @notice Register a commodity for pegging + * @param commodity Commodity token address + * @param symbol Commodity symbol (XAG, XPT, XPD, etc.) + * @param xauRate Rate: 1 oz XAU = xauRate units of commodity (in 18 decimals) + * @return success Whether registration was successful + */ + function registerCommodity( + address commodity, + string memory symbol, + uint256 xauRate + ) external override onlyOwner returns (bool) { + if (commodity == address(0)) revert ZeroAddress(); + if (xauRate == 0) revert InvalidXauRate(); + if (xauAddress == address(0)) revert XauNotSet(); + + commodities[commodity] = Commodity({ + commodityAddress: commodity, + symbol: symbol, + xauRate: xauRate, + isActive: true + }); + + // Add to supported commodities if not already present + bool alreadyAdded = false; + for (uint256 i = 0; i < supportedCommodities.length; i++) { + if (supportedCommodities[i] == commodity) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + supportedCommodities.push(commodity); + } + + emit CommodityRegistered(commodity, symbol, xauRate); + return true; + } + + /** + * @notice Check commodity peg via XAU + * @param commodity Commodity address + * @return isMaintained Whether peg is maintained + * @return deviationBps Deviation in basis points + */ + function checkCommodityPeg( + address commodity + ) external view override returns (bool isMaintained, int256 deviationBps) { + Commodity memory comm = commodities[commodity]; + if (comm.commodityAddress == address(0)) revert CommodityNotRegistered(); + + // Get XAU price in target currency (USD) + (uint256 xauPrice, ) = reserveSystem.getPrice(xauAddress); + + // Calculate target price: xauPrice / xauRate + uint256 targetPrice = (xauPrice * 1e18) / comm.xauRate; + + // Get current commodity price + (uint256 currentPrice, ) = reserveSystem.getPrice(commodity); + + // Calculate deviation + if (targetPrice == 0) { + return (false, type(int256).max); + } + + if (currentPrice >= targetPrice) { + uint256 diff = currentPrice - targetPrice; + deviationBps = int256((diff * 10000) / targetPrice); + } else { + uint256 diff = targetPrice - currentPrice; + deviationBps = -int256((diff * 10000) / targetPrice); + } + + isMaintained = _abs(deviationBps) <= commodityPegThresholdBps; + + return (isMaintained, deviationBps); + } + + /** + * @notice Triangulate commodity value through XAU to target currency + * @param commodity Commodity address + * @param amount Amount of commodity + * @param targetCurrency Target currency address (e.g., USDT for USD) + * @return targetAmount Amount in target currency + */ + function triangulateViaXAU( + address commodity, + uint256 amount, + address targetCurrency + ) external view override returns (uint256 targetAmount) { + Commodity memory comm = commodities[commodity]; + if (comm.commodityAddress == address(0)) revert CommodityNotRegistered(); + if (xauAddress == address(0)) revert XauNotSet(); + + // Convert commodity to XAU: amount / xauRate + uint256 xauAmount = (amount * 1e18) / comm.xauRate; + + // Get XAU price in target currency + (uint256 xauPrice, ) = reserveSystem.getPrice(xauAddress); + + // Get target currency price (should be 1e18 for stablecoins) + (uint256 targetPrice, ) = reserveSystem.getPrice(targetCurrency); + + // Calculate: xauAmount * xauPrice / targetPrice + targetAmount = (xauAmount * xauPrice) / (targetPrice * 1e18); + + return targetAmount; + } + + /** + * @notice Get commodity price in target currency + * @param commodity Commodity address + * @param targetCurrency Target currency address + * @return price Price in target currency + */ + function getCommodityPrice( + address commodity, + address targetCurrency + ) external view override returns (uint256 price) { + Commodity memory comm = commodities[commodity]; + if (comm.commodityAddress == address(0)) revert CommodityNotRegistered(); + if (xauAddress == address(0)) revert XauNotSet(); + + // Get XAU price in target currency + (uint256 xauPrice, ) = reserveSystem.getPrice(xauAddress); + + // Calculate commodity price: xauPrice / xauRate + price = (xauPrice * 1e18) / comm.xauRate; + + return price; + } + + /** + * @notice Get commodity peg status + * @param commodity Commodity address + * @return currentPrice Current price + * @return targetPrice Target price (via XAU) + * @return deviationBps Deviation in basis points + * @return isMaintained Whether peg is maintained + */ + function getCommodityPegStatus( + address commodity + ) external view override returns (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained) { + Commodity memory comm = commodities[commodity]; + if (comm.commodityAddress == address(0)) revert CommodityNotRegistered(); + if (xauAddress == address(0)) revert XauNotSet(); + + // Get XAU price + (uint256 xauPrice, ) = reserveSystem.getPrice(xauAddress); + + // Calculate target price + targetPrice = (xauPrice * 1e18) / comm.xauRate; + + // Get current price + (currentPrice, ) = reserveSystem.getPrice(commodity); + + // Calculate deviation + if (targetPrice == 0) { + return (currentPrice, targetPrice, type(int256).max, false); + } + + if (currentPrice >= targetPrice) { + uint256 diff = currentPrice - targetPrice; + deviationBps = int256((diff * 10000) / targetPrice); + } else { + uint256 diff = targetPrice - currentPrice; + deviationBps = -int256((diff * 10000) / targetPrice); + } + + isMaintained = _abs(deviationBps) <= commodityPegThresholdBps; + + // Note: Cannot emit in view function, events should be emitted by caller if needed + + return (currentPrice, targetPrice, deviationBps, isMaintained); + } + + /** + * @notice Get all supported commodities + * @return Array of commodity addresses + */ + function getSupportedCommodities() external view override returns (address[] memory) { + return supportedCommodities; + } + + /** + * @notice Set commodity peg threshold + * @param newThreshold New threshold in basis points + */ + function setCommodityPegThreshold(uint256 newThreshold) external onlyOwner { + if (newThreshold > MAX_PEG_THRESHOLD_BPS) revert InvalidThreshold(); + commodityPegThresholdBps = newThreshold; + } + + /** + * @notice Update XAU rate for a commodity + * @param commodity Commodity address + * @param newXauRate New XAU rate + */ + function updateXauRate(address commodity, uint256 newXauRate) external onlyOwner { + if (commodities[commodity].commodityAddress == address(0)) revert CommodityNotRegistered(); + if (newXauRate == 0) revert InvalidXauRate(); + + commodities[commodity].xauRate = newXauRate; + } + + // ============ Internal Functions ============ + + /** + * @notice Get absolute value of int256 + * @param value Input value + * @return Absolute value + */ + function _abs(int256 value) internal pure returns (uint256) { + return value < 0 ? uint256(-value) : uint256(value); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/ICommodityPegManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/ICommodityPegManager.sol new file mode 100644 index 0000000..76f575d --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/ICommodityPegManager.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title ICommodityPegManager + * @notice Interface for Commodity Peg Manager + */ +interface ICommodityPegManager { + struct CommodityPegStatus { + uint256 currentPrice; + uint256 targetPrice; + int256 deviationBps; + bool isMaintained; + } + + function registerCommodity(address commodity, string memory symbol, uint256 xauRate) external returns (bool); + function checkCommodityPeg(address commodity) external view returns (bool isMaintained, int256 deviationBps); + function triangulateViaXAU(address commodity, uint256 amount, address targetCurrency) external view returns (uint256 targetAmount); + function getCommodityPrice(address commodity, address targetCurrency) external view returns (uint256 price); + function getCommodityPegStatus(address commodity) external view returns (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained); + function getSupportedCommodities() external view returns (address[] memory); +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/IISOCurrencyManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/IISOCurrencyManager.sol new file mode 100644 index 0000000..ef21137 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/IISOCurrencyManager.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IISOCurrencyManager + * @notice Interface for ISO-4217 Currency Manager + */ +interface IISOCurrencyManager { + function registerCurrency(string memory currencyCode, address tokenAddress, uint256 xauRate) external returns (bool); + function convertViaXAU(string memory fromCurrency, string memory toCurrency, uint256 amount) external view returns (uint256 targetAmount); + function getCurrencyRate(string memory fromCurrency, string memory toCurrency) external view returns (uint256 rate); + function getAllSupportedCurrencies() external view returns (string[] memory); + function getCurrencyAddress(string memory currencyCode) external view returns (address); +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/ISOCurrencyManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/ISOCurrencyManager.sol new file mode 100644 index 0000000..731d939 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/ISOCurrencyManager.sol @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../../reserve/IReserveSystem.sol"; +import "./IISOCurrencyManager.sol"; + +/** + * @title ISOCurrencyManager + * @notice Manages all ISO-4217 currencies with XAU triangulation support + * @dev All currency conversions go through XAU: CurrencyA → XAU → CurrencyB + */ +contract ISOCurrencyManager is IISOCurrencyManager, Ownable, ReentrancyGuard { + IReserveSystem public immutable reserveSystem; + + // XAU address (gold) - base anchor for all triangulations + address public xauAddress; + + struct Currency { + string currencyCode; // ISO-4217 code (USD, EUR, GBP, etc.) + address tokenAddress; // Token contract address (if tokenized) + uint256 xauRate; // Rate: 1 oz XAU = xauRate units of currency (in 18 decimals) + bool isActive; + bool isTokenized; // Whether currency has on-chain token representation + } + + mapping(string => Currency) public currencies; + string[] public supportedCurrencies; + + // Example rates (in 18 decimals): + // USD: 1 oz XAU = 2000 USD, so xauRate = 2000e18 + // EUR: 1 oz XAU = 1800 EUR, so xauRate = 1800e18 + + event CurrencyRegistered( + string indexed currencyCode, + address tokenAddress, + uint256 xauRate, + bool isTokenized + ); + + event CurrencyConverted( + string fromCurrency, + string toCurrency, + uint256 fromAmount, + uint256 toAmount + ); + + error ZeroAddress(); + error CurrencyNotRegistered(); + error InvalidXauRate(); + error XauNotSet(); + error InvalidCurrencyCode(); + + /** + * @notice Constructor + * @param _reserveSystem ReserveSystem contract address + */ + constructor(address _reserveSystem) Ownable(msg.sender) { + if (_reserveSystem == address(0)) revert ZeroAddress(); + reserveSystem = IReserveSystem(_reserveSystem); + } + + /** + * @notice Set XAU (gold) address + * @param _xauAddress XAU token address + */ + function setXAUAddress(address _xauAddress) external onlyOwner { + if (_xauAddress == address(0)) revert ZeroAddress(); + xauAddress = _xauAddress; + } + + /** + * @notice Register ISO-4217 currency + * @param currencyCode ISO-4217 currency code (USD, EUR, GBP, JPY, etc.) + * @param tokenAddress Token contract address (address(0) if not tokenized) + * @param xauRate Rate: 1 oz XAU = xauRate units of currency (in 18 decimals) + * @return success Whether registration was successful + */ + function registerCurrency( + string memory currencyCode, + address tokenAddress, + uint256 xauRate + ) external override onlyOwner returns (bool) { + if (bytes(currencyCode).length == 0) revert InvalidCurrencyCode(); + if (xauRate == 0) revert InvalidXauRate(); + if (xauAddress == address(0)) revert XauNotSet(); + + bool isTokenized = tokenAddress != address(0); + + currencies[currencyCode] = Currency({ + currencyCode: currencyCode, + tokenAddress: tokenAddress, + xauRate: xauRate, + isActive: true, + isTokenized: isTokenized + }); + + // Add to supported currencies if not already present + bool alreadyAdded = false; + for (uint256 i = 0; i < supportedCurrencies.length; i++) { + if (keccak256(bytes(supportedCurrencies[i])) == keccak256(bytes(currencyCode))) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + supportedCurrencies.push(currencyCode); + } + + emit CurrencyRegistered(currencyCode, tokenAddress, xauRate, isTokenized); + return true; + } + + /** + * @notice Convert between currencies via XAU triangulation + * @param fromCurrency Source currency code + * @param toCurrency Target currency code + * @param amount Amount to convert + * @return targetAmount Amount in target currency + */ + function convertViaXAU( + string memory fromCurrency, + string memory toCurrency, + uint256 amount + ) external view override returns (uint256 targetAmount) { + Currency memory from = currencies[fromCurrency]; + Currency memory to = currencies[toCurrency]; + + if (bytes(from.currencyCode).length == 0) revert CurrencyNotRegistered(); + if (bytes(to.currencyCode).length == 0) revert CurrencyNotRegistered(); + if (xauAddress == address(0)) revert XauNotSet(); + + // Step 1: Convert fromCurrency to XAU + // amount / from.xauRate = XAU amount + uint256 xauAmount = (amount * 1e18) / from.xauRate; + + // Step 2: Convert XAU to toCurrency + // xauAmount * to.xauRate / 1e18 = targetAmount + targetAmount = (xauAmount * to.xauRate) / 1e18; + + return targetAmount; + } + + /** + * @notice Get exchange rate for currency pair + * @param fromCurrency Source currency code + * @param toCurrency Target currency code + * @return rate Exchange rate (toCurrency per fromCurrency, in 18 decimals) + */ + function getCurrencyRate( + string memory fromCurrency, + string memory toCurrency + ) external view override returns (uint256 rate) { + Currency memory from = currencies[fromCurrency]; + Currency memory to = currencies[toCurrency]; + + if (bytes(from.currencyCode).length == 0) revert CurrencyNotRegistered(); + if (bytes(to.currencyCode).length == 0) revert CurrencyNotRegistered(); + + // Rate = (to.xauRate / from.xauRate) * 1e18 + // This gives: 1 fromCurrency = rate toCurrency + rate = (to.xauRate * 1e18) / from.xauRate; + + return rate; + } + + /** + * @notice Get all supported currencies + * @return Array of currency codes + */ + function getAllSupportedCurrencies() external view override returns (string[] memory) { + return supportedCurrencies; + } + + /** + * @notice Get token address for a currency code + * @param currencyCode ISO-4217 currency code + * @return Token address (address(0) if not tokenized) + */ + function getCurrencyAddress( + string memory currencyCode + ) external view override returns (address) { + Currency memory currency = currencies[currencyCode]; + if (bytes(currency.currencyCode).length == 0) revert CurrencyNotRegistered(); + return currency.tokenAddress; + } + + /** + * @notice Update XAU rate for a currency + * @param currencyCode ISO-4217 currency code + * @param newXauRate New XAU rate + */ + function updateXauRate(string memory currencyCode, uint256 newXauRate) external onlyOwner { + Currency storage currency = currencies[currencyCode]; + if (bytes(currency.currencyCode).length == 0) revert CurrencyNotRegistered(); + if (newXauRate == 0) revert InvalidXauRate(); + + currency.xauRate = newXauRate; + } + + /** + * @notice Get currency info + * @param currencyCode ISO-4217 currency code + * @return tokenAddress Token address + * @return xauRate XAU rate + * @return isActive Whether currency is active + * @return isTokenized Whether currency is tokenized + */ + function getCurrencyInfo( + string memory currencyCode + ) external view returns ( + address tokenAddress, + uint256 xauRate, + bool isActive, + bool isTokenized + ) { + Currency memory currency = currencies[currencyCode]; + if (bytes(currency.currencyCode).length == 0) revert CurrencyNotRegistered(); + + return ( + currency.tokenAddress, + currency.xauRate, + currency.isActive, + currency.isTokenized + ); + } + + /** + * @notice Batch register currencies + * @param currencyCodes Array of currency codes + * @param tokenAddresses Array of token addresses + * @param xauRates Array of XAU rates + */ + function batchRegisterCurrencies( + string[] memory currencyCodes, + address[] memory tokenAddresses, + uint256[] memory xauRates + ) external onlyOwner { + require( + currencyCodes.length == tokenAddresses.length && + currencyCodes.length == xauRates.length, + "ISOCurrencyManager: length mismatch" + ); + + for (uint256 i = 0; i < currencyCodes.length; i++) { + // Call internal registration logic directly + bool isTokenized = tokenAddresses[i] != address(0); + currencies[currencyCodes[i]] = Currency({ + currencyCode: currencyCodes[i], + tokenAddress: tokenAddresses[i], + xauRate: xauRates[i], + isActive: true, + isTokenized: isTokenized + }); + + // Add to supported currencies if not already present + bool alreadyAdded = false; + for (uint256 j = 0; j < supportedCurrencies.length; j++) { + if (keccak256(bytes(supportedCurrencies[j])) == keccak256(bytes(currencyCodes[i]))) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + supportedCurrencies.push(currencyCodes[i]); + } + + emit CurrencyRegistered(currencyCodes[i], tokenAddresses[i], xauRates[i], isTokenized); + } + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/IStablecoinPegManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/IStablecoinPegManager.sol new file mode 100644 index 0000000..b96bcd7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/IStablecoinPegManager.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IStablecoinPegManager + * @notice Interface for Stablecoin Peg Manager + */ +interface IStablecoinPegManager { + struct PegStatus { + uint256 currentPrice; + uint256 targetPrice; + int256 deviationBps; // Can be negative + bool isMaintained; + } + + function checkUSDpeg(address stablecoin) external view returns (bool isMaintained, int256 deviationBps); + function checkETHpeg(address weth) external view returns (bool isMaintained, int256 deviationBps); + function calculateDeviation(address asset, uint256 currentPrice, uint256 targetPrice) external pure returns (int256 deviationBps); + function getPegStatus(address asset) external view returns (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained); + function getSupportedAssets() external view returns (address[] memory); +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/Stabilizer.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/Stabilizer.sol new file mode 100644 index 0000000..e108b77 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/Stabilizer.sol @@ -0,0 +1,237 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../../dex/PrivatePoolRegistry.sol"; +import "./IStablecoinPegManager.sol"; +import "./ICommodityPegManager.sol"; + +/** + * @title Minimal DODO PMM pool interface for Stabilizer swaps + */ +interface IDODOPMMPoolStabilizer { + function _BASE_TOKEN_() external view returns (address); + function _QUOTE_TOKEN_() external view returns (address); + function sellBase(uint256 amount) external returns (uint256); + function sellQuote(uint256 amount) external returns (uint256); + function getMidPrice() external view returns (uint256); +} + +/** + * @title Stabilizer + * @notice Phase 3: Deviation-triggered private swaps via XAU-anchored pools. Phase 6: TWAP/sustained deviation, per-block cap, flash containment. + * @dev Implements Appendix A of VAULT_SYSTEM_MASTER_TECHNICAL_PLAN. Only STABILIZER_KEEPER_ROLE may call executePrivateSwap. + */ +contract Stabilizer is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant STABILIZER_KEEPER_ROLE = keccak256("STABILIZER_KEEPER_ROLE"); + + PrivatePoolRegistry public immutable privatePoolRegistry; + + uint256 public lastExecutionBlock; + uint256 public volumeThisBlock; + uint256 public volumeBlockNumber; + uint256 public minBlocksBetweenExecution = 3; + uint256 public maxStabilizationVolumePerBlock; + uint256 public thresholdBps = 50; + uint256 public sustainedDeviationBlocks = 3; + uint256 public maxSlippageBps = 100; + uint256 public maxGasPriceForStabilizer; + + IStablecoinPegManager public stablecoinPegManager; + address public stablecoinPegAsset; + ICommodityPegManager public commodityPegManager; + address public commodityPegAsset; + bool public useStablecoinPeg; // true = use stablecoin peg, false = use commodity peg (when set) + + struct DeviationSample { + uint256 blockNumber; + int256 deviationBps; + } + uint256 public constant MAX_DEVIATION_SAMPLES = 32; + DeviationSample[MAX_DEVIATION_SAMPLES] private _samples; + uint256 private _sampleIndex; + uint256 private _sampleCount; + + event PrivateSwapExecuted(address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut); + event ConfigUpdated(string key, uint256 value); + event PegSourceStablecoinSet(address manager, address asset); + event PegSourceCommoditySet(address manager, address asset); + + error NoPrivatePool(); + error ShouldNotRebalance(); + error BlockDelayNotMet(); + error VolumeCapExceeded(); + error SlippageExceeded(); + error GasPriceTooHigh(); + error ZeroAmount(); + error NoDeviationSource(); + error InsufficientBalance(); + + constructor(address admin, address _privatePoolRegistry) { + require(admin != address(0), "Stabilizer: zero admin"); + require(_privatePoolRegistry != address(0), "Stabilizer: zero registry"); + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(STABILIZER_KEEPER_ROLE, admin); + privatePoolRegistry = PrivatePoolRegistry(_privatePoolRegistry); + } + + function setStablecoinPegSource(address manager, address asset) external onlyRole(DEFAULT_ADMIN_ROLE) { + stablecoinPegManager = IStablecoinPegManager(manager); + stablecoinPegAsset = asset; + useStablecoinPeg = true; + emit PegSourceStablecoinSet(manager, asset); + } + + function setCommodityPegSource(address manager, address asset) external onlyRole(DEFAULT_ADMIN_ROLE) { + commodityPegManager = ICommodityPegManager(manager); + commodityPegAsset = asset; + useStablecoinPeg = false; + emit PegSourceCommoditySet(manager, asset); + } + + function setMinBlocksBetweenExecution(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + minBlocksBetweenExecution = v; + emit ConfigUpdated("minBlocksBetweenExecution", v); + } + + function setMaxStabilizationVolumePerBlock(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + maxStabilizationVolumePerBlock = v; + emit ConfigUpdated("maxStabilizationVolumePerBlock", v); + } + + function setThresholdBps(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + thresholdBps = v; + emit ConfigUpdated("thresholdBps", v); + } + + function setSustainedDeviationBlocks(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(v <= MAX_DEVIATION_SAMPLES, "Stabilizer: sample limit"); + sustainedDeviationBlocks = v; + emit ConfigUpdated("sustainedDeviationBlocks", v); + } + + function setMaxSlippageBps(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + maxSlippageBps = v; + emit ConfigUpdated("maxSlippageBps", v); + } + + function setMaxGasPriceForStabilizer(uint256 v) external onlyRole(DEFAULT_ADMIN_ROLE) { + maxGasPriceForStabilizer = v; + emit ConfigUpdated("maxGasPriceForStabilizer", v); + } + + /** + * @notice Get current deviation in bps and whether rebalance is recommended (sustained over threshold). + * @return deviationBps Current peg deviation in basis points. + * @return shouldRebalance True if over threshold for sustainedDeviationBlocks samples. + */ + function checkDeviation() external view returns (int256 deviationBps, bool shouldRebalance) { + deviationBps = _getDeviationBps(); + // forge-lint: disable-next-line unsafe-typecast -- thresholdBps is uint256, casting to int256 for comparison with _abs result; thresholdBps is small (basis points) + if (_abs(deviationBps) <= int256(uint256(thresholdBps))) { + return (deviationBps, false); + } + shouldRebalance = _sustainedOverThreshold(); + return (deviationBps, shouldRebalance); + } + + /** + * @notice Record current deviation for sustained-deviation check (call from keeper each block or before executePrivateSwap). + */ + function recordDeviation() external { + int256 d = _getDeviationBps(); + _pushSample(block.number, d); + } + + /** + * @notice Execute a private swap via the private pool registry (only keeper when shouldRebalance). + * @param tradeSize Amount of tokenIn to swap. + * @param tokenIn Token to sell (must have balance on this contract). + * @param tokenOut Token to buy. + * @return amountOut Amount of tokenOut received (reverts on slippage or volume cap). + */ + function executePrivateSwap( + uint256 tradeSize, + address tokenIn, + address tokenOut + ) external nonReentrant onlyRole(STABILIZER_KEEPER_ROLE) returns (uint256 amountOut) { + if (tradeSize == 0) revert ZeroAmount(); + if (maxGasPriceForStabilizer != 0 && block.basefee > maxGasPriceForStabilizer) revert GasPriceTooHigh(); + if (block.number < lastExecutionBlock + minBlocksBetweenExecution) revert BlockDelayNotMet(); + + _pushSample(block.number, _getDeviationBps()); + (int256 deviationBps, bool shouldRebalance) = this.checkDeviation(); + if (!shouldRebalance) revert ShouldNotRebalance(); + + if (block.number != volumeBlockNumber) { + volumeBlockNumber = block.number; + volumeThisBlock = 0; + } + if (volumeThisBlock + tradeSize > maxStabilizationVolumePerBlock) revert VolumeCapExceeded(); + volumeThisBlock += tradeSize; + lastExecutionBlock = block.number; + + address pool = privatePoolRegistry.getPrivatePool(tokenIn, tokenOut); + if (pool == address(0)) revert NoPrivatePool(); + + address base = IDODOPMMPoolStabilizer(pool)._BASE_TOKEN_(); + address quote = IDODOPMMPoolStabilizer(pool)._QUOTE_TOKEN_(); + uint256 midPrice = IDODOPMMPoolStabilizer(pool).getMidPrice(); + uint256 expectedOut = tokenIn == base + ? (tradeSize * midPrice) / 1e18 + : (tradeSize * 1e18) / midPrice; + uint256 minAmountOut = (expectedOut * (10000 - maxSlippageBps)) / 10000; + + if (IERC20(tokenIn).balanceOf(address(this)) < tradeSize) revert InsufficientBalance(); + IERC20(tokenIn).safeTransfer(pool, tradeSize); + amountOut = tokenIn == base + ? IDODOPMMPoolStabilizer(pool).sellBase(tradeSize) + : IDODOPMMPoolStabilizer(pool).sellQuote(tradeSize); + if (amountOut < minAmountOut) revert SlippageExceeded(); + + emit PrivateSwapExecuted(tokenIn, tokenOut, tradeSize, amountOut); + return amountOut; + } + + function _getDeviationBps() internal view returns (int256) { + if (useStablecoinPeg && address(stablecoinPegManager) != address(0) && stablecoinPegAsset != address(0)) { + (, int256 d) = stablecoinPegManager.checkUSDpeg(stablecoinPegAsset); + return d; + } + if (!useStablecoinPeg && address(commodityPegManager) != address(0) && commodityPegAsset != address(0)) { + (, int256 d) = commodityPegManager.checkCommodityPeg(commodityPegAsset); + return d; + } + return 0; + } + + function _sustainedOverThreshold() internal view returns (bool) { + if (sustainedDeviationBlocks == 0) return true; + if (_sampleCount < sustainedDeviationBlocks) return false; + uint256 n = sustainedDeviationBlocks; + for (uint256 i = 0; i < n; i++) { + uint256 idx = (_sampleIndex + MAX_DEVIATION_SAMPLES - 1 - i) % MAX_DEVIATION_SAMPLES; + int256 d = _samples[idx].deviationBps; + // forge-lint: disable-next-line unsafe-typecast -- d is deviationBps (small int256), safe to cast to uint256 for abs + uint256 absD = d < 0 ? uint256(-d) : uint256(d); + if (absD <= thresholdBps) return false; + } + return true; + } + + function _pushSample(uint256 blockNum, int256 deviationBps) internal { + uint256 idx = _sampleIndex % MAX_DEVIATION_SAMPLES; + _samples[idx] = DeviationSample({ blockNumber: blockNum, deviationBps: deviationBps }); + _sampleIndex = ( _sampleIndex + 1) % MAX_DEVIATION_SAMPLES; + if (_sampleCount < MAX_DEVIATION_SAMPLES) _sampleCount++; + } + + function _abs(int256 x) internal pure returns (int256) { + return x < 0 ? -x : x; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/StablecoinPegManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/StablecoinPegManager.sol new file mode 100644 index 0000000..1ea6b3d --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/integration/StablecoinPegManager.sol @@ -0,0 +1,301 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../../../reserve/IReserveSystem.sol"; +import "./IStablecoinPegManager.sol"; + +/** + * @title StablecoinPegManager + * @notice Maintains USD peg for USDT/USDC, ETH peg for WETH, and monitors deviations + * @dev Monitors peg status and triggers rebalancing if deviation exceeds thresholds + */ +contract StablecoinPegManager is IStablecoinPegManager, Ownable, ReentrancyGuard { + IReserveSystem public immutable reserveSystem; + + // Peg thresholds (basis points: 10000 = 100%) + uint256 public usdPegThresholdBps = 50; // ±0.5% for USD stablecoins + uint256 public ethPegThresholdBps = 10; // ±0.1% for ETH/WETH + uint256 public constant MAX_PEG_THRESHOLD_BPS = 500; // 5% max + + // Target prices (in 18 decimals) + uint256 public constant USD_TARGET_PRICE = 1e18; // $1.00 + uint256 public constant ETH_TARGET_PRICE = 1e18; // 1:1 with ETH + + // Supported assets + mapping(address => bool) public isUSDStablecoin; // USDT, USDC, DAI + mapping(address => bool) public isWETH; // WETH + address[] public supportedAssets; + + struct AssetPeg { + address asset; + uint256 targetPrice; + uint256 thresholdBps; + bool isActive; + } + + mapping(address => AssetPeg) public assetPegs; + + event PegChecked( + address indexed asset, + uint256 currentPrice, + uint256 targetPrice, + int256 deviationBps, + bool isMaintained + ); + + event RebalancingTriggered( + address indexed asset, + int256 deviationBps, + uint256 requiredAdjustment + ); + + event AssetRegistered(address indexed asset, uint256 targetPrice, uint256 thresholdBps); + event PegThresholdUpdated(address indexed asset, uint256 oldThreshold, uint256 newThreshold); + + error ZeroAddress(); + error AssetNotRegistered(); + error InvalidThreshold(); + error InvalidTargetPrice(); + + /** + * @notice Constructor + * @param _reserveSystem ReserveSystem contract address + */ + constructor(address _reserveSystem) Ownable(msg.sender) { + if (_reserveSystem == address(0)) revert ZeroAddress(); + reserveSystem = IReserveSystem(_reserveSystem); + } + + /** + * @notice Register a USD stablecoin + * @param asset Asset address (USDT, USDC, DAI) + */ + function registerUSDStablecoin(address asset) external onlyOwner { + if (asset == address(0)) revert ZeroAddress(); + + isUSDStablecoin[asset] = true; + assetPegs[asset] = AssetPeg({ + asset: asset, + targetPrice: USD_TARGET_PRICE, + thresholdBps: usdPegThresholdBps, + isActive: true + }); + + // Add to supported assets if not already present + bool alreadyAdded = false; + for (uint256 i = 0; i < supportedAssets.length; i++) { + if (supportedAssets[i] == asset) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + supportedAssets.push(asset); + } + + emit AssetRegistered(asset, USD_TARGET_PRICE, usdPegThresholdBps); + } + + /** + * @notice Register WETH + * @param weth WETH token address + */ + function registerWETH(address weth) external onlyOwner { + if (weth == address(0)) revert ZeroAddress(); + + isWETH[weth] = true; + assetPegs[weth] = AssetPeg({ + asset: weth, + targetPrice: ETH_TARGET_PRICE, + thresholdBps: ethPegThresholdBps, + isActive: true + }); + + // Add to supported assets if not already present + bool alreadyAdded = false; + for (uint256 i = 0; i < supportedAssets.length; i++) { + if (supportedAssets[i] == weth) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + supportedAssets.push(weth); + } + + emit AssetRegistered(weth, ETH_TARGET_PRICE, ethPegThresholdBps); + } + + /** + * @notice Check USD peg for a stablecoin + * @param stablecoin Stablecoin address + * @return isMaintained Whether peg is maintained + * @return deviationBps Deviation in basis points + */ + function checkUSDpeg(address stablecoin) external view override returns (bool isMaintained, int256 deviationBps) { + if (!isUSDStablecoin[stablecoin]) revert AssetNotRegistered(); + + AssetPeg memory peg = assetPegs[stablecoin]; + (uint256 currentPrice, ) = reserveSystem.getPrice(stablecoin); + + deviationBps = calculateDeviation(stablecoin, currentPrice, peg.targetPrice); + isMaintained = _abs(deviationBps) <= peg.thresholdBps; + + return (isMaintained, deviationBps); + } + + /** + * @notice Check ETH peg for WETH + * @param weth WETH address + * @return isMaintained Whether peg is maintained + * @return deviationBps Deviation in basis points + */ + function checkETHpeg(address weth) external view override returns (bool isMaintained, int256 deviationBps) { + if (!isWETH[weth]) revert AssetNotRegistered(); + + AssetPeg memory peg = assetPegs[weth]; + (uint256 currentPrice, ) = reserveSystem.getPrice(weth); + + deviationBps = calculateDeviation(weth, currentPrice, peg.targetPrice); + isMaintained = _abs(deviationBps) <= peg.thresholdBps; + + return (isMaintained, deviationBps); + } + + /** + * @notice Calculate deviation from target price + * @param asset Asset address + * @param currentPrice Current price + * @param targetPrice Target price + * @return deviationBps Deviation in basis points (can be negative) + */ + function calculateDeviation( + address asset, + uint256 currentPrice, + uint256 targetPrice + ) public pure override returns (int256 deviationBps) { + if (targetPrice == 0) revert InvalidTargetPrice(); + + // Calculate deviation: ((currentPrice - targetPrice) / targetPrice) * 10000 + if (currentPrice >= targetPrice) { + uint256 diff = currentPrice - targetPrice; + deviationBps = int256((diff * 10000) / targetPrice); + } else { + uint256 diff = targetPrice - currentPrice; + deviationBps = -int256((diff * 10000) / targetPrice); + } + + return deviationBps; + } + + /** + * @notice Get peg status for an asset + * @param asset Asset address + * @return currentPrice Current price + * @return targetPrice Target price + * @return deviationBps Deviation in basis points + * @return isMaintained Whether peg is maintained + */ + function getPegStatus( + address asset + ) external view override returns (uint256 currentPrice, uint256 targetPrice, int256 deviationBps, bool isMaintained) { + AssetPeg memory peg = assetPegs[asset]; + if (peg.asset == address(0)) revert AssetNotRegistered(); + + (currentPrice, ) = reserveSystem.getPrice(asset); + targetPrice = peg.targetPrice; + deviationBps = calculateDeviation(asset, currentPrice, targetPrice); + isMaintained = _abs(deviationBps) <= peg.thresholdBps; + + // Note: Cannot emit in view function, events should be emitted by caller if needed + + return (currentPrice, targetPrice, deviationBps, isMaintained); + } + + /** + * @notice Get all supported assets + * @return Array of supported asset addresses + */ + function getSupportedAssets() external view override returns (address[] memory) { + return supportedAssets; + } + + /** + * @notice Set USD peg threshold + * @param newThreshold New threshold in basis points + */ + function setUSDPegThreshold(uint256 newThreshold) external onlyOwner { + if (newThreshold > MAX_PEG_THRESHOLD_BPS) revert InvalidThreshold(); + + uint256 oldThreshold = usdPegThresholdBps; + usdPegThresholdBps = newThreshold; + + // Update all USD stablecoin thresholds + for (uint256 i = 0; i < supportedAssets.length; i++) { + if (isUSDStablecoin[supportedAssets[i]]) { + uint256 oldAssetThreshold = assetPegs[supportedAssets[i]].thresholdBps; + assetPegs[supportedAssets[i]].thresholdBps = newThreshold; + emit PegThresholdUpdated(supportedAssets[i], oldAssetThreshold, newThreshold); + } + } + + emit PegThresholdUpdated(address(0), oldThreshold, newThreshold); + } + + /** + * @notice Set ETH peg threshold + * @param newThreshold New threshold in basis points + */ + function setETHPegThreshold(uint256 newThreshold) external onlyOwner { + if (newThreshold > MAX_PEG_THRESHOLD_BPS) revert InvalidThreshold(); + + uint256 oldThreshold = ethPegThresholdBps; + ethPegThresholdBps = newThreshold; + + // Update all WETH thresholds + for (uint256 i = 0; i < supportedAssets.length; i++) { + if (isWETH[supportedAssets[i]]) { + uint256 oldAssetThreshold = assetPegs[supportedAssets[i]].thresholdBps; + assetPegs[supportedAssets[i]].thresholdBps = newThreshold; + emit PegThresholdUpdated(supportedAssets[i], oldAssetThreshold, newThreshold); + } + } + + emit PegThresholdUpdated(address(0), oldThreshold, newThreshold); + } + + /** + * @notice Trigger rebalancing if deviation exceeds threshold + * @param asset Asset address + */ + function triggerRebalancing(address asset) external onlyOwner nonReentrant { + AssetPeg memory peg = assetPegs[asset]; + if (peg.asset == address(0)) revert AssetNotRegistered(); + + (uint256 currentPrice, ) = reserveSystem.getPrice(asset); + int256 deviationBps = calculateDeviation(asset, currentPrice, peg.targetPrice); + + if (_abs(deviationBps) > peg.thresholdBps) { + // Calculate required adjustment + uint256 adjustment = currentPrice > peg.targetPrice + ? currentPrice - peg.targetPrice + : peg.targetPrice - currentPrice; + + emit RebalancingTriggered(asset, deviationBps, adjustment); + } + } + + // ============ Internal Functions ============ + + /** + * @notice Get absolute value of int256 + * @param value Input value + * @return Absolute value + */ + function _abs(int256 value) internal pure returns (uint256) { + return value < 0 ? uint256(-value) : uint256(value); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IAggregationRouter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IAggregationRouter.sol new file mode 100644 index 0000000..71d6a00 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IAggregationRouter.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IAggregationRouter - 1inch AggregationRouter Interface + * @notice Minimal interface for 1inch AggregationRouter + * @dev Based on 1inch V5 Router + */ +interface IAggregationRouter { + struct SwapDescription { + address srcToken; + address dstToken; + address srcReceiver; + address dstReceiver; + uint256 amount; + uint256 minReturnAmount; + uint256 flags; + bytes permit; + } + + function swap( + address executor, + SwapDescription calldata desc, + bytes calldata permit, + bytes calldata data + ) external payable returns (uint256 returnAmount, uint256 spentAmount); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IBalancerVault.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IBalancerVault.sol new file mode 100644 index 0000000..4144743 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IBalancerVault.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IBalancerVault + * @notice Interface for Balancer V2 Vault + * @dev Balancer provides weighted pools and better stablecoin swaps + */ +interface IBalancerVault { + struct SingleSwap { + bytes32 poolId; + SwapKind kind; + address assetIn; + address assetOut; + uint256 amount; + bytes userData; + } + + struct FundManagement { + address sender; + bool fromInternalBalance; + address payable recipient; + bool toInternalBalance; + } + + enum SwapKind { + GIVEN_IN, // Amount in is known + GIVEN_OUT // Amount out is known + } + + /** + * @notice Execute a single swap + * @param singleSwap Swap parameters + * @param funds Fund management parameters + * @param limit Maximum amount to swap (slippage protection) + * @param deadline Deadline for swap + * @return amountCalculated Amount calculated for swap + */ + function swap( + SingleSwap memory singleSwap, + FundManagement memory funds, + uint256 limit, + uint256 deadline + ) external payable returns (uint256 amountCalculated); + + /** + * @notice Get pool information + * @param poolId Pool identifier + * @return poolAddress Pool address + * @return specialization Pool specialization type + */ + function getPool(bytes32 poolId) external view returns (address poolAddress, uint8 specialization); + + /** + * @notice Query batch swap for quotes + * @param kind Swap kind + * @param swaps Array of swaps to query + * @param assets Array of assets involved + * @return assetDeltas Asset deltas for each asset + */ + function queryBatchSwap( + SwapKind kind, + SingleSwap[] memory swaps, + address[] memory assets + ) external view returns (int256[] memory assetDeltas); + + /** + * @notice Get pool tokens and balances + * @param poolId Pool identifier + * @return tokens Token addresses in the pool + * @return balances Token balances in the pool + * @return lastChangeBlock Last block number that changed balances + */ + function getPoolTokens(bytes32 poolId) + external + view + returns ( + address[] memory tokens, + uint256[] memory balances, + uint256 lastChangeBlock + ); +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/ICurvePool.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/ICurvePool.sol new file mode 100644 index 0000000..4215aa7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/ICurvePool.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title ICurvePool - Curve Pool Interface + * @notice Minimal interface for Curve stable pools (e.g., 3pool) + * @dev Based on Curve StableSwap pools + */ +interface ICurvePool { + function exchange( + int128 i, + int128 j, + uint256 dx, + uint256 min_dy + ) external payable returns (uint256); + + function exchange_underlying( + int128 i, + int128 j, + uint256 dx, + uint256 min_dy + ) external payable returns (uint256); + + function get_dy( + int128 i, + int128 j, + uint256 dx + ) external view returns (uint256); + + function coins(uint256 i) external view returns (address); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IDodoexRouter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IDodoexRouter.sol new file mode 100644 index 0000000..71c93db --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IDodoexRouter.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IDodoexRouter + * @notice Interface for Dodoex PMM (Proactive Market Maker) Router + * @dev Dodoex uses PMM which provides better price discovery and lower slippage + */ +interface IDodoexRouter { + struct DodoSwapParams { + address fromToken; + address toToken; + uint256 fromTokenAmount; + uint256 minReturnAmount; + address[] dodoPairs; // Dodo PMM pool addresses + uint256 directions; // 0 = base to quote, 1 = quote to base + bool isIncentive; // Whether to use incentive mechanism + uint256 deadLine; + } + + /** + * @notice Swap tokens via Dodoex PMM + * @param params Swap parameters + * @return receivedAmount Amount received after swap + */ + function dodoSwapV2TokenToToken( + DodoSwapParams calldata params + ) external returns (uint256 receivedAmount); + + /** + * @notice Get quote for swap (view function) + * @param fromToken Source token + * @param toToken Destination token + * @param fromTokenAmount Amount to swap + * @return toTokenAmount Expected output amount + */ + function getDodoSwapQuote( + address fromToken, + address toToken, + uint256 fromTokenAmount + ) external view returns (uint256 toTokenAmount); +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/ISwapRouter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/ISwapRouter.sol new file mode 100644 index 0000000..b0444a9 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/ISwapRouter.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title ISwapRouter - Uniswap V3 SwapRouter Interface + * @notice Minimal interface for Uniswap V3 SwapRouter + * @dev Based on Uniswap V3 SwapRouter02 + */ +interface ISwapRouter { + struct ExactInputSingleParams { + address tokenIn; + address tokenOut; + uint24 fee; + address recipient; + uint256 deadline; + uint256 amountIn; + uint256 amountOutMinimum; + uint160 sqrtPriceLimitX96; + } + + struct ExactInputParams { + bytes path; + address recipient; + uint256 deadline; + uint256 amountIn; + uint256 amountOutMinimum; + } + + function exactInputSingle(ExactInputSingleParams calldata params) + external + payable + returns (uint256 amountOut); + + function exactInput(ExactInputParams calldata params) + external + payable + returns (uint256 amountOut); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IWETH.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IWETH.sol new file mode 100644 index 0000000..ee56ce1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/interfaces/IWETH.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IWETH + * @notice Minimal WETH interface for bridge contracts + */ +interface IWETH { + function deposit() external payable; + function withdraw(uint256) external; + function transfer(address to, uint256 value) external returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/libraries/FraudProofTypes.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/libraries/FraudProofTypes.sol new file mode 100644 index 0000000..24da10c --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/libraries/FraudProofTypes.sol @@ -0,0 +1,242 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title FraudProofTypes + * @notice Library for encoding/decoding fraud proof data + * @dev Defines structures and encoding for different fraud proof types + */ +library FraudProofTypes { + /** + * @notice Fraud proof for non-existent deposit + * @dev Contains Merkle proof showing deposit doesn't exist in source chain state + */ + struct NonExistentDepositProof { + bytes32 stateRoot; // State root from source chain block + bytes32 depositHash; // Hash of deposit data that should exist + bytes32[] merkleProof; // Merkle proof path + bytes32 leftSibling; // Left sibling for non-existence proof + bytes32 rightSibling; // Right sibling for non-existence proof + bytes blockHeader; // Block header from source chain + uint256 blockNumber; // Block number + } + + /** + * @notice Fraud proof for incorrect amount + * @dev Contains proof showing actual deposit amount differs from claimed amount + */ + struct IncorrectAmountProof { + bytes32 stateRoot; // State root from source chain block + bytes32 depositHash; // Hash of actual deposit data + bytes32[] merkleProof; // Merkle proof for actual deposit + uint256 actualAmount; // Actual deposit amount from source chain + bytes blockHeader; // Block header from source chain + uint256 blockNumber; // Block number + } + + /** + * @notice Fraud proof for incorrect recipient + * @dev Contains proof showing actual recipient differs from claimed recipient + */ + struct IncorrectRecipientProof { + bytes32 stateRoot; // State root from source chain block + bytes32 depositHash; // Hash of actual deposit data + bytes32[] merkleProof; // Merkle proof for actual deposit + address actualRecipient; // Actual recipient from source chain + bytes blockHeader; // Block header from source chain + uint256 blockNumber; // Block number + } + + /** + * @notice Fraud proof for double spend + * @dev Contains proof showing deposit was already claimed in another claim + */ + struct DoubleSpendProof { + uint256 previousClaimId; // Deposit ID of previous claim + bytes32 previousClaimHash; // Hash of previous claim + bytes32[] merkleProof; // Merkle proof for previous claim + bytes blockHeader; // Block header from source chain + uint256 blockNumber; // Block number + } + + /** + * @notice Encode NonExistentDepositProof to bytes + */ + function encodeNonExistentDeposit(NonExistentDepositProof memory proof) + internal + pure + returns (bytes memory) + { + return abi.encode( + proof.stateRoot, + proof.depositHash, + proof.merkleProof, + proof.leftSibling, + proof.rightSibling, + proof.blockHeader, + proof.blockNumber + ); + } + + /** + * @notice Decode bytes to NonExistentDepositProof + */ + function decodeNonExistentDeposit(bytes memory data) + internal + pure + returns (NonExistentDepositProof memory) + { + ( + bytes32 stateRoot, + bytes32 depositHash, + bytes32[] memory merkleProof, + bytes32 leftSibling, + bytes32 rightSibling, + bytes memory blockHeader, + uint256 blockNumber + ) = abi.decode(data, (bytes32, bytes32, bytes32[], bytes32, bytes32, bytes, uint256)); + + return NonExistentDepositProof({ + stateRoot: stateRoot, + depositHash: depositHash, + merkleProof: merkleProof, + leftSibling: leftSibling, + rightSibling: rightSibling, + blockHeader: blockHeader, + blockNumber: blockNumber + }); + } + + /** + * @notice Encode IncorrectAmountProof to bytes + */ + function encodeIncorrectAmount(IncorrectAmountProof memory proof) + internal + pure + returns (bytes memory) + { + return abi.encode( + proof.stateRoot, + proof.depositHash, + proof.merkleProof, + proof.actualAmount, + proof.blockHeader, + proof.blockNumber + ); + } + + /** + * @notice Decode bytes to IncorrectAmountProof + */ + function decodeIncorrectAmount(bytes memory data) + internal + pure + returns (IncorrectAmountProof memory) + { + ( + bytes32 stateRoot, + bytes32 depositHash, + bytes32[] memory merkleProof, + uint256 actualAmount, + bytes memory blockHeader, + uint256 blockNumber + ) = abi.decode(data, (bytes32, bytes32, bytes32[], uint256, bytes, uint256)); + + return IncorrectAmountProof({ + stateRoot: stateRoot, + depositHash: depositHash, + merkleProof: merkleProof, + actualAmount: actualAmount, + blockHeader: blockHeader, + blockNumber: blockNumber + }); + } + + /** + * @notice Encode IncorrectRecipientProof to bytes + */ + function encodeIncorrectRecipient(IncorrectRecipientProof memory proof) + internal + pure + returns (bytes memory) + { + return abi.encode( + proof.stateRoot, + proof.depositHash, + proof.merkleProof, + proof.actualRecipient, + proof.blockHeader, + proof.blockNumber + ); + } + + /** + * @notice Decode bytes to IncorrectRecipientProof + */ + function decodeIncorrectRecipient(bytes memory data) + internal + pure + returns (IncorrectRecipientProof memory) + { + ( + bytes32 stateRoot, + bytes32 depositHash, + bytes32[] memory merkleProof, + address actualRecipient, + bytes memory blockHeader, + uint256 blockNumber + ) = abi.decode(data, (bytes32, bytes32, bytes32[], address, bytes, uint256)); + + return IncorrectRecipientProof({ + stateRoot: stateRoot, + depositHash: depositHash, + merkleProof: merkleProof, + actualRecipient: actualRecipient, + blockHeader: blockHeader, + blockNumber: blockNumber + }); + } + + /** + * @notice Encode DoubleSpendProof to bytes + */ + function encodeDoubleSpend(DoubleSpendProof memory proof) + internal + pure + returns (bytes memory) + { + return abi.encode( + proof.previousClaimId, + proof.previousClaimHash, + proof.merkleProof, + proof.blockHeader, + proof.blockNumber + ); + } + + /** + * @notice Decode bytes to DoubleSpendProof + */ + function decodeDoubleSpend(bytes memory data) + internal + pure + returns (DoubleSpendProof memory) + { + ( + uint256 previousClaimId, + bytes32 previousClaimHash, + bytes32[] memory merkleProof, + bytes memory blockHeader, + uint256 blockNumber + ) = abi.decode(data, (uint256, bytes32, bytes32[], bytes, uint256)); + + return DoubleSpendProof({ + previousClaimId: previousClaimId, + previousClaimHash: previousClaimHash, + merkleProof: merkleProof, + blockHeader: blockHeader, + blockNumber: blockNumber + }); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/libraries/MerkleProofVerifier.sol b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/libraries/MerkleProofVerifier.sol new file mode 100644 index 0000000..2babf1d --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/bridge/trustless/libraries/MerkleProofVerifier.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title MerkleProofVerifier + * @notice Library for verifying Merkle proofs for trustless bridge fraud proofs + * @dev Supports verification of deposit existence/non-existence in source chain state + */ +library MerkleProofVerifier { + /** + * @notice Verify a Merkle proof for deposit existence + * @param root Merkle root from source chain state + * @param leaf Deposit data hash (keccak256(abi.encodePacked(depositId, asset, amount, recipient, timestamp))) + * @param proof Merkle proof path + * @return True if proof is valid + */ + function verifyDepositExistence( + bytes32 root, + bytes32 leaf, + bytes32[] memory proof + ) internal pure returns (bool) { + return verify(proof, root, leaf); + } + + /** + * @notice Verify a Merkle proof for deposit non-existence (proof of absence) + * @param root Merkle root from source chain state + * @param leaf Deposit data hash + * @param proof Merkle proof path showing absence + * @param leftSibling Left sibling in the tree (for non-existence proofs) + * @param rightSibling Right sibling in the tree (for non-existence proofs) + * @return True if proof of absence is valid + */ + function verifyDepositNonExistence( + bytes32 root, + bytes32 leaf, + bytes32[] memory proof, + bytes32 leftSibling, + bytes32 rightSibling + ) internal pure returns (bool) { + // For non-existence proofs, we verify that the leaf would be between leftSibling and rightSibling + // and that the proof path shows the leaf doesn't exist + require(leftSibling < leaf && leaf < rightSibling, "MerkleProofVerifier: invalid sibling order"); + + // Verify the proof path + return verify(proof, root, leaf); + } + + /** + * @notice Verify a Merkle proof + * @param proof Array of proof elements + * @param root Merkle root + * @param leaf Leaf hash + * @return True if proof is valid + */ + function verify( + bytes32[] memory proof, + bytes32 root, + bytes32 leaf + ) internal pure returns (bool) { + bytes32 computedHash = leaf; + + for (uint256 i = 0; i < proof.length; i++) { + bytes32 proofElement = proof[i]; + + if (computedHash < proofElement) { + // Hash(current computed hash + current element of the proof) + computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); + } else { + // Hash(current element of the proof + current computed hash) + computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); + } + } + + // Check if the computed hash (root) is equal to the provided root + return computedHash == root; + } + + /** + * @notice Hash deposit data for Merkle tree leaf + * @param depositId Deposit ID + * @param asset Asset address + * @param amount Deposit amount + * @param recipient Recipient address + * @param timestamp Deposit timestamp + * @return Leaf hash + */ + function hashDepositData( + uint256 depositId, + address asset, + uint256 amount, + address recipient, + uint256 timestamp + ) internal pure returns (bytes32) { + return keccak256( + abi.encodePacked( + depositId, + asset, + amount, + recipient, + timestamp + ) + ); + } + + /** + * @notice Verify state root against block header + * @param blockHeader Block header bytes + * @param stateRoot State root to verify + * @return True if state root matches block header + * @dev This is a placeholder - in production, implement full block header parsing + */ + function verifyStateRoot( + bytes memory blockHeader, + bytes32 stateRoot + ) internal pure returns (bool) { + // Placeholder: In production, parse RLP-encoded block header and extract state root + // For now, require non-empty block header + require(blockHeader.length > 0, "MerkleProofVerifier: empty block header"); + + // TODO: Implement RLP decoding and state root extraction + // This would involve: + // 1. RLP decode block header + // 2. Extract state root (at specific position in header) + // 3. Compare with provided state root + + return true; // Placeholder - always return true for now + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/ccip-integration/CCIPLogger.sol b/verification-sources/chain138-buildinfo-7678218/contracts/ccip-integration/CCIPLogger.sol new file mode 100644 index 0000000..488dd4d --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/ccip-integration/CCIPLogger.sol @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../ccip/IRouterClient.sol"; + +/** + * @title CCIPLogger + * @notice Receives and logs Chain-138 transactions via Chainlink CCIP + * @dev Implements replay protection via batch ID tracking; optional authorized signer for future use + */ +contract CCIPLogger { + IRouterClient public immutable router; + address public authorizedSigner; + uint64 public expectedSourceChainSelector; + address public owner; + + mapping(bytes32 => bool) public processedBatches; + + event RemoteBatchLogged( + bytes32 indexed messageId, + bytes32 indexed batchId, + uint64 sourceChainSelector, + address sender, + bytes32[] txHashes, + address[] froms, + address[] tos, + uint256[] values + ); + event AuthorizedSignerUpdated(address oldSigner, address newSigner); + event SourceChainSelectorUpdated(uint64 oldSelector, uint64 newSelector); + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + modifier onlyRouter() { + require(msg.sender == address(router), "CCIPLogger: only router"); + _; + } + + modifier onlyOwner() { + require(msg.sender == owner, "CCIPLogger: only owner"); + _; + } + + constructor( + address _router, + address _authorizedSigner, + uint64 _expectedSourceChainSelector + ) { + require(_router != address(0), "CCIPLogger: zero router"); + router = IRouterClient(_router); + authorizedSigner = _authorizedSigner; + expectedSourceChainSelector = _expectedSourceChainSelector; + owner = msg.sender; + } + + /** + * @notice Handle CCIP message (called by CCIP Router) + * @param message The received CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRouter { + require( + message.sourceChainSelector == expectedSourceChainSelector, + "CCIPLogger: invalid source chain" + ); + + ( + bytes32 batchId, + bytes32[] memory txHashes, + address[] memory froms, + address[] memory tos, + uint256[] memory values, + bytes memory _extra + ) = abi.decode( + message.data, + (bytes32, bytes32[], address[], address[], uint256[], bytes) + ); + + require(!processedBatches[batchId], "CCIPLogger: batch already processed"); + processedBatches[batchId] = true; + + address sender = message.sender.length >= 20 + ? address(bytes20(message.sender)) + : address(0); + if (message.sender.length == 32) { + sender = address(bytes20(message.sender)); + } + + emit RemoteBatchLogged( + message.messageId, + batchId, + message.sourceChainSelector, + sender, + txHashes, + froms, + tos, + values + ); + } + + function getRouter() external view returns (address) { + return address(router); + } + + function setAuthorizedSigner(address _signer) external onlyOwner { + address old = authorizedSigner; + authorizedSigner = _signer; + emit AuthorizedSignerUpdated(old, _signer); + } + + function setExpectedSourceChainSelector(uint64 _selector) external onlyOwner { + uint64 old = expectedSourceChainSelector; + expectedSourceChainSelector = _selector; + emit SourceChainSelectorUpdated(old, _selector); + } + + function transferOwnership(address newOwner) external onlyOwner { + require(newOwner != address(0), "CCIPLogger: zero address"); + emit OwnershipTransferred(owner, newOwner); + owner = newOwner; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/ccip-integration/CCIPTxReporter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/ccip-integration/CCIPTxReporter.sol new file mode 100644 index 0000000..81e8c81 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/ccip-integration/CCIPTxReporter.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../ccip/IRouterClient.sol"; + +/** + * @title CCIPTxReporter + * @notice Sends Chain-138 transaction reports to Ethereum Mainnet via Chainlink CCIP + * @dev Encodes batch data for CCIPLogger.ccipReceive + */ +contract CCIPTxReporter { + IRouterClient public immutable router; + uint64 public destChainSelector; + address public destReceiver; + address public owner; + + event SingleTxReported(bytes32 indexed txHash, address from, address to, uint256 value); + event BatchReported(bytes32 indexed batchId, uint256 count); + + modifier onlyOwner() { + require(msg.sender == owner, "CCIPTxReporter: only owner"); + _; + } + + constructor( + address _router, + uint64 _destChainSelector, + address _destReceiver + ) { + require(_router != address(0), "CCIPTxReporter: zero router"); + require(_destReceiver != address(0), "CCIPTxReporter: zero receiver"); + router = IRouterClient(payable(_router)); + destChainSelector = _destChainSelector; + destReceiver = _destReceiver; + owner = msg.sender; + } + + /** + * @notice Report a single transaction to the CCIPLogger on destination chain + */ + function reportTx( + bytes32 txHash, + address from, + address to, + uint256 value, + bytes calldata extraData + ) external payable returns (bytes32 messageId) { + bytes32[] memory txHashes = new bytes32[](1); + address[] memory froms = new address[](1); + address[] memory tos = new address[](1); + uint256[] memory values = new uint256[](1); + txHashes[0] = txHash; + froms[0] = from; + tos[0] = to; + values[0] = value; + messageId = _reportBatch(txHash, txHashes, froms, tos, values, extraData); + emit SingleTxReported(txHash, from, to, value); + } + + /** + * @notice Report a batch of transactions to the CCIPLogger on destination chain + */ + function reportBatch( + bytes32 batchId, + bytes32[] calldata txHashes, + address[] calldata froms, + address[] calldata tos, + uint256[] calldata values, + bytes calldata extraData + ) external payable returns (bytes32 messageId) { + messageId = _reportBatch(batchId, txHashes, froms, tos, values, extraData); + emit BatchReported(batchId, txHashes.length); + } + + function _reportBatch( + bytes32 batchId, + bytes32[] memory txHashes, + address[] memory froms, + address[] memory tos, + uint256[] memory values, + bytes memory extraData + ) internal returns (bytes32 messageId) { + bytes memory data = abi.encode( + batchId, + txHashes, + froms, + tos, + values, + extraData + ); + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(destReceiver), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: address(0), + extraArgs: "" + }); + (messageId, ) = router.ccipSend{value: msg.value}(destChainSelector, message); + } + + /** + * @notice Estimate fee for sending a batch + */ + function estimateFee( + bytes32[] calldata txHashes, + address[] calldata froms, + address[] calldata tos, + uint256[] calldata values + ) external view returns (uint256 fee) { + bytes32 batchId = keccak256(abi.encodePacked(block.timestamp, block.prevrandao, txHashes.length)); + bytes memory data = abi.encode( + batchId, + txHashes, + froms, + tos, + values, + bytes("") + ); + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(destReceiver), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: address(0), + extraArgs: "" + }); + return router.getFee(destChainSelector, message); + } + + function setDestReceiver(address _destReceiver) external onlyOwner { + require(_destReceiver != address(0), "CCIPTxReporter: zero address"); + destReceiver = _destReceiver; + } + + function transferOwnership(address newOwner) external onlyOwner { + require(newOwner != address(0), "CCIPTxReporter: zero address"); + owner = newOwner; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPMessageValidator.sol b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPMessageValidator.sol new file mode 100644 index 0000000..c32c9c6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPMessageValidator.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; + +/** + * @title CCIP Message Validator + * @notice Validates CCIP messages for replay protection and format + * @dev Provides message validation utilities + */ +library CCIPMessageValidator { + // Message nonce tracking per source chain + struct MessageNonce { + uint256 nonce; + bool used; + } + + /** + * @notice Validate message format + * @param message The CCIP message to validate + * @return valid True if message format is valid + */ + function validateMessageFormat( + IRouterClient.Any2EVMMessage memory message + ) internal pure returns (bool valid) { + // Check message ID is not zero + if (message.messageId == bytes32(0)) { + return false; + } + + // Check source chain selector is valid + if (message.sourceChainSelector == 0) { + return false; + } + + // Check sender is not empty + if (message.sender.length == 0) { + return false; + } + + // Check data is not empty + if (message.data.length == 0) { + return false; + } + + return true; + } + + /** + * @notice Validate oracle data format + * @param data The encoded oracle data + * @return valid True if data format is valid + * @return answer Decoded answer + * @return roundId Decoded round ID + * @return timestamp Decoded timestamp + */ + function validateOracleData( + bytes memory data + ) internal view returns ( + bool valid, + uint256 answer, + uint256 roundId, + uint256 timestamp + ) { + // Check minimum data length (3 uint256 = 96 bytes) + if (data.length < 96) { + return (false, 0, 0, 0); + } + + // Decode oracle data directly (no need for try-catch in library) + (uint256 _answer, uint256 _roundId, uint256 _timestamp) = abi.decode(data, (uint256, uint256, uint256)); + + // Validate answer is not zero + if (_answer == 0) { + return (false, 0, 0, 0); + } + + // Validate timestamp is reasonable (not too far in future/past) + // Note: Using uint256 to avoid underflow + uint256 currentTime = block.timestamp; + if (_timestamp > currentTime + 300) { + return (false, 0, 0, 0); + } + if (currentTime > _timestamp && currentTime - _timestamp > 3600) { + return (false, 0, 0, 0); + } + + return (true, _answer, _roundId, _timestamp); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPReceiver.sol b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPReceiver.sol new file mode 100644 index 0000000..b957b30 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPReceiver.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "./CCIPMessageValidator.sol"; +import "../oracle/IAggregator.sol"; + +// Note: This contract must be added as a transmitter to the oracle aggregator +// to be able to update oracle answers. The aggregator's updateAnswer function +// requires the caller to be a transmitter. + +/** + * @title CCIP Receiver with Oracle Integration + * @notice Receives CCIP messages and updates oracle aggregator + * @dev Implements CCIP message receiving and oracle update logic with validation + */ +contract CCIPReceiver { + using CCIPMessageValidator for IRouterClient.Any2EVMMessage; + + IRouterClient public immutable router; + address public oracleAggregator; + address public admin; + + mapping(bytes32 => bool) public processedMessages; + mapping(uint64 => uint256) public lastNonce; // Track nonces per source chain + + event MessageReceived( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + bytes data + ); + event OracleUpdated(uint256 answer, uint256 roundId); + event OracleAggregatorUpdated(address oldAggregator, address newAggregator); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPReceiver: only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(router), "CCIPReceiver: only router"); + _; + } + + constructor(address _router, address _oracleAggregator) { + require(_router != address(0), "CCIPReceiver: zero router address"); + require(_oracleAggregator != address(0), "CCIPReceiver: zero aggregator address"); + + router = IRouterClient(_router); + oracleAggregator = _oracleAggregator; + admin = msg.sender; + } + + /** + * @notice Handle CCIP message (called by CCIP Router) + * @param message The received CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRouter { + // Replay protection: check if message already processed + require(!processedMessages[message.messageId], "CCIPReceiver: message already processed"); + + // Validate message format + require( + CCIPMessageValidator.validateMessageFormat(message), + "CCIPReceiver: invalid message format" + ); + + // Validate oracle data format + ( + bool valid, + uint256 answer, + uint256 roundId, + uint256 timestamp + ) = CCIPMessageValidator.validateOracleData(message.data); + + require(valid, "CCIPReceiver: invalid oracle data"); + + // Mark message as processed (replay protection) + processedMessages[message.messageId] = true; + + // Update last nonce for source chain (additional replay protection) + lastNonce[message.sourceChainSelector] = roundId; + + // Update oracle aggregator + // Note: The aggregator's updateAnswer function can be called directly + // The aggregator will handle access control (onlyTransmitter) + // We need to ensure this receiver is added as a transmitter + try IAggregator(oracleAggregator).updateAnswer(answer) { + address sender = abi.decode(message.sender, (address)); + emit MessageReceived(message.messageId, message.sourceChainSelector, sender, message.data); + emit OracleUpdated(answer, roundId); + } catch { + // If update fails, emit error event + // In production, consider adding error tracking + address sender = abi.decode(message.sender, (address)); + emit MessageReceived(message.messageId, message.sourceChainSelector, sender, message.data); + // Don't emit OracleUpdated if update failed + } + } + + /** + * @notice Update oracle aggregator address + */ + function updateOracleAggregator(address newAggregator) external onlyAdmin { + require(newAggregator != address(0), "CCIPReceiver: zero address"); + + address oldAggregator = oracleAggregator; + oracleAggregator = newAggregator; + + emit OracleAggregatorUpdated(oldAggregator, newAggregator); + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPReceiver: zero address"); + admin = newAdmin; + } + + /** + * @notice Check if message has been processed + */ + function isMessageProcessed(bytes32 messageId) external view returns (bool) { + return processedMessages[messageId]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPRouter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPRouter.sol new file mode 100644 index 0000000..fb2c845 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPRouter.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title CCIP Router Implementation + * @notice Full Chainlink CCIP Router interface implementation + * @dev Implements message sending, fee calculation, and message validation + */ +contract CCIPRouter is IRouterClient { + using SafeERC20 for IERC20; + + // Fee token (LINK token address) + address public immutable feeToken; + + // Message tracking + mapping(bytes32 => bool) public sentMessages; + mapping(bytes32 => bool) public receivedMessages; + + // Chain selectors + mapping(uint64 => bool) public supportedChains; + mapping(uint64 => address[]) public supportedTokens; + + // Fee configuration + uint256 public baseFee; // Base fee in feeToken units + uint256 public dataFeePerByte; // Fee per byte of data + + address public admin; + + // Events are inherited from IRouterClient interface + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPRouter: only admin"); + _; + } + + constructor(address _feeToken, uint256 _baseFee, uint256 _dataFeePerByte) { + // Allow zero address for native token fees (ETH) + // If feeToken is zero, fees are paid in native token (msg.value) + feeToken = _feeToken; + baseFee = _baseFee; + dataFeePerByte = _dataFeePerByte; + admin = msg.sender; + } + + /** + * @notice Send a message to a destination chain + * @param destinationChainSelector The chain selector of the destination chain + * @param message The message to send + * @return messageId The ID of the sent message + * @return fees The fees required for the message + */ + function ccipSend( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) external payable returns (bytes32 messageId, uint256 fees) { + require(supportedChains[destinationChainSelector], "CCIPRouter: chain not supported"); + require(message.receiver.length > 0, "CCIPRouter: empty receiver"); + + // Calculate fee + fees = getFee(destinationChainSelector, message); + + // Collect fee + if (fees > 0) { + if (feeToken == address(0)) { + // Native token (ETH) fees + require(msg.value >= fees, "CCIPRouter: insufficient native token fee"); + } else { + // ERC20 token fees + IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fees); + } + } + + // Generate message ID + messageId = keccak256(abi.encodePacked( + block.chainid, + destinationChainSelector, + msg.sender, + message.receiver, + message.data, + block.timestamp, + block.number + )); + + require(!sentMessages[messageId], "CCIPRouter: duplicate message"); + sentMessages[messageId] = true; + + emit MessageSent( + messageId, + destinationChainSelector, + msg.sender, + message.receiver, + message.data, + message.tokenAmounts, + message.feeToken, + message.extraArgs + ); + + return (messageId, fees); + } + + /** + * @notice Get the fee for sending a message + * @param destinationChainSelector The chain selector of the destination chain + * @param message The message to send + * @return fee The fee required for the message + */ + function getFee( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) public view returns (uint256 fee) { + require(supportedChains[destinationChainSelector], "CCIPRouter: chain not supported"); + + // Base fee + fee = baseFee; + + // Data fee (per byte) + fee += message.data.length * dataFeePerByte; + + // Token transfer fees + for (uint256 i = 0; i < message.tokenAmounts.length; i++) { + fee += message.tokenAmounts[i].amount / 1000; // 0.1% of token amount + } + + return fee; + } + + /** + * @notice Get supported tokens for a destination chain + * @param destinationChainSelector The chain selector of the destination chain + * @return tokens The list of supported tokens + */ + function getSupportedTokens( + uint64 destinationChainSelector + ) external view returns (address[] memory tokens) { + return supportedTokens[destinationChainSelector]; + } + + /** + * @notice Add supported chain + */ + function addSupportedChain(uint64 chainSelector) external onlyAdmin { + supportedChains[chainSelector] = true; + } + + /** + * @notice Remove supported chain + */ + function removeSupportedChain(uint64 chainSelector) external onlyAdmin { + supportedChains[chainSelector] = false; + } + + /** + * @notice Add supported token for a chain + */ + function addSupportedToken(uint64 chainSelector, address token) external onlyAdmin { + require(token != address(0), "CCIPRouter: zero token"); + address[] storage tokens = supportedTokens[chainSelector]; + for (uint256 i = 0; i < tokens.length; i++) { + require(tokens[i] != token, "CCIPRouter: token already supported"); + } + tokens.push(token); + } + + /** + * @notice Update fee configuration + */ + function updateFees(uint256 _baseFee, uint256 _dataFeePerByte) external onlyAdmin { + baseFee = _baseFee; + dataFeePerByte = _dataFeePerByte; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPRouter: zero address"); + admin = newAdmin; + } + + /** + * @notice Withdraw collected fees + */ + function withdrawFees(uint256 amount) external onlyAdmin { + if (feeToken == address(0)) { + // Native token (ETH) fees + payable(admin).transfer(amount); + } else { + // ERC20 token fees + IERC20(feeToken).safeTransfer(admin, amount); + } + } + + /** + * @notice Withdraw all native token (ETH) fees + */ + function withdrawNativeFees() external onlyAdmin { + require(feeToken == address(0), "CCIPRouter: not native token"); + payable(admin).transfer(address(this).balance); + } + + /** + * @notice Receive native token (ETH) + */ + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPRouterOptimized.sol b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPRouterOptimized.sol new file mode 100644 index 0000000..f8100d1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPRouterOptimized.sol @@ -0,0 +1,218 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title Optimized CCIP Router + * @notice Optimized version with message batching and fee caching + * @dev Performance optimizations for CCIP message handling + */ +contract CCIPRouterOptimized is IRouterClient { + using SafeERC20 for IERC20; + + address public admin; + uint256 public baseFee = 1 ether; + uint256 public dataFeePerByte = 1000; + uint256 public tokenFeePerToken = 1 ether; + + mapping(uint64 => address[]) public supportedTokens; + + // Fee caching + mapping(bytes32 => uint256) public cachedFees; + uint256 public cacheExpiry = 1 hours; + mapping(bytes32 => uint256) public cacheTimestamp; + + // Message batching + struct BatchedMessage { + bytes32[] messageIds; + uint64 destinationChainSelector; + uint256 totalFee; + uint256 timestamp; + } + + mapping(uint256 => BatchedMessage) public batches; + uint256 public batchId; + uint256 public batchWindow = 5 minutes; + uint256 public maxBatchSize = 100; + + event RouterAdminChanged(address indexed oldAdmin, address indexed newAdmin); + event BaseFeeUpdated(uint256 oldFee, uint256 newFee); + event MessageBatched(uint256 indexed batchId, uint256 messageCount); + event FeeCached(bytes32 indexed cacheKey, uint256 fee); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPRouterOptimized: only admin"); + _; + } + + constructor() { + admin = msg.sender; + } + + /** + * @inheritdoc IRouterClient + */ + function ccipSend( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) external payable returns (bytes32 messageId, uint256 fees) { + fees = getFee(destinationChainSelector, message); + + // Handle fee payment + if (fees > 0) { + if (message.feeToken == address(0)) { + // Native token (ETH) fees + require(msg.value >= fees, "CCIPRouterOptimized: insufficient native token fee"); + } else { + // ERC20 token fees + IERC20(message.feeToken).safeTransferFrom(msg.sender, address(this), fees); + } + } + + messageId = keccak256(abi.encodePacked(block.timestamp, block.number, message.data)); + + emit MessageSent( + messageId, + destinationChainSelector, + msg.sender, + message.receiver, + message.data, + message.tokenAmounts, + message.feeToken, + message.extraArgs + ); + return (messageId, fees); + } + + /** + * @inheritdoc IRouterClient + */ + function getFee( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) public view override returns (uint256 fee) { + // Check cache + bytes32 cacheKey = keccak256(abi.encode(destinationChainSelector, message.receiver, message.data.length)); + if (cacheTimestamp[cacheKey] != 0 && block.timestamp < cacheTimestamp[cacheKey] + cacheExpiry) { + return cachedFees[cacheKey]; + } + + // Calculate fee + fee = baseFee; + fee += uint256(message.data.length) * dataFeePerByte; + + for (uint256 i = 0; i < message.tokenAmounts.length; i++) { + fee += message.tokenAmounts[i].amount * tokenFeePerToken; + } + + return fee; + } + + /** + * @notice Batch multiple messages + */ + function batchSend( + uint64 destinationChainSelector, + EVM2AnyMessage[] memory messages + ) external payable returns (uint256 batchId_, bytes32[] memory messageIds) { + require(messages.length <= maxBatchSize, "CCIPRouterOptimized: batch too large"); + + batchId_ = batchId++; + messageIds = new bytes32[](messages.length); + uint256 totalFee = 0; + + for (uint256 i = 0; i < messages.length; i++) { + uint256 fee = getFee(destinationChainSelector, messages[i]); + totalFee += fee; + + bytes32 messageId = keccak256(abi.encodePacked(block.timestamp, block.number, i, messages[i].data)); + messageIds[i] = messageId; + } + + require(msg.value >= totalFee, "CCIPRouterOptimized: insufficient fee"); + + batches[batchId_] = BatchedMessage({ + messageIds: messageIds, + destinationChainSelector: destinationChainSelector, + totalFee: totalFee, + timestamp: block.timestamp + }); + + emit MessageBatched(batchId_, messages.length); + return (batchId_, messageIds); + } + + /** + * @notice Cache fee calculation + */ + function cacheFee( + uint64 destinationChainSelector, + bytes memory receiver, + uint256 dataLength + ) external returns (uint256 fee) { + bytes32 cacheKey = keccak256(abi.encode(destinationChainSelector, receiver, dataLength)); + + // Calculate fee + fee = baseFee + (dataLength * dataFeePerByte); + + // Cache it + cachedFees[cacheKey] = fee; + cacheTimestamp[cacheKey] = block.timestamp; + + emit FeeCached(cacheKey, fee); + return fee; + } + + /** + * @inheritdoc IRouterClient + */ + function getSupportedTokens( + uint64 destinationChainSelector + ) external view override returns (address[] memory) { + return supportedTokens[destinationChainSelector]; + } + + /** + * @notice Update base fee + */ + function updateBaseFee(uint256 newFee) external onlyAdmin { + require(newFee > 0, "CCIPRouterOptimized: fee must be greater than 0"); + emit BaseFeeUpdated(baseFee, newFee); + baseFee = newFee; + } + + /** + * @notice Update cache expiry + */ + function setCacheExpiry(uint256 newExpiry) external onlyAdmin { + cacheExpiry = newExpiry; + } + + /** + * @notice Update batch window + */ + function setBatchWindow(uint256 newWindow) external onlyAdmin { + batchWindow = newWindow; + } + + /** + * @notice Update max batch size + */ + function setMaxBatchSize(uint256 newSize) external onlyAdmin { + require(newSize > 0, "CCIPRouterOptimized: size must be greater than 0"); + maxBatchSize = newSize; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPRouterOptimized: zero address"); + emit RouterAdminChanged(admin, newAdmin); + admin = newAdmin; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPSender.sol b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPSender.sol new file mode 100644 index 0000000..302c9a1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPSender.sol @@ -0,0 +1,221 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title CCIP Sender + * @notice Chainlink CCIP sender for cross-chain oracle data transmission + * @dev Sends oracle updates to other chains via CCIP + */ +contract CCIPSender { + using SafeERC20 for IERC20; + + IRouterClient public immutable ccipRouter; + address public oracleAggregator; + address public admin; + address public feeToken; // LINK token address + + // Destination chain configurations + struct DestinationChain { + uint64 chainSelector; + address receiver; + bool enabled; + } + + mapping(uint64 => DestinationChain) public destinations; + uint64[] public destinationChains; + + event MessageSent( + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + bytes data + ); + event DestinationAdded(uint64 chainSelector, address receiver); + event DestinationRemoved(uint64 chainSelector); + event DestinationUpdated(uint64 chainSelector, address receiver); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPSender: only admin"); + _; + } + + modifier onlyAggregator() { + require(msg.sender == oracleAggregator, "CCIPSender: only aggregator"); + _; + } + + constructor(address _ccipRouter, address _oracleAggregator, address _feeToken) { + require(_ccipRouter != address(0), "CCIPSender: zero router"); + // Allow zero address for native token fees (ETH) + // If feeToken is zero, fees are paid in native token (msg.value) + ccipRouter = IRouterClient(_ccipRouter); + oracleAggregator = _oracleAggregator; + feeToken = _feeToken; + admin = msg.sender; + } + + /** + * @notice Send oracle update to destination chain + * @dev Implements full CCIP interface with fee payment + */ + function sendOracleUpdate( + uint64 destinationChainSelector, + uint256 answer, + uint256 roundId, + uint256 timestamp + ) external payable onlyAggregator returns (bytes32 messageId) { + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPSender: destination not enabled"); + + // Encode oracle data (answer, roundId, timestamp) + bytes memory data = abi.encode(answer, roundId, timestamp); + + // Prepare CCIP message + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiver), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: feeToken, + extraArgs: "" + }); + + // Calculate fee + uint256 fee = ccipRouter.getFee(destinationChainSelector, message); + + // Approve and pay fee + if (fee > 0) { + if (feeToken == address(0)) { + // Native token (ETH) fees - require msg.value + require(msg.value >= fee, "CCIPSender: insufficient native token fee"); + } else { + // ERC20 token fees + IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); + // Use safeIncreaseAllowance instead of deprecated safeApprove + SafeERC20.safeIncreaseAllowance(IERC20(feeToken), address(ccipRouter), fee); + } + } + + // Send via CCIP + if (feeToken == address(0)) { + // Native token fees - send with msg.value + (messageId, ) = ccipRouter.ccipSend{value: fee}(destinationChainSelector, message); + } else { + // ERC20 token fees + (messageId, ) = ccipRouter.ccipSend(destinationChainSelector, message); + } + + emit MessageSent(messageId, destinationChainSelector, dest.receiver, data); + return messageId; + } + + /** + * @notice Calculate fee for sending oracle update + */ + function calculateFee( + uint64 destinationChainSelector, + bytes memory data + ) external view returns (uint256) { + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPSender: destination not enabled"); + + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiver), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](0), + feeToken: feeToken, + extraArgs: "" + }); + + return ccipRouter.getFee(destinationChainSelector, message); + } + + /** + * @notice Add destination chain + */ + function addDestination( + uint64 chainSelector, + address receiver + ) external onlyAdmin { + require(receiver != address(0), "CCIPSender: zero address"); + require(!destinations[chainSelector].enabled, "CCIPSender: destination already exists"); + + destinations[chainSelector] = DestinationChain({ + chainSelector: chainSelector, + receiver: receiver, + enabled: true + }); + destinationChains.push(chainSelector); + + emit DestinationAdded(chainSelector, receiver); + } + + /** + * @notice Remove destination chain + */ + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPSender: destination not found"); + destinations[chainSelector].enabled = false; + + // Remove from array + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + + emit DestinationRemoved(chainSelector); + } + + /** + * @notice Update destination receiver + */ + function updateDestination( + uint64 chainSelector, + address receiver + ) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPSender: destination not found"); + require(receiver != address(0), "CCIPSender: zero address"); + + destinations[chainSelector].receiver = receiver; + emit DestinationUpdated(chainSelector, receiver); + } + + /** + * @notice Update fee token + * @dev Allows zero address for native token fees (ETH) + */ + function updateFeeToken(address newFeeToken) external onlyAdmin { + // Allow zero address for native token fees + feeToken = newFeeToken; + } + + /** + * @notice Update oracle aggregator + */ + function updateOracleAggregator(address newAggregator) external onlyAdmin { + require(newAggregator != address(0), "CCIPSender: zero address"); + oracleAggregator = newAggregator; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPSender: zero address"); + admin = newAdmin; + } + + /** + * @notice Get destination chains + */ + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPWETH10Bridge.sol b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPWETH10Bridge.sol new file mode 100644 index 0000000..6c68f31 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPWETH10Bridge.sol @@ -0,0 +1,301 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title CCIP WETH10 Bridge + * @notice Cross-chain WETH10 transfer bridge using Chainlink CCIP + * @dev Enables users to send WETH10 tokens across chains via CCIP + */ +contract CCIPWETH10Bridge { + + IRouterClient public immutable ccipRouter; + address public immutable weth10; // WETH10 contract address + address public feeToken; // LINK token address + address public admin; + + // Destination chain configurations + struct DestinationChain { + uint64 chainSelector; + address receiverBridge; // Address of corresponding bridge on destination chain + bool enabled; + } + + mapping(uint64 => DestinationChain) public destinations; + uint64[] public destinationChains; + + // Track cross-chain transfers for replay protection + mapping(bytes32 => bool) public processedTransfers; + mapping(address => uint256) public nonces; + + event CrossChainTransferInitiated( + bytes32 indexed messageId, + address indexed sender, + uint64 indexed destinationChainSelector, + address recipient, + uint256 amount, + uint256 nonce + ); + + event CrossChainTransferCompleted( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed recipient, + uint256 amount + ); + + event DestinationAdded(uint64 chainSelector, address receiverBridge); + event DestinationRemoved(uint64 chainSelector); + event DestinationUpdated(uint64 chainSelector, address receiverBridge); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPWETH10Bridge: only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(ccipRouter), "CCIPWETH10Bridge: only router"); + _; + } + + constructor(address _ccipRouter, address _weth10, address _feeToken) { + require(_ccipRouter != address(0), "CCIPWETH10Bridge: zero router"); + require(_weth10 != address(0), "CCIPWETH10Bridge: zero WETH10"); + require(_feeToken != address(0), "CCIPWETH10Bridge: zero fee token"); + + ccipRouter = IRouterClient(_ccipRouter); + weth10 = _weth10; + feeToken = _feeToken; + admin = msg.sender; + } + + /** + * @notice Send WETH10 tokens to another chain via CCIP + * @param destinationChainSelector The chain selector of the destination chain + * @param recipient The recipient address on the destination chain + * @param amount The amount of WETH10 to send + * @return messageId The CCIP message ID + */ + function sendCrossChain( + uint64 destinationChainSelector, + address recipient, + uint256 amount + ) external returns (bytes32 messageId) { + require(amount > 0, "CCIPWETH10Bridge: invalid amount"); + require(recipient != address(0), "CCIPWETH10Bridge: zero recipient"); + + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH10Bridge: destination not enabled"); + + // Transfer WETH10 from user + require(IERC20(weth10).transferFrom(msg.sender, address(this), amount), "CCIPWETH10Bridge: transfer failed"); + + // Increment nonce for replay protection + nonces[msg.sender]++; + uint256 currentNonce = nonces[msg.sender]; + + // Encode transfer data (recipient, amount, sender, nonce) + bytes memory data = abi.encode( + recipient, + amount, + msg.sender, + currentNonce + ); + + // Prepare CCIP message with WETH10 tokens + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + // Set token amount (WETH10) + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth10, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + // Calculate fee + uint256 fee = ccipRouter.getFee(destinationChainSelector, message); + + // Approve and pay fee + if (fee > 0) { + require(IERC20(feeToken).transferFrom(msg.sender, address(this), fee), "CCIPWETH10Bridge: fee transfer failed"); + require(IERC20(feeToken).approve(address(ccipRouter), fee), "CCIPWETH10Bridge: fee approval failed"); + } + + // Send via CCIP + (messageId, ) = ccipRouter.ccipSend(destinationChainSelector, message); + + emit CrossChainTransferInitiated( + messageId, + msg.sender, + destinationChainSelector, + recipient, + amount, + currentNonce + ); + + return messageId; + } + + /** + * @notice Receive WETH10 tokens from another chain via CCIP + * @param message The CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRouter { + // Replay protection: check if message already processed + require(!processedTransfers[message.messageId], "CCIPWETH10Bridge: transfer already processed"); + + // Mark as processed + processedTransfers[message.messageId] = true; + + // Validate token amounts + require(message.tokenAmounts.length > 0, "CCIPWETH10Bridge: no tokens"); + require(message.tokenAmounts[0].token == weth10, "CCIPWETH10Bridge: invalid token"); + + uint256 amount = message.tokenAmounts[0].amount; + require(amount > 0, "CCIPWETH10Bridge: invalid amount"); + + // Decode transfer data (recipient, amount, sender, nonce) + (address recipient, , , ) = abi.decode( + message.data, + (address, uint256, address, uint256) + ); + + require(recipient != address(0), "CCIPWETH10Bridge: zero recipient"); + + // Transfer WETH10 to recipient + require(IERC20(weth10).transfer(recipient, amount), "CCIPWETH10Bridge: transfer failed"); + + emit CrossChainTransferCompleted( + message.messageId, + message.sourceChainSelector, + recipient, + amount + ); + } + + /** + * @notice Calculate fee for cross-chain transfer + * @param destinationChainSelector The chain selector of the destination chain + * @param amount The amount of WETH10 to send + * @return fee The fee required for the transfer + */ + function calculateFee( + uint64 destinationChainSelector, + uint256 amount + ) external view returns (uint256 fee) { + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH10Bridge: destination not enabled"); + + bytes memory data = abi.encode(address(0), amount, address(0), 0); + + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth10, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + return ccipRouter.getFee(destinationChainSelector, message); + } + + /** + * @notice Add destination chain + */ + function addDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(receiverBridge != address(0), "CCIPWETH10Bridge: zero address"); + require(!destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination already exists"); + + destinations[chainSelector] = DestinationChain({ + chainSelector: chainSelector, + receiverBridge: receiverBridge, + enabled: true + }); + destinationChains.push(chainSelector); + + emit DestinationAdded(chainSelector, receiverBridge); + } + + /** + * @notice Remove destination chain + */ + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination not found"); + destinations[chainSelector].enabled = false; + + // Remove from array + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + + emit DestinationRemoved(chainSelector); + } + + /** + * @notice Update destination receiver bridge + */ + function updateDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination not found"); + require(receiverBridge != address(0), "CCIPWETH10Bridge: zero address"); + + destinations[chainSelector].receiverBridge = receiverBridge; + emit DestinationUpdated(chainSelector, receiverBridge); + } + + /** + * @notice Update fee token + */ + function updateFeeToken(address newFeeToken) external onlyAdmin { + require(newFeeToken != address(0), "CCIPWETH10Bridge: zero address"); + feeToken = newFeeToken; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPWETH10Bridge: zero address"); + admin = newAdmin; + } + + /** + * @notice Get destination chains + */ + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } + + /** + * @notice Get user nonce + */ + function getUserNonce(address user) external view returns (uint256) { + return nonces[user]; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPWETH9Bridge.sol b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPWETH9Bridge.sol new file mode 100644 index 0000000..4e01b3b --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/CCIPWETH9Bridge.sol @@ -0,0 +1,309 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title CCIP WETH9 Bridge + * @notice Cross-chain WETH9 transfer bridge using Chainlink CCIP + * @dev Enables users to send WETH9 tokens across chains via CCIP + */ +contract CCIPWETH9Bridge { + + IRouterClient public immutable ccipRouter; + address public immutable weth9; // WETH9 contract address + address public feeToken; // LINK token address + address public admin; + + // Destination chain configurations + struct DestinationChain { + uint64 chainSelector; + address receiverBridge; // Address of corresponding bridge on destination chain + bool enabled; + } + + mapping(uint64 => DestinationChain) public destinations; + uint64[] public destinationChains; + + // Track cross-chain transfers for replay protection + mapping(bytes32 => bool) public processedTransfers; + mapping(address => uint256) public nonces; + + event CrossChainTransferInitiated( + bytes32 indexed messageId, + address indexed sender, + uint64 indexed destinationChainSelector, + address recipient, + uint256 amount, + uint256 nonce + ); + + event CrossChainTransferCompleted( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed recipient, + uint256 amount + ); + + event DestinationAdded(uint64 chainSelector, address receiverBridge); + event DestinationRemoved(uint64 chainSelector); + event DestinationUpdated(uint64 chainSelector, address receiverBridge); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPWETH9Bridge: only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(ccipRouter), "CCIPWETH9Bridge: only router"); + _; + } + + constructor(address _ccipRouter, address _weth9, address _feeToken) { + require(_ccipRouter != address(0), "CCIPWETH9Bridge: zero router"); + require(_weth9 != address(0), "CCIPWETH9Bridge: zero WETH9"); + // feeToken may be address(0) to pay fees in native ETH (msg.value) + ccipRouter = IRouterClient(_ccipRouter); + weth9 = _weth9; + feeToken = _feeToken; + admin = msg.sender; + } + + /** + * @notice Send WETH9 tokens to another chain via CCIP + * @param destinationChainSelector The chain selector of the destination chain + * @param recipient The recipient address on the destination chain + * @param amount The amount of WETH9 to send + * @return messageId The CCIP message ID + */ + function sendCrossChain( + uint64 destinationChainSelector, + address recipient, + uint256 amount + ) external payable returns (bytes32 messageId) { + require(amount > 0, "CCIPWETH9Bridge: invalid amount"); + require(recipient != address(0), "CCIPWETH9Bridge: zero recipient"); + + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH9Bridge: destination not enabled"); + + // Transfer WETH9 from user + require(IERC20(weth9).transferFrom(msg.sender, address(this), amount), "CCIPWETH9Bridge: transfer failed"); + + // Increment nonce for replay protection + nonces[msg.sender]++; + uint256 currentNonce = nonces[msg.sender]; + + // Encode transfer data (recipient, amount, sender, nonce) + bytes memory data = abi.encode( + recipient, + amount, + msg.sender, + currentNonce + ); + + // Prepare CCIP message with WETH9 tokens + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + // Set token amount (WETH9) + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth9, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + // Calculate fee + uint256 fee = ccipRouter.getFee(destinationChainSelector, message); + + // Pay fee: native ETH if feeToken is address(0), else LINK/ERC20 + if (fee > 0) { + if (feeToken == address(0)) { + require(msg.value >= fee, "CCIPWETH9Bridge: insufficient native fee"); + } else { + require(msg.value == 0, "CCIPWETH9Bridge: use native or token fee, not both"); + require(IERC20(feeToken).transferFrom(msg.sender, address(this), fee), "CCIPWETH9Bridge: fee transfer failed"); + require(IERC20(feeToken).approve(address(ccipRouter), fee), "CCIPWETH9Bridge: fee approval failed"); + } + } + + // Send via CCIP (pass value when paying in native) + if (feeToken == address(0) && fee > 0) { + (messageId, ) = ccipRouter.ccipSend{value: fee}(destinationChainSelector, message); + } else { + (messageId, ) = ccipRouter.ccipSend(destinationChainSelector, message); + } + + emit CrossChainTransferInitiated( + messageId, + msg.sender, + destinationChainSelector, + recipient, + amount, + currentNonce + ); + + return messageId; + } + + /** + * @notice Receive WETH9 tokens from another chain via CCIP + * @param message The CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRouter { + // Replay protection: check if message already processed + require(!processedTransfers[message.messageId], "CCIPWETH9Bridge: transfer already processed"); + + // Mark as processed + processedTransfers[message.messageId] = true; + + // Validate token amounts + require(message.tokenAmounts.length > 0, "CCIPWETH9Bridge: no tokens"); + require(message.tokenAmounts[0].token == weth9, "CCIPWETH9Bridge: invalid token"); + + uint256 amount = message.tokenAmounts[0].amount; + require(amount > 0, "CCIPWETH9Bridge: invalid amount"); + + // Decode transfer data (recipient, amount, sender, nonce) + (address recipient, , , ) = abi.decode( + message.data, + (address, uint256, address, uint256) + ); + + require(recipient != address(0), "CCIPWETH9Bridge: zero recipient"); + + // Transfer WETH9 to recipient + require(IERC20(weth9).transfer(recipient, amount), "CCIPWETH9Bridge: transfer failed"); + + emit CrossChainTransferCompleted( + message.messageId, + message.sourceChainSelector, + recipient, + amount + ); + } + + /** + * @notice Calculate fee for cross-chain transfer + * @param destinationChainSelector The chain selector of the destination chain + * @param amount The amount of WETH9 to send + * @return fee The fee required for the transfer + */ + function calculateFee( + uint64 destinationChainSelector, + uint256 amount + ) external view returns (uint256 fee) { + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH9Bridge: destination not enabled"); + + bytes memory data = abi.encode(address(0), amount, address(0), 0); + + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth9, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + return ccipRouter.getFee(destinationChainSelector, message); + } + + /** + * @notice Add destination chain + */ + function addDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(receiverBridge != address(0), "CCIPWETH9Bridge: zero address"); + require(!destinations[chainSelector].enabled, "CCIPWETH9Bridge: destination already exists"); + + destinations[chainSelector] = DestinationChain({ + chainSelector: chainSelector, + receiverBridge: receiverBridge, + enabled: true + }); + destinationChains.push(chainSelector); + + emit DestinationAdded(chainSelector, receiverBridge); + } + + /** + * @notice Remove destination chain + */ + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH9Bridge: destination not found"); + destinations[chainSelector].enabled = false; + + // Remove from array + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + + emit DestinationRemoved(chainSelector); + } + + /** + * @notice Update destination receiver bridge + */ + function updateDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH9Bridge: destination not found"); + require(receiverBridge != address(0), "CCIPWETH9Bridge: zero address"); + + destinations[chainSelector].receiverBridge = receiverBridge; + emit DestinationUpdated(chainSelector, receiverBridge); + } + + /** + * @notice Update fee token + */ + function updateFeeToken(address newFeeToken) external onlyAdmin { + // address(0) = pay fees in native ETH via msg.value + feeToken = newFeeToken; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPWETH9Bridge: zero address"); + admin = newAdmin; + } + + /** + * @notice Get destination chains + */ + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } + + /** + * @notice Get user nonce + */ + function getUserNonce(address user) external view returns (uint256) { + return nonces[user]; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/ccip/IRouterClient.sol b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/IRouterClient.sol new file mode 100644 index 0000000..ae7c127 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/ccip/IRouterClient.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Chainlink CCIP Router Client Interface + * @notice Interface for Chainlink CCIP Router Client + * @dev This interface is based on Chainlink CCIP Router Client specification + */ +interface IRouterClient { + /// @notice Represents the router's fee token + enum TokenAmountType { + Fiat, + Native + } + + /// @notice Represents a token amount and its type + struct TokenAmount { + address token; + uint256 amount; + TokenAmountType amountType; + } + + /// @notice Represents a CCIP message + struct EVM2AnyMessage { + bytes receiver; + bytes data; + TokenAmount[] tokenAmounts; + address feeToken; + bytes extraArgs; + } + + /// @notice Represents a CCIP message with source chain information + struct Any2EVMMessage { + bytes32 messageId; + uint64 sourceChainSelector; + bytes sender; + bytes data; + TokenAmount[] tokenAmounts; + } + + /// @notice Emitted when a message is sent + event MessageSent( + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address indexed sender, + bytes receiver, + bytes data, + TokenAmount[] tokenAmounts, + address feeToken, + bytes extraArgs + ); + + /// @notice Emitted when a message is received + event MessageReceived( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed sender, + bytes data, + TokenAmount[] tokenAmounts + ); + + /// @notice Sends a message to a destination chain + /// @param destinationChainSelector The chain selector of the destination chain + /// @param message The message to send + /// @return messageId The ID of the sent message + /// @return fees The fees required for the message + /// @dev If feeToken is zero address, fees are paid in native token (ETH) via msg.value + function ccipSend( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) external payable returns (bytes32 messageId, uint256 fees); + + /// @notice Gets the fee for sending a message + /// @param destinationChainSelector The chain selector of the destination chain + /// @param message The message to send + /// @return fee The fee required for the message + function getFee( + uint64 destinationChainSelector, + EVM2AnyMessage memory message + ) external view returns (uint256 fee); + + /// @notice Gets the supported tokens for a destination chain + /// @param destinationChainSelector The chain selector of the destination chain + /// @return tokens The list of supported tokens + function getSupportedTokens( + uint64 destinationChainSelector + ) external view returns (address[] memory tokens); +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/channels/GenericStateChannelManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/channels/GenericStateChannelManager.sol new file mode 100644 index 0000000..b374dc6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/channels/GenericStateChannelManager.sol @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {IGenericStateChannelManager} from "./IGenericStateChannelManager.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/** + * @title GenericStateChannelManager + * @notice State channels with committed stateHash: open, fund, close with (stateHash, balanceA, balanceB, nonce). stateHash attests to arbitrary off-chain state (e.g. game, attestation). + * @dev Same lifecycle as PaymentChannelManager; close/submit/challenge include stateHash so settlement commits to agreed state. + */ +contract GenericStateChannelManager is IGenericStateChannelManager, ReentrancyGuard { + address public admin; + bool public paused; + + uint256 public challengeWindowSeconds; + + uint256 private _nextChannelId; + mapping(uint256 => Channel) private _channels; + uint256[] private _channelIds; + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin, uint256 _challengeWindowSeconds) { + require(_admin != address(0), "zero admin"); + require(_challengeWindowSeconds > 0, "zero challenge window"); + admin = _admin; + challengeWindowSeconds = _challengeWindowSeconds; + } + + function openChannel(address participantB) external payable whenNotPaused returns (uint256 channelId) { + require(participantB != address(0), "zero participant"); + require(participantB != msg.sender, "self channel"); + require(msg.value > 0, "zero deposit"); + + channelId = _nextChannelId++; + _channels[channelId] = Channel({ + participantA: msg.sender, + participantB: participantB, + depositA: msg.value, + depositB: 0, + status: ChannelStatus.Open, + disputeNonce: 0, + disputeStateHash: bytes32(0), + disputeBalanceA: 0, + disputeBalanceB: 0, + disputeDeadline: 0 + }); + _channelIds.push(channelId); + emit ChannelOpened(channelId, msg.sender, participantB, msg.value, 0); + return channelId; + } + + function fundChannel(uint256 channelId) external payable whenNotPaused { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open, "not open"); + require(ch.depositB == 0, "already funded"); + require(msg.sender == ch.participantB, "not participant B"); + require(msg.value > 0, "zero deposit"); + ch.depositB = msg.value; + emit ChannelOpened(channelId, ch.participantA, ch.participantB, ch.depositA, ch.depositB); + } + + function closeChannelCooperative( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external nonReentrant { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open, "not open"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + _verifySignatures(channelId, stateHash, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + ch.status = ChannelStatus.Closed; + _transfer(ch.participantA, balanceA); + _transfer(ch.participantB, balanceB); + emit ChannelClosed(channelId, stateHash, balanceA, balanceB, true); + } + + function submitClose( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open || ch.status == ChannelStatus.Dispute, "wrong status"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + _verifySignatures(channelId, stateHash, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + if (ch.status == ChannelStatus.Open) { + ch.status = ChannelStatus.Dispute; + } else { + require(nonce > ch.disputeNonce, "older state"); + } + ch.disputeNonce = nonce; + ch.disputeStateHash = stateHash; + ch.disputeBalanceA = balanceA; + ch.disputeBalanceB = balanceB; + ch.disputeDeadline = block.timestamp + challengeWindowSeconds; + emit ChallengeSubmitted(channelId, nonce, stateHash, balanceA, balanceB, ch.disputeDeadline); + } + + function challengeClose( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Dispute, "not in dispute"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + require(nonce > ch.disputeNonce, "not newer"); + _verifySignatures(channelId, stateHash, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + ch.disputeNonce = nonce; + ch.disputeStateHash = stateHash; + ch.disputeBalanceA = balanceA; + ch.disputeBalanceB = balanceB; + ch.disputeDeadline = block.timestamp + challengeWindowSeconds; + emit ChallengeSubmitted(channelId, nonce, stateHash, balanceA, balanceB, ch.disputeDeadline); + } + + function finalizeClose(uint256 channelId) external nonReentrant { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Dispute, "not in dispute"); + require(block.timestamp >= ch.disputeDeadline, "window open"); + ch.status = ChannelStatus.Closed; + _transfer(ch.participantA, ch.disputeBalanceA); + _transfer(ch.participantB, ch.disputeBalanceB); + emit ChannelClosed(channelId, ch.disputeStateHash, ch.disputeBalanceA, ch.disputeBalanceB, false); + } + + function getChannel(uint256 channelId) external view returns (Channel memory) { + return _channels[channelId]; + } + + function getChannelCount() external view returns (uint256) { + return _channelIds.length; + } + + function getChannelId(address participantA, address participantB) external view returns (uint256) { + for (uint256 i = 0; i < _channelIds.length; i++) { + Channel storage ch = _channels[_channelIds[i]]; + if ( + (ch.participantA == participantA && ch.participantB == participantB) || + (ch.participantA == participantB && ch.participantB == participantA) + ) { + if (ch.status == ChannelStatus.Open || ch.status == ChannelStatus.Dispute) { + return _channelIds[i]; + } + } + } + return 0; + } + + function getChannelIdByIndex(uint256 index) external view returns (uint256) { + require(index < _channelIds.length, "out of bounds"); + return _channelIds[index]; + } + + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function setChallengeWindow(uint256 newWindow) external onlyAdmin { + require(newWindow > 0, "zero window"); + uint256 old = challengeWindowSeconds; + challengeWindowSeconds = newWindow; + emit ChallengeWindowUpdated(old, newWindow); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } + + function _verifySignatures( + uint256 channelId, + bytes32 stateHash, + address participantA, + address participantB, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) internal pure { + bytes32 stateHashInner = keccak256(abi.encodePacked(channelId, stateHash, nonce, balanceA, balanceB)); + bytes32 ethSigned = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", stateHashInner)); + address signerA = ECDSA.recover(ethSigned, vA, rA, sA); + address signerB = ECDSA.recover(ethSigned, vB, rB, sB); + require(signerA == participantA && signerB == participantB, "invalid sigs"); + } + + function _transfer(address to, uint256 amount) internal { + if (amount > 0) { + (bool ok,) = payable(to).call{value: amount}(""); + require(ok, "transfer failed"); + } + } + + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/channels/IGenericStateChannelManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/channels/IGenericStateChannelManager.sol new file mode 100644 index 0000000..46bf7cd --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/channels/IGenericStateChannelManager.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IGenericStateChannelManager + * @notice State channels with committed stateHash: same as payment channels but settlement attests to an arbitrary stateHash (e.g. game result, attestation). + */ +interface IGenericStateChannelManager { + enum ChannelStatus { + None, + Open, + Dispute, + Closed + } + + struct Channel { + address participantA; + address participantB; + uint256 depositA; + uint256 depositB; + ChannelStatus status; + uint256 disputeNonce; + bytes32 disputeStateHash; + uint256 disputeBalanceA; + uint256 disputeBalanceB; + uint256 disputeDeadline; + } + + event ChannelOpened( + uint256 indexed channelId, + address indexed participantA, + address indexed participantB, + uint256 depositA, + uint256 depositB + ); + + event ChannelClosed( + uint256 indexed channelId, + bytes32 stateHash, + uint256 balanceA, + uint256 balanceB, + bool cooperative + ); + + event ChallengeSubmitted( + uint256 indexed channelId, + uint256 nonce, + bytes32 stateHash, + uint256 balanceA, + uint256 balanceB, + uint256 newDeadline + ); + + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + event ChallengeWindowUpdated(uint256 oldWindow, uint256 newWindow); + + function openChannel(address participantB) external payable returns (uint256 channelId); + function fundChannel(uint256 channelId) external payable; + + function closeChannelCooperative( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function submitClose( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function challengeClose( + uint256 channelId, + bytes32 stateHash, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function finalizeClose(uint256 channelId) external; + + function getChannel(uint256 channelId) external view returns (Channel memory); + function getChannelCount() external view returns (uint256); + function getChannelId(address participantA, address participantB) external view returns (uint256); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/channels/IPaymentChannelManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/channels/IPaymentChannelManager.sol new file mode 100644 index 0000000..7e89621 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/channels/IPaymentChannelManager.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IPaymentChannelManager + * @notice Interface for payment channel manager (open, update state, cooperative/unilateral close, challenge) + */ +interface IPaymentChannelManager { + enum ChannelStatus { + None, + Open, + Dispute, + Closed + } + + struct Channel { + address participantA; + address participantB; + uint256 depositA; + uint256 depositB; + ChannelStatus status; + uint256 disputeNonce; + uint256 disputeBalanceA; + uint256 disputeBalanceB; + uint256 disputeDeadline; + } + + event ChannelOpened( + uint256 indexed channelId, + address indexed participantA, + address indexed participantB, + uint256 depositA, + uint256 depositB + ); + + event ChannelClosed( + uint256 indexed channelId, + uint256 balanceA, + uint256 balanceB, + bool cooperative + ); + + event ChallengeSubmitted( + uint256 indexed channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint256 newDeadline + ); + + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + event ChallengeWindowUpdated(uint256 oldWindow, uint256 newWindow); + + function openChannel(address participantB) external payable returns (uint256 channelId); + function fundChannel(uint256 channelId) external payable; + + function closeChannelCooperative( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function submitClose( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function challengeClose( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external; + + function finalizeClose(uint256 channelId) external; + + function getChannel(uint256 channelId) external view returns (Channel memory); + function getChannelCount() external view returns (uint256); + function getChannelId(address participantA, address participantB) external view returns (uint256); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/channels/PaymentChannelManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/channels/PaymentChannelManager.sol new file mode 100644 index 0000000..d3fe64c --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/channels/PaymentChannelManager.sol @@ -0,0 +1,263 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {IPaymentChannelManager} from "./IPaymentChannelManager.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/** + * @title PaymentChannelManager + * @notice Manages payment channels: open, cooperative/unilateral close, challenge window (newest state wins). + * @dev Deployable on both Mainnet and Chain-138. Holds ETH; no ERC20 in v1. + */ +contract PaymentChannelManager is IPaymentChannelManager, ReentrancyGuard { + address public admin; + bool public paused; + + /// Challenge period in seconds (e.g. 24h = 86400) + uint256 public challengeWindowSeconds; + + uint256 private _nextChannelId; + mapping(uint256 => Channel) private _channels; + + /// For enumeration + uint256[] private _channelIds; + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin, uint256 _challengeWindowSeconds) { + require(_admin != address(0), "zero admin"); + require(_challengeWindowSeconds > 0, "zero challenge window"); + admin = _admin; + challengeWindowSeconds = _challengeWindowSeconds; + } + + /// @inheritdoc IPaymentChannelManager + function openChannel(address participantB) external payable whenNotPaused returns (uint256 channelId) { + require(participantB != address(0), "zero participant"); + require(participantB != msg.sender, "self channel"); + require(msg.value > 0, "zero deposit"); + + channelId = _nextChannelId++; + _channels[channelId] = Channel({ + participantA: msg.sender, + participantB: participantB, + depositA: msg.value, + depositB: 0, + status: ChannelStatus.Open, + disputeNonce: 0, + disputeBalanceA: 0, + disputeBalanceB: 0, + disputeDeadline: 0 + }); + _channelIds.push(channelId); + + emit ChannelOpened(channelId, msg.sender, participantB, msg.value, 0); + return channelId; + } + + /// @inheritdoc IPaymentChannelManager + function fundChannel(uint256 channelId) external payable whenNotPaused { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open, "not open"); + require(ch.depositB == 0, "already funded"); + require(msg.sender == ch.participantB, "not participant B"); + require(msg.value > 0, "zero deposit"); + + ch.depositB = msg.value; + emit ChannelOpened(channelId, ch.participantA, ch.participantB, ch.depositA, ch.depositB); + } + + /// @inheritdoc IPaymentChannelManager + function closeChannelCooperative( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external nonReentrant { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open, "not open"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + _verifyStateSignatures(channelId, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + + ch.status = ChannelStatus.Closed; + _transfer(ch.participantA, balanceA); + _transfer(ch.participantB, balanceB); + + emit ChannelClosed(channelId, balanceA, balanceB, true); + } + + /// @inheritdoc IPaymentChannelManager + function submitClose( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Open || ch.status == ChannelStatus.Dispute, "wrong status"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + _verifyStateSignatures(channelId, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + + if (ch.status == ChannelStatus.Open) { + ch.status = ChannelStatus.Dispute; + } else { + require(nonce > ch.disputeNonce, "older state"); + } + + ch.disputeNonce = nonce; + ch.disputeBalanceA = balanceA; + ch.disputeBalanceB = balanceB; + ch.disputeDeadline = block.timestamp + challengeWindowSeconds; + + emit ChallengeSubmitted(channelId, nonce, balanceA, balanceB, ch.disputeDeadline); + } + + /// @inheritdoc IPaymentChannelManager + function challengeClose( + uint256 channelId, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) external { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Dispute, "not in dispute"); + uint256 total = ch.depositA + ch.depositB; + require(balanceA + balanceB == total, "balance sum"); + require(nonce > ch.disputeNonce, "not newer"); + _verifyStateSignatures(channelId, ch.participantA, ch.participantB, nonce, balanceA, balanceB, vA, rA, sA, vB, rB, sB); + + ch.disputeNonce = nonce; + ch.disputeBalanceA = balanceA; + ch.disputeBalanceB = balanceB; + ch.disputeDeadline = block.timestamp + challengeWindowSeconds; + + emit ChallengeSubmitted(channelId, nonce, balanceA, balanceB, ch.disputeDeadline); + } + + /// @inheritdoc IPaymentChannelManager + function finalizeClose(uint256 channelId) external nonReentrant { + Channel storage ch = _channels[channelId]; + require(ch.status == ChannelStatus.Dispute, "not in dispute"); + require(block.timestamp >= ch.disputeDeadline, "window open"); + + ch.status = ChannelStatus.Closed; + _transfer(ch.participantA, ch.disputeBalanceA); + _transfer(ch.participantB, ch.disputeBalanceB); + + emit ChannelClosed(channelId, ch.disputeBalanceA, ch.disputeBalanceB, false); + } + + /// @inheritdoc IPaymentChannelManager + function getChannel(uint256 channelId) external view returns (Channel memory) { + return _channels[channelId]; + } + + /// @inheritdoc IPaymentChannelManager + function getChannelCount() external view returns (uint256) { + return _channelIds.length; + } + + /// Returns first channel id for the pair (0 if none). For multiple channels per pair, enumerate via getChannelCount/getChannel. + function getChannelId(address participantA, address participantB) external view returns (uint256) { + for (uint256 i = 0; i < _channelIds.length; i++) { + Channel storage ch = _channels[_channelIds[i]]; + if ( + (ch.participantA == participantA && ch.participantB == participantB) || + (ch.participantA == participantB && ch.participantB == participantA) + ) { + if (ch.status == ChannelStatus.Open || ch.status == ChannelStatus.Dispute) { + return _channelIds[i]; + } + } + } + return 0; + } + + function getChannelIdByIndex(uint256 index) external view returns (uint256) { + require(index < _channelIds.length, "out of bounds"); + return _channelIds[index]; + } + + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function setChallengeWindow(uint256 newWindow) external onlyAdmin { + require(newWindow > 0, "zero window"); + uint256 old = challengeWindowSeconds; + challengeWindowSeconds = newWindow; + emit ChallengeWindowUpdated(old, newWindow); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } + + function _verifyStateSignatures( + uint256 channelId, + address participantA, + address participantB, + uint256 nonce, + uint256 balanceA, + uint256 balanceB, + uint8 vA, + bytes32 rA, + bytes32 sA, + uint8 vB, + bytes32 rB, + bytes32 sB + ) internal pure { + bytes32 stateHash = keccak256(abi.encodePacked(channelId, nonce, balanceA, balanceB)); + bytes32 ethSigned = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", stateHash)); + + address signerA = ECDSA.recover(ethSigned, vA, rA, sA); + address signerB = ECDSA.recover(ethSigned, vB, rB, sB); + require(signerA == participantA && signerB == participantB, "invalid sigs"); + } + + function _transfer(address to, uint256 amount) internal { + if (amount > 0) { + (bool ok,) = payable(to).call{value: amount}(""); + require(ok, "transfer failed"); + } + } + + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/compliance/ComplianceRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/compliance/ComplianceRegistry.sol new file mode 100644 index 0000000..af75205 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/compliance/ComplianceRegistry.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./LegallyCompliantBase.sol"; + +/** + * @title ComplianceRegistry + * @notice Registry for tracking legal compliance status of contracts + * @dev This registry tracks contracts that inherit from LegallyCompliantBase + * Separate from eMoney ComplianceRegistry which has KYC/AML features + */ +contract ComplianceRegistry is AccessControl { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + + /** + * @notice Compliance status for a contract + */ + struct ContractComplianceStatus { + bool isRegistered; + string legalFrameworkVersion; + string legalJurisdiction; + bytes32 lastLegalNoticeHash; + uint256 registeredAt; + uint256 lastUpdated; + } + + mapping(address => ContractComplianceStatus) private _contractCompliance; + + event ContractRegistered( + address indexed contractAddress, + string legalFrameworkVersion, + string legalJurisdiction, + uint256 timestamp + ); + + event ContractComplianceUpdated( + address indexed contractAddress, + bytes32 lastLegalNoticeHash, + uint256 timestamp + ); + + /** + * @notice Constructor + * @param admin Address that will receive DEFAULT_ADMIN_ROLE + */ + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a contract that inherits from LegallyCompliantBase + * @param contractAddress Address of the compliant contract + * @dev Requires REGISTRAR_ROLE + */ + function registerContract(address contractAddress) external onlyRole(REGISTRAR_ROLE) { + require(contractAddress != address(0), "ComplianceRegistry: zero address"); + require(!_contractCompliance[contractAddress].isRegistered, "ComplianceRegistry: contract already registered"); + + // Get compliance information from the contract + LegallyCompliantBase compliantContract = LegallyCompliantBase(contractAddress); + + _contractCompliance[contractAddress] = ContractComplianceStatus({ + isRegistered: true, + legalFrameworkVersion: compliantContract.LEGAL_FRAMEWORK_VERSION(), + legalJurisdiction: compliantContract.LEGAL_JURISDICTION(), + lastLegalNoticeHash: bytes32(0), + registeredAt: block.timestamp, + lastUpdated: block.timestamp + }); + + emit ContractRegistered( + contractAddress, + compliantContract.LEGAL_FRAMEWORK_VERSION(), + compliantContract.LEGAL_JURISDICTION(), + block.timestamp + ); + } + + /** + * @notice Update compliance status with a new legal notice + * @param contractAddress Address of the compliant contract + * @param newLegalNoticeHash Hash of the new legal notice + * @dev Requires REGISTRAR_ROLE + */ + function updateContractCompliance( + address contractAddress, + bytes32 newLegalNoticeHash + ) external onlyRole(REGISTRAR_ROLE) { + require(_contractCompliance[contractAddress].isRegistered, "ComplianceRegistry: contract not registered"); + + _contractCompliance[contractAddress].lastLegalNoticeHash = newLegalNoticeHash; + _contractCompliance[contractAddress].lastUpdated = block.timestamp; + + emit ContractComplianceUpdated(contractAddress, newLegalNoticeHash, block.timestamp); + } + + /** + * @notice Get compliance status for a contract + * @param contractAddress Address of the contract + * @return Compliance status struct + */ + function getContractComplianceStatus( + address contractAddress + ) external view returns (ContractComplianceStatus memory) { + return _contractCompliance[contractAddress]; + } + + /** + * @notice Check if a contract is registered + * @param contractAddress Address of the contract + * @return True if registered, false otherwise + */ + function isContractRegistered(address contractAddress) external view returns (bool) { + return _contractCompliance[contractAddress].isRegistered; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/compliance/IndyVerifier.sol b/verification-sources/chain138-buildinfo-7678218/contracts/compliance/IndyVerifier.sol new file mode 100644 index 0000000..9319eda --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/compliance/IndyVerifier.sol @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title IndyVerifier + * @notice Verifies Hyperledger Indy credentials before allowing bridge operations + * @dev Uses zero-knowledge proofs for privacy-preserving credential verification + */ +contract IndyVerifier is AccessControl { + bytes32 public constant VERIFIER_ROLE = keccak256("VERIFIER_ROLE"); + bytes32 public constant ISSUER_ROLE = keccak256("ISSUER_ROLE"); + + enum CredentialType { + KYC, + AccreditedInvestor, + Institution, + Jurisdiction, + Compliance + } + + struct CredentialSchema { + string schemaId; // Indy schema ID + string credDefId; // Credential definition ID + bool required; + CredentialType credType; + uint256 minScore; // Minimum verification score (0-100) + } + + struct VerificationResult { + bool verified; + uint256 score; + uint256 verifiedAt; + string proofId; + } + + mapping(address => mapping(CredentialType => VerificationResult)) public userCredentials; + mapping(CredentialType => CredentialSchema) public schemas; + mapping(string => bool) public verifiedProofs; // proofId => verified + + event CredentialVerified( + address indexed user, + CredentialType credType, + uint256 score, + string proofId + ); + + event CredentialRevoked( + address indexed user, + CredentialType credType + ); + + event SchemaRegistered( + CredentialType credType, + string schemaId, + string credDefId + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(VERIFIER_ROLE, admin); + _grantRole(ISSUER_ROLE, admin); + } + + /** + * @notice Register credential schema + */ + function registerSchema( + CredentialType credType, + string calldata schemaId, + string calldata credDefId, + bool required, + uint256 minScore + ) external onlyRole(ISSUER_ROLE) { + schemas[credType] = CredentialSchema({ + schemaId: schemaId, + credDefId: credDefId, + required: required, + credType: credType, + minScore: minScore + }); + + emit SchemaRegistered(credType, schemaId, credDefId); + } + + /** + * @notice Verify credential proof (called by oracle/agent) + * @dev Off-chain: Verify ZK proof with Indy + * On-chain: Store verification result + */ + function verifyCredentialProof( + address user, + CredentialType credType, + bytes calldata zkProof, + uint256 score, + string calldata proofId + ) external onlyRole(VERIFIER_ROLE) returns (bool) { + require(bytes(schemas[credType].schemaId).length > 0, "Schema not registered"); + require(!verifiedProofs[proofId], "Proof already used"); + require(score >= schemas[credType].minScore, "Score too low"); + + // Mark proof as used (prevent replay) + verifiedProofs[proofId] = true; + + // Store verification result + userCredentials[user][credType] = VerificationResult({ + verified: true, + score: score, + verifiedAt: block.timestamp, + proofId: proofId + }); + + emit CredentialVerified(user, credType, score, proofId); + + return true; + } + + /** + * @notice Check if user has required credential + */ + function hasCredential( + address user, + CredentialType credType + ) external view returns (bool) { + VerificationResult memory result = userCredentials[user][credType]; + if (!result.verified) return false; + + CredentialSchema memory schema = schemas[credType]; + return result.score >= schema.minScore; + } + + /** + * @notice Get credential verification details + */ + function getCredentialDetails( + address user, + CredentialType credType + ) external view returns (VerificationResult memory) { + return userCredentials[user][credType]; + } + + /** + * @notice Revoke credential (for compliance) + */ + function revokeCredential( + address user, + CredentialType credType + ) external onlyRole(VERIFIER_ROLE) { + delete userCredentials[user][credType]; + emit CredentialRevoked(user, credType); + } + + /** + * @notice Batch verify credentials (for efficiency) + */ + function batchVerifyCredentials( + address[] calldata users, + CredentialType[] calldata credTypes, + bytes[] calldata zkProofs, + uint256[] calldata scores, + string[] calldata proofIds + ) external onlyRole(VERIFIER_ROLE) { + require( + users.length == credTypes.length && + credTypes.length == zkProofs.length && + zkProofs.length == scores.length && + scores.length == proofIds.length, + "Array length mismatch" + ); + + for (uint256 i = 0; i < users.length; i++) { + this.verifyCredentialProof(users[i], credTypes[i], zkProofs[i], scores[i], proofIds[i]); + } + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/compliance/LegallyCompliantBase.sol b/verification-sources/chain138-buildinfo-7678218/contracts/compliance/LegallyCompliantBase.sol new file mode 100644 index 0000000..f2b5801 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/compliance/LegallyCompliantBase.sol @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; + +/** + * @title LegallyCompliantBase + * @notice Base contract for all legally compliant value transfer instruments + * @dev Provides legal framework declarations, ISO standards compliance, ICC compliance, + * and exemption declarations for Travel Rules and regulatory compliance + */ +abstract contract LegallyCompliantBase is AccessControl { + using Strings for uint256; + + // Legal Framework Version + string public constant LEGAL_FRAMEWORK_VERSION = "1.0.0"; + + // Legal Jurisdiction + string public constant LEGAL_JURISDICTION = "International Private Law"; + + // Dispute Resolution + string public constant DISPUTE_RESOLUTION_MECHANISM = "ICC Arbitration (Paris)"; + + // Service of Process Address + string public constant SERVICE_OF_PROCESS_ADDRESS = "0x0000000000000000000000000000000000000000"; + + // ISO Standards Compliance + string public constant ISO_20022_COMPLIANCE = "ISO 20022 (Financial Messaging) - Supported via ISO20022Router"; + string public constant ISO_27001_COMPLIANCE = "ISO 27001 (Information Security) - Architectural Compliance"; + string public constant ISO_3166_COMPLIANCE = "ISO 3166 (Country Codes) - Supported"; + string public constant ISO_8601_COMPLIANCE = "ISO 8601 (Timestamps) - Supported"; + string public constant ISO_4217_COMPLIANCE = "ISO 4217 (Currency Codes) - Supported"; + + // ICC Compliance + string public constant ICC_UNIFORM_RULES_COMPLIANCE = "ICC Uniform Rules for Demand Guarantees (URDG 758) - Applicable by reference"; + string public constant ICC_ARBITRATION_SUPPORT = "ICC Arbitration Rules - Supported for dispute resolution"; + string public constant ICC_TRADE_TERMS_COMPLIANCE = "Incoterms 2020 - Applicable by reference"; + + // Instrument Classification + string public constant INSTRUMENT_CLASSIFICATION = "Private Digital Instrument of Value Transfer"; + + // Transferability Statement + string public constant TRANSFERABILITY_STATEMENT = "This instrument represents a transferable claim or value, subject to contract terms."; + + // Legal Enforceability + string public constant LEGAL_ENFORCEABILITY_STATEMENT = "Enforceable under private international law principles and ICC arbitration."; + + // Travel Rules Exemption + string public constant TRAVEL_RULE_EXEMPTION_STATEMENT = + "This contract is designed for private, peer-to-peer value transfer and is not intended to facilitate transactions subject to FATF Travel Rule (e.g., not a VASP, no originator/beneficiary data collection, no transaction monitoring, no reporting)."; + + // Regulatory Exemption + string public constant REGULATORY_EXEMPTION_STATEMENT = + "This contract is not intended to be a money transmission service, payment service, or regulated financial instrument. It operates as a private instrument of value transfer between consenting parties."; + + // Events + event LegalNotice(bytes32 indexed noticeHash, string message, uint256 timestamp); + event ValueTransferDeclared( + address indexed from, + address indexed to, + uint256 value, + bytes32 legalReferenceHash + ); + event JurisdictionDeclared(string jurisdiction, uint256 timestamp); + event DisputeResolutionMechanismSet(string mechanism, uint256 timestamp); + + /** + * @notice Constructor + * @param admin Address that will receive DEFAULT_ADMIN_ROLE + */ + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + emit JurisdictionDeclared(LEGAL_JURISDICTION, block.timestamp); + emit DisputeResolutionMechanismSet(DISPUTE_RESOLUTION_MECHANISM, block.timestamp); + } + + /** + * @notice Record a legal notice + * @param message The legal notice message + */ + function recordLegalNotice(string calldata message) external onlyRole(DEFAULT_ADMIN_ROLE) { + emit LegalNotice( + keccak256(abi.encodePacked(message, block.timestamp)), + message, + block.timestamp + ); + } + + /** + * @notice Generate a legal reference hash for a value transfer + * @param from Source address + * @param to Destination address + * @param value Transfer amount + * @param additionalData Additional data for the transfer + * @return legalReferenceHash The generated legal reference hash + */ + function _generateLegalReferenceHash( + address from, + address to, + uint256 value, + bytes memory additionalData + ) internal view returns (bytes32) { + return keccak256(abi.encodePacked( + block.timestamp, + block.number, + tx.origin, + from, + to, + value, + additionalData, + LEGAL_FRAMEWORK_VERSION, + LEGAL_JURISDICTION + )); + } + + /** + * @notice Emit a compliant value transfer event + * @param from Source address + * @param to Destination address + * @param value Transfer amount + * @param legalReference Legal reference string + * @param iso20022MessageId ISO 20022 message ID (if applicable) + */ + function _emitCompliantValueTransfer( + address from, + address to, + uint256 value, + string memory legalReference, + bytes32 iso20022MessageId + ) internal { + bytes32 legalRefHash = _generateLegalReferenceHash( + from, + to, + value, + abi.encodePacked(legalReference, iso20022MessageId) + ); + + emit ValueTransferDeclared(from, to, value, legalRefHash); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/config/ConfigurationRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/config/ConfigurationRegistry.sol new file mode 100644 index 0000000..47771a5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/config/ConfigurationRegistry.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title ConfigurationRegistry + * @notice Centralized configuration without hardcoding + * @dev Eliminates hardcoded addresses, enables runtime configuration + */ +contract ConfigurationRegistry is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant CONFIG_ADMIN_ROLE = keccak256("CONFIG_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + mapping(address => mapping(bytes32 => bytes)) private configs; + mapping(address => bytes32[]) private configKeys; + + event ConfigSet(address indexed contractAddr, bytes32 indexed key, bytes value); + event ConfigDeleted(address indexed contractAddr, bytes32 indexed key); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(CONFIG_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + function set(address contractAddr, bytes32 key, bytes calldata value) external onlyRole(CONFIG_ADMIN_ROLE) { + require(contractAddr != address(0), "Zero address"); + require(key != bytes32(0), "Zero key"); + + if (configs[contractAddr][key].length == 0) { + configKeys[contractAddr].push(key); + } + + configs[contractAddr][key] = value; + emit ConfigSet(contractAddr, key, value); + } + + function get(address contractAddr, bytes32 key) external view returns (bytes memory) { + return configs[contractAddr][key]; + } + + function getAddress(address contractAddr, bytes32 key) external view returns (address) { + bytes memory data = configs[contractAddr][key]; + require(data.length == 32, "Invalid data"); + return abi.decode(data, (address)); + } + + function getUint256(address contractAddr, bytes32 key) external view returns (uint256) { + bytes memory data = configs[contractAddr][key]; + require(data.length == 32, "Invalid data"); + return abi.decode(data, (uint256)); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/dex/DODOPMMIntegration.sol b/verification-sources/chain138-buildinfo-7678218/contracts/dex/DODOPMMIntegration.sol new file mode 100644 index 0000000..42d9adb --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/dex/DODOPMMIntegration.sol @@ -0,0 +1,566 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../reserve/IReserveSystem.sol"; + +/** + * @title DODO PMM Pool Interface + * @notice Simplified interface for DODO Proactive Market Maker pools + * @dev Actual DODO interfaces may vary - this is a simplified version + */ +interface IDODOPMMPool { + function _BASE_TOKEN_() external view returns (address); + function _QUOTE_TOKEN_() external view returns (address); + function sellBase(uint256 amount) external returns (uint256); + function sellQuote(uint256 amount) external returns (uint256); + function buyShares(address to) external returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare); + function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve); + function getMidPrice() external view returns (uint256); + function _QUOTE_RESERVE_() external view returns (uint256); + function _BASE_RESERVE_() external view returns (uint256); +} + +/** + * @title DODO Vending Machine Interface + * @notice Interface for creating DODO Vending Machine (DVM) pools + */ +interface IDODOVendingMachine { + function createDVM( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 i, + uint256 k, + bool isOpenTWAP + ) external returns (address dvm); +} + +/** + * @title DODOPMMIntegration + * @notice Integration contract for DODO PMM pools with CompliantUSDT/USDC + * @dev Manages liquidity pools on DODO and provides swap functionality between + * compliant tokens (cUSDT/cUSDC) and official tokens (USDT/USDC) + * + * This contract facilitates exchangeability between compliant and official tokens + * through DODO's Proactive Market Maker algorithm, which maintains price stability + * and provides efficient liquidity. + */ +contract DODOPMMIntegration is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + bytes32 public constant SWAP_OPERATOR_ROLE = keccak256("SWAP_OPERATOR_ROLE"); + + // DODO contracts + address public immutable dodoVendingMachine; + address public immutable dodoApprove; // DODO's approval contract for gas optimization + + // Token addresses + address public immutable officialUSDT; // Official USDT on destination chain + address public immutable officialUSDC; // Official USDC on destination chain + address public immutable compliantUSDT; // cUSDT on Chain 138 + address public immutable compliantUSDC; // cUSDC on Chain 138 + + // Pool mappings + mapping(address => mapping(address => address)) public pools; // token0 => token1 => pool + mapping(address => bool) public isRegisteredPool; + + // Pool configuration + struct PoolConfig { + address pool; + address baseToken; + address quoteToken; + uint256 lpFeeRate; // Basis points (100 = 1%) + uint256 i; // Initial price (1e18 = $1 for stablecoins) + uint256 k; // Slippage factor (0.5 = 500000000000000000, lower = less slippage) + bool isOpenTWAP; // Enable TWAP oracle for price discovery + uint256 createdAt; + } + + mapping(address => PoolConfig) public poolConfigs; + address[] public allPools; + + /// @notice Optional ReserveSystem for oracle-backed mid price (base/quote in reserve system) + IReserveSystem public reserveSystem; + + event PoolCreated( + address indexed pool, + address indexed baseToken, + address indexed quoteToken, + address creator + ); + event LiquidityAdded( + address indexed pool, + address indexed provider, + uint256 baseAmount, + uint256 quoteAmount, + uint256 lpShares + ); + event SwapExecuted( + address indexed pool, + address indexed tokenIn, + address indexed tokenOut, + uint256 amountIn, + uint256 amountOut, + address trader + ); + event PoolRemoved(address indexed pool); + event ReserveSystemSet(address indexed reserveSystem); + + constructor( + address admin, + address dodoVendingMachine_, + address dodoApprove_, + address officialUSDT_, + address officialUSDC_, + address compliantUSDT_, + address compliantUSDC_ + ) { + require(admin != address(0), "DODOPMMIntegration: zero admin"); + require(dodoVendingMachine_ != address(0), "DODOPMMIntegration: zero DVM"); + require(officialUSDT_ != address(0), "DODOPMMIntegration: zero USDT"); + require(officialUSDC_ != address(0), "DODOPMMIntegration: zero USDC"); + require(compliantUSDT_ != address(0), "DODOPMMIntegration: zero cUSDT"); + require(compliantUSDC_ != address(0), "DODOPMMIntegration: zero cUSDC"); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + _grantRole(SWAP_OPERATOR_ROLE, admin); + + dodoVendingMachine = dodoVendingMachine_; + dodoApprove = dodoApprove_; + officialUSDT = officialUSDT_; + officialUSDC = officialUSDC_; + compliantUSDT = compliantUSDT_; + compliantUSDC = compliantUSDC_; + } + + /** + * @notice Create DODO PMM pool for cUSDT/USDT pair + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage, higher = more slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTUSDTPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][officialUSDT] == address(0), "DODOPMMIntegration: pool exists"); + + // Create DVM pool using DODO Vending Machine + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + officialUSDT, // quoteToken (USDT) + lpFeeRate, // LP fee rate + initialPrice, // Initial price + k, // Slippage factor + isOpenTWAP // Enable TWAP + ); + + // Register pool + pools[compliantUSDT][officialUSDT] = pool; + pools[officialUSDT][compliantUSDT] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDT, + quoteToken: officialUSDT, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDT, officialUSDT, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDC/USDC pair + * @param lpFeeRate Liquidity provider fee rate (basis points) + * @param initialPrice Initial price (1e18 = $1) + * @param k Slippage factor + * @param isOpenTWAP Enable TWAP oracle + */ + function createCUSDCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDC][officialUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDC, + officialUSDC, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[compliantUSDC][officialUSDC] = pool; + pools[officialUSDC][compliantUSDC] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDC, + quoteToken: officialUSDC, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDC, officialUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDT/cUSDC pair (public liquidity per VAULT_SYSTEM_MASTER_TECHNICAL_PLAN §4) + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][compliantUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + compliantUSDC, // quoteToken (cUSDC) + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[compliantUSDT][compliantUSDC] = pool; + pools[compliantUSDC][compliantUSDT] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDT, + quoteToken: compliantUSDC, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDT, compliantUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for any base/quote token pair (generic) + * @param baseToken Base token address + * @param quoteToken Quote token address + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoins) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createPool( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(baseToken != address(0), "DODOPMMIntegration: zero base"); + require(quoteToken != address(0), "DODOPMMIntegration: zero quote"); + require(baseToken != quoteToken, "DODOPMMIntegration: same token"); + require(pools[baseToken][quoteToken] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + baseToken, + quoteToken, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[baseToken][quoteToken] = pool; + pools[quoteToken][baseToken] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: baseToken, + quoteToken: quoteToken, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, baseToken, quoteToken, msg.sender); + } + + /** + * @notice Add liquidity to a DODO PMM pool + * @param pool Pool address + * @param baseAmount Amount of base token to deposit + * @param quoteAmount Amount of quote token to deposit + */ + function addLiquidity( + address pool, + uint256 baseAmount, + uint256 quoteAmount + ) external nonReentrant returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(baseAmount > 0 && quoteAmount > 0, "DODOPMMIntegration: zero amount"); + + PoolConfig memory config = poolConfigs[pool]; + + // Transfer tokens to pool (DODO pools handle their own token management) + IERC20(config.baseToken).safeTransferFrom(msg.sender, pool, baseAmount); + IERC20(config.quoteToken).safeTransferFrom(msg.sender, pool, quoteAmount); + + // Call buyShares on DODO pool to add liquidity + (baseShare, quoteShare, lpShare) = IDODOPMMPool(pool).buyShares(msg.sender); + + emit LiquidityAdded(pool, msg.sender, baseAmount, quoteAmount, lpShare); + } + + /** + * @notice Swap cUSDT for official USDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDT to sell + * @param minAmountOut Minimum amount of USDT to receive (slippage protection) + */ + function swapCUSDTForUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer cUSDT to pool + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell base token) + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDT, officialUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDT for cUSDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDT to sell + * @param minAmountOut Minimum amount of cUSDT to receive + */ + function swapUSDTForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer USDT to pool + IERC20(officialUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell quote token) + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDT, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for official USDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDC to sell + * @param minAmountOut Minimum amount of USDC to receive + */ + function swapCUSDCForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDC, officialUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDC for cUSDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDC to sell + * @param minAmountOut Minimum amount of cUSDC to receive + */ + function swapUSDCForCUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(officialUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDC, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDT for cUSDC via cUSDT/cUSDC DODO PMM pool (public liquidity pair per Master Plan §4) + */ + function swapCUSDTForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(compliantUSDC).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, compliantUSDT, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for cUSDT via cUSDT/cUSDC DODO PMM pool + */ + function swapUSDCForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(compliantUSDT).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, compliantUSDC, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Set optional ReserveSystem for oracle-backed mid price + * @param reserveSystem_ ReserveSystem address (address(0) to disable) + */ + function setReserveSystem(address reserveSystem_) external onlyRole(DEFAULT_ADMIN_ROLE) { + reserveSystem = IReserveSystem(reserveSystem_); + emit ReserveSystemSet(reserveSystem_); + } + + /** + * @notice Get pool price: oracle (ReserveSystem) if configured and available, else pool getMidPrice() + * @param pool Pool address + * @return price Price in 18 decimals (quote per base; 1e18 = $1 for stablecoins) + */ + function getPoolPriceOrOracle(address pool) public view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + if (address(reserveSystem) != address(0)) { + PoolConfig memory config = poolConfigs[pool]; + try reserveSystem.getConversionPrice(config.baseToken, config.quoteToken) returns (uint256 oraclePrice) { + if (oraclePrice > 0) return oraclePrice; + } catch { } + } + return IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get current pool price (pool mid only; use getPoolPriceOrOracle for oracle-backed price) + * @param pool Pool address + * @return price Current mid price (1e18 = $1 for stablecoins) + */ + function getPoolPrice(address pool) external view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + price = IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get pool reserves + * @param pool Pool address + * @return baseReserve Base token reserve + * @return quoteReserve Quote token reserve + */ + function getPoolReserves(address pool) external view returns (uint256 baseReserve, uint256 quoteReserve) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + (baseReserve, quoteReserve) = IDODOPMMPool(pool).getVaultReserve(); + } + + /** + * @notice Get pool configuration + * @param pool Pool address + * @return config Pool configuration struct + */ + function getPoolConfig(address pool) external view returns (PoolConfig memory config) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + config = poolConfigs[pool]; + } + + /** + * @notice Get all registered pools + * @return List of all pool addresses + */ + function getAllPools() external view returns (address[] memory) { + return allPools; + } + + /** + * @notice Remove pool (emergency only) + * @param pool Pool address to remove + */ + function removePool(address pool) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + + PoolConfig memory config = poolConfigs[pool]; + pools[config.baseToken][config.quoteToken] = address(0); + pools[config.quoteToken][config.baseToken] = address(0); + isRegisteredPool[pool] = false; + + delete poolConfigs[pool]; + + emit PoolRemoved(pool); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/dex/PrivatePoolRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/dex/PrivatePoolRegistry.sol new file mode 100644 index 0000000..20ebf0c --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/dex/PrivatePoolRegistry.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title PrivatePoolRegistry + * @notice Registry of private XAU-anchored stabilization pools (Master Plan Phase 2). + * @dev Only the Stabilizer (or whitelisted keeper) should execute swaps for rebalancing. + * Liquidity provision can be restricted via STABILIZER_LP_ROLE when enforced by a wrapper or runbook. + */ +contract PrivatePoolRegistry is AccessControl { + bytes32 public constant STABILIZER_LP_ROLE = keccak256("STABILIZER_LP_ROLE"); + + /// @dev Canonical key: (token0, token1) where token0 < token1 + mapping(address => mapping(address => address)) private _pools; + + event PrivatePoolRegistered( + address indexed tokenA, + address indexed tokenB, + address indexed pool + ); + event PrivatePoolRemoved( + address indexed tokenA, + address indexed tokenB, + address indexed pool + ); + + constructor(address admin) { + require(admin != address(0), "PrivatePoolRegistry: zero admin"); + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + /** + * @notice Register a private pool for a token pair. + * @param tokenA First token (order used for storage; getPrivatePool is order-agnostic) + * @param tokenB Second token + * @param poolAddress DODO pool address (e.g. from DODOPMMIntegration.createPool) + */ + function register( + address tokenA, + address tokenB, + address poolAddress + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(tokenA != address(0) && tokenB != address(0), "PrivatePoolRegistry: zero token"); + require(poolAddress != address(0), "PrivatePoolRegistry: zero pool"); + require(tokenA != tokenB, "PrivatePoolRegistry: same token"); + + (address t0, address t1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); + require(_pools[t0][t1] == address(0), "PrivatePoolRegistry: pool already set"); + + _pools[t0][t1] = poolAddress; + + emit PrivatePoolRegistered(tokenA, tokenB, poolAddress); + } + + /** + * @notice Remove a private pool registration (e.g. migration). + */ + function unregister(address tokenA, address tokenB) external onlyRole(DEFAULT_ADMIN_ROLE) { + (address t0, address t1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); + address pool = _pools[t0][t1]; + require(pool != address(0), "PrivatePoolRegistry: not registered"); + + delete _pools[t0][t1]; + emit PrivatePoolRemoved(tokenA, tokenB, pool); + } + + /** + * @notice Get the private pool for a token pair (order-agnostic). + * @param tokenIn One of the pair + * @param tokenOut The other + * @return pool The registered pool address, or address(0) if none + */ + function getPrivatePool(address tokenIn, address tokenOut) external view returns (address pool) { + if (tokenIn == tokenOut) return address(0); + (address t0, address t1) = tokenIn < tokenOut ? (tokenIn, tokenOut) : (tokenOut, tokenIn); + return _pools[t0][t1]; + } + + /** + * @notice Check if an address is allowed to add liquidity (has STABILIZER_LP_ROLE). + * @dev Use in a wrapper or runbook; DODOPMMIntegration.addLiquidity does not check this. + */ + function isLpAllowed(address account) external view returns (bool) { + return hasRole(STABILIZER_LP_ROLE, account); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/emoney/BridgeVault138.sol b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/BridgeVault138.sol new file mode 100644 index 0000000..652effa --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/BridgeVault138.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title BridgeVault138 + * @notice Stub for build; full implementation when emoney module is restored + */ +contract BridgeVault138 is AccessControl { + constructor(address admin, address, address) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/emoney/ComplianceRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/ComplianceRegistry.sol new file mode 100644 index 0000000..e481974 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/ComplianceRegistry.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title ComplianceRegistry + * @notice Stub for build; full implementation when emoney module is restored + */ +contract ComplianceRegistry is AccessControl { + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + function canTransfer(address, address, address, uint256) external pure returns (bool) { + return true; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/emoney/PolicyManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/PolicyManager.sol new file mode 100644 index 0000000..92e48a6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/PolicyManager.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title PolicyManager + * @notice Stub for build; full implementation when emoney module is restored + */ +contract PolicyManager is AccessControl { + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + function canTransfer(address, address, address, uint256) external pure returns (bool isAuthorized, bytes32 reasonCode) { + return (true, bytes32(0)); + } + + function canTransferWithContext(address, address, address, uint256, bytes memory) external pure returns (bool isAuthorized, bytes32 reasonCode) { + return (true, bytes32(0)); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/emoney/TokenFactory138.sol b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/TokenFactory138.sol new file mode 100644 index 0000000..dc92292 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/TokenFactory138.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title TokenFactory138 + * @notice Stub for build; full implementation when emoney module is restored + */ +contract TokenFactory138 is AccessControl { + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/emoney/interfaces/IAccountWalletRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/interfaces/IAccountWalletRegistry.sol new file mode 100644 index 0000000..0fa383f --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/interfaces/IAccountWalletRegistry.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IAccountWalletRegistry + * @notice Registry linking account refs to wallet refs + */ +struct WalletLink { + bytes32 walletRefId; + uint64 linkedAt; + bool active; + bytes32 provider; +} + +interface IAccountWalletRegistry { + event AccountWalletLinked(bytes32 indexed accountRefId, bytes32 indexed walletRefId, bytes32 provider, uint64 linkedAt); + event AccountWalletUnlinked(bytes32 indexed accountRefId, bytes32 indexed walletRefId); + + function linkAccountToWallet(bytes32 accountRefId, bytes32 walletRefId, bytes32 provider) external; + function unlinkAccountFromWallet(bytes32 accountRefId, bytes32 walletRefId) external; + function getWallets(bytes32 accountRefId) external view returns (WalletLink[] memory); + function getAccounts(bytes32 walletRefId) external view returns (bytes32[] memory); + function isLinked(bytes32 accountRefId, bytes32 walletRefId) external view returns (bool); + function isActive(bytes32 accountRefId, bytes32 walletRefId) external view returns (bool); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/emoney/interfaces/ITokenFactory138.sol b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/interfaces/ITokenFactory138.sol new file mode 100644 index 0000000..019c012 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/interfaces/ITokenFactory138.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ITokenFactory138 + * @notice Minimal interface for TokenFactory138 (stub for build) + */ +interface ITokenFactory138 { +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/emoney/interfaces/IeMoneyToken.sol b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/interfaces/IeMoneyToken.sol new file mode 100644 index 0000000..b5a9b99 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/emoney/interfaces/IeMoneyToken.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IeMoneyToken + * @notice Minimal interface for eMoney tokens (mint/burn with reason) + */ +interface IeMoneyToken { + function mint(address to, uint256 amount, bytes32 reasonHash) external; + function burn(address from, uint256 amount, bytes32 reasonHash) external; +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/governance/GovernanceController.sol b/verification-sources/chain138-buildinfo-7678218/contracts/governance/GovernanceController.sol new file mode 100644 index 0000000..6df19c3 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/governance/GovernanceController.sol @@ -0,0 +1,391 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../registry/UniversalAssetRegistry.sol"; + +/** + * @title GovernanceController + * @notice Hybrid governance with progressive timelock based on asset risk + * @dev Modes: Admin-only, 1-day timelock, 3-day + voting, 7-day + quorum + */ +contract GovernanceController is + Initializable, + AccessControlUpgradeable, + ReentrancyGuardUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); + bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); + bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + // Governance modes + enum GovernanceMode { + AdminOnly, // Mode 1: Admin can execute immediately + TimelockShort, // Mode 2: 1 day timelock + TimelockModerate, // Mode 3: 3 days + voting required + TimelockLong // Mode 4: 7 days + quorum required + } + + // Proposal states + enum ProposalState { + Pending, + Active, + Canceled, + Defeated, + Succeeded, + Queued, + Expired, + Executed + } + + struct Proposal { + uint256 proposalId; + address proposer; + address[] targets; + uint256[] values; + bytes[] calldatas; + string description; + uint256 startBlock; + uint256 endBlock; + uint256 eta; + GovernanceMode mode; + ProposalState state; + uint256 forVotes; + uint256 againstVotes; + uint256 abstainVotes; + mapping(address => bool) hasVoted; + } + + // Storage + UniversalAssetRegistry public assetRegistry; + mapping(uint256 => Proposal) public proposals; + uint256 public proposalCount; + + // Governance parameters + uint256 public votingDelay; // Blocks to wait before voting starts + uint256 public votingPeriod; // Blocks voting is open + uint256 public quorumNumerator; // Percentage required for quorum + + uint256 public constant TIMELOCK_SHORT = 1 days; + uint256 public constant TIMELOCK_MODERATE = 3 days; + uint256 public constant TIMELOCK_LONG = 7 days; + uint256 public constant GRACE_PERIOD = 14 days; + + // Events + event ProposalCreated( + uint256 indexed proposalId, + address proposer, + address[] targets, + uint256[] values, + string[] signatures, + bytes[] calldatas, + uint256 startBlock, + uint256 endBlock, + string description + ); + + event VoteCast( + address indexed voter, + uint256 proposalId, + uint8 support, + uint256 weight, + string reason + ); + + event ProposalQueued(uint256 indexed proposalId, uint256 eta); + event ProposalExecuted(uint256 indexed proposalId); + event ProposalCanceled(uint256 indexed proposalId); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + address _assetRegistry, + address admin + ) external initializer { + __AccessControl_init(); + __ReentrancyGuard_init(); + __UUPSUpgradeable_init(); + + require(_assetRegistry != address(0), "Zero registry"); + + assetRegistry = UniversalAssetRegistry(_assetRegistry); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(PROPOSER_ROLE, admin); + _grantRole(EXECUTOR_ROLE, admin); + _grantRole(CANCELLER_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + + votingDelay = 1; // 1 block + votingPeriod = 50400; // ~7 days + quorumNumerator = 4; // 4% quorum + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Create a new proposal + */ + function propose( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + string memory description, + GovernanceMode mode + ) external onlyRole(PROPOSER_ROLE) returns (uint256) { + require(targets.length == values.length, "Length mismatch"); + require(targets.length == calldatas.length, "Length mismatch"); + require(targets.length > 0, "Empty proposal"); + + proposalCount++; + uint256 proposalId = proposalCount; + + Proposal storage proposal = proposals[proposalId]; + proposal.proposalId = proposalId; + proposal.proposer = msg.sender; + proposal.targets = targets; + proposal.values = values; + proposal.calldatas = calldatas; + proposal.description = description; + proposal.startBlock = block.number + votingDelay; + proposal.endBlock = proposal.startBlock + votingPeriod; + proposal.mode = mode; + proposal.state = ProposalState.Pending; + + emit ProposalCreated( + proposalId, + msg.sender, + targets, + values, + new string[](targets.length), + calldatas, + proposal.startBlock, + proposal.endBlock, + description + ); + + return proposalId; + } + + /** + * @notice Cast a vote on a proposal + */ + function castVote( + uint256 proposalId, + uint8 support + ) external returns (uint256) { + return _castVote(msg.sender, proposalId, support, ""); + } + + /** + * @notice Cast a vote with reason + */ + function castVoteWithReason( + uint256 proposalId, + uint8 support, + string calldata reason + ) external returns (uint256) { + return _castVote(msg.sender, proposalId, support, reason); + } + + /** + * @notice Internal vote casting + */ + function _castVote( + address voter, + uint256 proposalId, + uint8 support, + string memory reason + ) internal returns (uint256) { + Proposal storage proposal = proposals[proposalId]; + + require(state(proposalId) == ProposalState.Active, "Not active"); + require(!proposal.hasVoted[voter], "Already voted"); + require(support <= 2, "Invalid support"); + + uint256 weight = _getVotes(voter); + + proposal.hasVoted[voter] = true; + + if (support == 0) { + proposal.againstVotes += weight; + } else if (support == 1) { + proposal.forVotes += weight; + } else { + proposal.abstainVotes += weight; + } + + emit VoteCast(voter, proposalId, support, weight, reason); + + return weight; + } + + /** + * @notice Queue a successful proposal + */ + function queue(uint256 proposalId) external { + require(state(proposalId) == ProposalState.Succeeded, "Not succeeded"); + + Proposal storage proposal = proposals[proposalId]; + uint256 delay = _getTimelockDelay(proposal.mode); + uint256 eta = block.timestamp + delay; + + proposal.eta = eta; + proposal.state = ProposalState.Queued; + + emit ProposalQueued(proposalId, eta); + } + + /** + * @notice Execute a queued proposal + */ + function execute(uint256 proposalId) external payable nonReentrant { + require(state(proposalId) == ProposalState.Queued, "Not queued"); + + Proposal storage proposal = proposals[proposalId]; + require(block.timestamp >= proposal.eta, "Timelock not met"); + require(block.timestamp <= proposal.eta + GRACE_PERIOD, "Expired"); + + proposal.state = ProposalState.Executed; + + for (uint256 i = 0; i < proposal.targets.length; i++) { + _executeTransaction( + proposal.targets[i], + proposal.values[i], + proposal.calldatas[i] + ); + } + + emit ProposalExecuted(proposalId); + } + + /** + * @notice Cancel a proposal + */ + function cancel(uint256 proposalId) external onlyRole(CANCELLER_ROLE) { + ProposalState currentState = state(proposalId); + require( + currentState != ProposalState.Executed && + currentState != ProposalState.Canceled, + "Cannot cancel" + ); + + Proposal storage proposal = proposals[proposalId]; + proposal.state = ProposalState.Canceled; + + emit ProposalCanceled(proposalId); + } + + /** + * @notice Get proposal state + */ + function state(uint256 proposalId) public view returns (ProposalState) { + Proposal storage proposal = proposals[proposalId]; + + if (proposal.state == ProposalState.Executed) return ProposalState.Executed; + if (proposal.state == ProposalState.Canceled) return ProposalState.Canceled; + if (proposal.state == ProposalState.Queued) { + if (block.timestamp >= proposal.eta + GRACE_PERIOD) { + return ProposalState.Expired; + } + return ProposalState.Queued; + } + + if (block.number <= proposal.startBlock) return ProposalState.Pending; + if (block.number <= proposal.endBlock) return ProposalState.Active; + + if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) { + return ProposalState.Succeeded; + } else { + return ProposalState.Defeated; + } + } + + /** + * @notice Execute transaction + */ + function _executeTransaction( + address target, + uint256 value, + bytes memory data + ) internal { + (bool success, bytes memory returndata) = target.call{value: value}(data); + + if (!success) { + if (returndata.length > 0) { + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert("Execution failed"); + } + } + } + + /** + * @notice Get timelock delay based on governance mode + */ + function _getTimelockDelay(GovernanceMode mode) internal pure returns (uint256) { + if (mode == GovernanceMode.AdminOnly) return 0; + if (mode == GovernanceMode.TimelockShort) return TIMELOCK_SHORT; + if (mode == GovernanceMode.TimelockModerate) return TIMELOCK_MODERATE; + return TIMELOCK_LONG; + } + + /** + * @notice Check if quorum is reached + */ + function _quorumReached(uint256 proposalId) internal view returns (bool) { + Proposal storage proposal = proposals[proposalId]; + + if (proposal.mode == GovernanceMode.AdminOnly || + proposal.mode == GovernanceMode.TimelockShort) { + return true; // No quorum required + } + + uint256 totalVotes = proposal.forVotes + proposal.againstVotes + proposal.abstainVotes; + uint256 totalSupply = assetRegistry.getValidators().length; + + return (totalVotes * 100) / totalSupply >= quorumNumerator; + } + + /** + * @notice Check if vote succeeded + */ + function _voteSucceeded(uint256 proposalId) internal view returns (bool) { + Proposal storage proposal = proposals[proposalId]; + return proposal.forVotes > proposal.againstVotes; + } + + /** + * @notice Get voting power + */ + function _getVotes(address account) internal view returns (uint256) { + return assetRegistry.isValidator(account) ? 1 : 0; + } + + // Admin functions + + function setVotingDelay(uint256 newVotingDelay) external onlyRole(DEFAULT_ADMIN_ROLE) { + votingDelay = newVotingDelay; + } + + function setVotingPeriod(uint256 newVotingPeriod) external onlyRole(DEFAULT_ADMIN_ROLE) { + votingPeriod = newVotingPeriod; + } + + function setQuorumNumerator(uint256 newQuorumNumerator) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(newQuorumNumerator <= 100, "Invalid quorum"); + quorumNumerator = newQuorumNumerator; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/governance/MultiSig.sol b/verification-sources/chain138-buildinfo-7678218/contracts/governance/MultiSig.sol new file mode 100644 index 0000000..db2e34e --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/governance/MultiSig.sol @@ -0,0 +1,210 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; + +/** + * @title Multi-Signature Wallet + * @notice Simple multi-sig implementation for admin operations + * @dev For production, consider using Gnosis Safe or similar battle-tested solution + */ +contract MultiSig is Ownable { + address[] public owners; + mapping(address => bool) public isOwner; + uint256 public required; + + struct Transaction { + address to; + uint256 value; + bytes data; + bool executed; + uint256 confirmations; + } + + Transaction[] public transactions; + mapping(uint256 => mapping(address => bool)) public confirmations; + + event Confirmation(address indexed sender, uint256 indexed transactionId); + event Revocation(address indexed sender, uint256 indexed transactionId); + event Submission(uint256 indexed transactionId); + event Execution(uint256 indexed transactionId); + event ExecutionFailure(uint256 indexed transactionId); + event OwnerAddition(address indexed owner); + event OwnerRemoval(address indexed owner); + event RequirementChange(uint256 required); + + modifier onlyWallet() { + require(msg.sender == address(this), "MultiSig: only wallet"); + _; + } + + modifier ownerDoesNotExist(address owner) { + require(!isOwner[owner], "MultiSig: owner exists"); + _; + } + + modifier ownerExists(address owner) { + require(isOwner[owner], "MultiSig: owner does not exist"); + _; + } + + modifier transactionExists(uint256 transactionId) { + require(transactions[transactionId].to != address(0), "MultiSig: transaction does not exist"); + _; + } + + modifier confirmed(uint256 transactionId, address owner) { + require(confirmations[transactionId][owner], "MultiSig: not confirmed"); + _; + } + + modifier notConfirmed(uint256 transactionId, address owner) { + require(!confirmations[transactionId][owner], "MultiSig: already confirmed"); + _; + } + + modifier notExecuted(uint256 transactionId) { + require(!transactions[transactionId].executed, "MultiSig: already executed"); + _; + } + + modifier validRequirement(uint256 ownerCount, uint256 _required) { + require(_required <= ownerCount && _required > 0 && ownerCount > 0, "MultiSig: invalid requirement"); + _; + } + + /** + * @notice Constructor sets initial owners and required confirmations + */ + constructor(address[] memory _owners, uint256 _required) Ownable(msg.sender) validRequirement(_owners.length, _required) { + for (uint256 i = 0; i < _owners.length; i++) { + require(_owners[i] != address(0) && !isOwner[_owners[i]], "MultiSig: invalid owner"); + isOwner[_owners[i]] = true; + owners.push(_owners[i]); + } + required = _required; + } + + /** + * @notice Submit a transaction + */ + function submitTransaction(address to, uint256 value, bytes memory data) external ownerExists(msg.sender) returns (uint256 transactionId) { + transactionId = transactions.length; + transactions.push(Transaction({ + to: to, + value: value, + data: data, + executed: false, + confirmations: 0 + })); + emit Submission(transactionId); + confirmTransaction(transactionId); + return transactionId; + } + + /** + * @notice Confirm a transaction + */ + function confirmTransaction(uint256 transactionId) public ownerExists(msg.sender) transactionExists(transactionId) notConfirmed(transactionId, msg.sender) { + confirmations[transactionId][msg.sender] = true; + transactions[transactionId].confirmations++; + emit Confirmation(msg.sender, transactionId); + } + + /** + * @notice Revoke a confirmation + */ + function revokeConfirmation(uint256 transactionId) external ownerExists(msg.sender) confirmed(transactionId, msg.sender) notExecuted(transactionId) { + confirmations[transactionId][msg.sender] = false; + transactions[transactionId].confirmations--; + emit Revocation(msg.sender, transactionId); + } + + /** + * @notice Execute a confirmed transaction + */ + function executeTransaction(uint256 transactionId) external ownerExists(msg.sender) notExecuted(transactionId) { + require(transactions[transactionId].confirmations >= required, "MultiSig: insufficient confirmations"); + Transaction storage txn = transactions[transactionId]; + txn.executed = true; + + (bool success, ) = txn.to.call{value: txn.value}(txn.data); + if (success) { + emit Execution(transactionId); + } else { + emit ExecutionFailure(transactionId); + txn.executed = false; + } + } + + /** + * @notice Add a new owner + */ + function addOwner(address owner) external onlyWallet ownerDoesNotExist(owner) { + isOwner[owner] = true; + owners.push(owner); + emit OwnerAddition(owner); + } + + /** + * @notice Remove an owner + */ + function removeOwner(address owner) external onlyWallet ownerExists(owner) { + isOwner[owner] = false; + for (uint256 i = 0; i < owners.length - 1; i++) { + if (owners[i] == owner) { + owners[i] = owners[owners.length - 1]; + break; + } + } + owners.pop(); + if (required > owners.length) { + changeRequirement(owners.length); + } + emit OwnerRemoval(owner); + } + + /** + * @notice Change the number of required confirmations + */ + function changeRequirement(uint256 _required) public onlyWallet validRequirement(owners.length, _required) { + required = _required; + emit RequirementChange(_required); + } + + /** + * @notice Get transaction count + */ + function getTransactionCount() external view returns (uint256) { + return transactions.length; + } + + /** + * @notice Get owners + */ + function getOwners() external view returns (address[] memory) { + return owners; + } + + /** + * @notice Get transaction details + */ + function getTransaction(uint256 transactionId) external view returns ( + address to, + uint256 value, + bytes memory data, + bool executed, + uint256 requiredConfirmations + ) { + Transaction storage txn = transactions[transactionId]; + return (txn.to, txn.value, txn.data, txn.executed, txn.confirmations); + } + + /** + * @notice Check if transaction is confirmed + */ + function isConfirmed(uint256 transactionId) public view returns (bool) { + return transactions[transactionId].confirmations >= required; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/governance/Voting.sol b/verification-sources/chain138-buildinfo-7678218/contracts/governance/Voting.sol new file mode 100644 index 0000000..85c96a4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/governance/Voting.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/Ownable.sol"; + +/** + * @title Voting Contract + * @notice On-chain voting mechanism for governance proposals + * @dev Simple voting implementation with yes/no votes + */ +contract Voting is Ownable { + struct Proposal { + string description; + uint256 yesVotes; + uint256 noVotes; + uint256 startTime; + uint256 endTime; + bool executed; + mapping(address => bool) hasVoted; + } + + Proposal[] public proposals; + mapping(address => bool) public voters; + uint256 public votingPeriod = 7 days; + uint256 public quorum = 50; // 50% of voters + + event ProposalCreated(uint256 indexed proposalId, string description); + event VoteCast(uint256 indexed proposalId, address indexed voter, bool support); + event ProposalExecuted(uint256 indexed proposalId); + + modifier onlyVoter() { + require(voters[msg.sender], "Voting: not a voter"); + _; + } + + constructor() Ownable(msg.sender) {} + + /** + * @notice Add a voter + */ + function addVoter(address voter) external onlyOwner { + voters[voter] = true; + } + + /** + * @notice Remove a voter + */ + function removeVoter(address voter) external onlyOwner { + voters[voter] = false; + } + + /** + * @notice Create a new proposal + */ + function createProposal(string memory description) external onlyVoter returns (uint256) { + uint256 proposalId = proposals.length; + + Proposal storage proposal = proposals.push(); + proposal.description = description; + proposal.startTime = block.timestamp; + proposal.endTime = block.timestamp + votingPeriod; + + emit ProposalCreated(proposalId, description); + return proposalId; + } + + /** + * @notice Vote on a proposal + */ + function vote(uint256 proposalId, bool support) external onlyVoter { + Proposal storage proposal = proposals[proposalId]; + require(block.timestamp >= proposal.startTime, "Voting: not started"); + require(block.timestamp <= proposal.endTime, "Voting: ended"); + require(!proposal.hasVoted[msg.sender], "Voting: already voted"); + + proposal.hasVoted[msg.sender] = true; + + if (support) { + proposal.yesVotes++; + } else { + proposal.noVotes++; + } + + emit VoteCast(proposalId, msg.sender, support); + } + + /** + * @notice Execute a proposal if it passes + */ + function executeProposal(uint256 proposalId) external { + Proposal storage proposal = proposals[proposalId]; + require(block.timestamp > proposal.endTime, "Voting: not ended"); + require(!proposal.executed, "Voting: already executed"); + + uint256 totalVotes = proposal.yesVotes + proposal.noVotes; + require(totalVotes > 0, "Voting: no votes"); + + // Check quorum + uint256 voterCount = _getVoterCount(); + require((totalVotes * 100) / voterCount >= quorum, "Voting: quorum not met"); + + // Check if proposal passed + require(proposal.yesVotes > proposal.noVotes, "Voting: proposal failed"); + + proposal.executed = true; + emit ProposalExecuted(proposalId); + } + + /** + * @notice Get proposal details + */ + function getProposal(uint256 proposalId) external view returns ( + string memory description, + uint256 yesVotes, + uint256 noVotes, + uint256 startTime, + uint256 endTime, + bool executed + ) { + Proposal storage proposal = proposals[proposalId]; + return ( + proposal.description, + proposal.yesVotes, + proposal.noVotes, + proposal.startTime, + proposal.endTime, + proposal.executed + ); + } + + /** + * @notice Get voter count + */ + function _getVoterCount() internal view returns (uint256) { + // Simplified - in production, maintain a count + return 10; // Placeholder + } + + /** + * @notice Update voting period + */ + function setVotingPeriod(uint256 newPeriod) external onlyOwner { + votingPeriod = newPeriod; + } + + /** + * @notice Update quorum + */ + function setQuorum(uint256 newQuorum) external onlyOwner { + require(newQuorum <= 100, "Voting: invalid quorum"); + quorum = newQuorum; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/interfaces/IAggregator.sol b/verification-sources/chain138-buildinfo-7678218/contracts/interfaces/IAggregator.sol new file mode 100644 index 0000000..11c88e6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/interfaces/IAggregator.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IAggregator + * @notice Interface for oracle aggregator (Chainlink-compatible) + */ +interface IAggregator { + function latestAnswer() external view returns (int256); + + function latestRoundData() + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ); + + function getRoundData(uint80 _roundId) + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ); + + function updateAnswer(uint256 answer) external; + + function decimals() external view returns (uint8); + function description() external view returns (string memory); + function version() external view returns (uint256); + function latestRound() external view returns (uint256); +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/ComplianceGuard.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/ComplianceGuard.sol new file mode 100644 index 0000000..75a34b1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/ComplianceGuard.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./interfaces/IComplianceGuard.sol"; +import "./libraries/ISO4217WCompliance.sol"; + +/** + * @title ComplianceGuard + * @notice Enforces compliance rules for ISO-4217 W tokens + * @dev Hard constraints: m=1.0, GRU isolation, reserve constraints + */ +contract ComplianceGuard is IComplianceGuard, AccessControl { + bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ADMIN_ROLE, admin); + } + + /** + * @notice Validate mint operation + * @param currencyCode ISO-4217 currency code + * @param amount Amount to mint + * @param currentSupply Current token supply + * @param verifiedReserve Verified reserve balance + * @return isValid True if mint is compliant + * @return reasonCode Reason if not compliant + */ + function validateMint( + string memory currencyCode, + uint256 amount, + uint256 currentSupply, + uint256 verifiedReserve + ) external pure override returns (bool isValid, bytes32 reasonCode) { + // Check ISO-4217 format + if (!ISO4217WCompliance.isValidISO4217Format(currencyCode)) { + return (false, keccak256("INVALID_ISO4217_FORMAT")); + } + + // Check GRU isolation + if (ISO4217WCompliance.violatesGRUIsolation(currencyCode)) { + return (false, keccak256("GRU_ISOLATION_VIOLATION")); + } + + // Validate money multiplier = 1.0 + (bool multiplierValid, bytes32 multiplierReason) = ISO4217WCompliance.validateMoneyMultiplier( + verifiedReserve, + currentSupply + ); + if (!multiplierValid) { + return (false, multiplierReason); + } + + // Validate reserve for mint + (bool reserveValid, bytes32 reserveReason) = ISO4217WCompliance.validateReserveForMint( + verifiedReserve, + currentSupply, + amount + ); + if (!reserveValid) { + return (false, reserveReason); + } + + // Event emission removed - this is a pure function for validation only + // Events should be emitted by calling functions if needed + return (true, bytes32(0)); + } + + /** + * @notice Validate that money multiplier = 1.0 + * @dev Hard constraint: m = 1.0 (no fractional reserve) + * @param reserve Reserve balance + * @param supply Token supply + * @return isValid True if multiplier = 1.0 + */ + function validateMoneyMultiplier(uint256 reserve, uint256 supply) external pure override returns (bool isValid) { + (isValid, ) = ISO4217WCompliance.validateMoneyMultiplier(reserve, supply); + } + + /** + * @notice Check if currency is ISO-4217 compliant + * @param currencyCode Currency code to validate + * @return isISO4217 True if ISO-4217 compliant + */ + function isISO4217Compliant(string memory currencyCode) external pure override returns (bool isISO4217) { + return ISO4217WCompliance.isValidISO4217Format(currencyCode) && + !ISO4217WCompliance.violatesGRUIsolation(currencyCode); + } + + /** + * @notice Check if operation violates GRU isolation + * @param currencyCode Currency code + * @return violatesIsolation True if GRU linkage detected + */ + function violatesGRUIsolation(string memory currencyCode) external pure override returns (bool violatesIsolation) { + return ISO4217WCompliance.violatesGRUIsolation(currencyCode); + } + + /** + * @notice Validate reserve sufficiency + * @param reserve Reserve balance + * @param supply Token supply + * @return isSufficient True if reserve >= supply + */ + function isReserveSufficient(uint256 reserve, uint256 supply) external pure override returns (bool isSufficient) { + return ISO4217WCompliance.isReserveSufficient(reserve, supply); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/ISO4217WToken.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/ISO4217WToken.sol new file mode 100644 index 0000000..777641c --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/ISO4217WToken.sol @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "./interfaces/IISO4217WToken.sol"; +import "./libraries/ISO4217WCompliance.sol"; + +/** + * @title ISO4217WToken + * @notice ISO-4217 W token (e.g., USDW, EURW, GBPW) - M1 eMoney token + * @dev Represents 1:1 redeemable digital claim on fiat currency + * + * COMPLIANCE: + * - Classification: M1 eMoney + * - Legal Tender: NO + * - Synthetic / Reserve Unit: NO + * - Commodity-Backed: NO + * - Money Multiplier: m = 1.0 (hard-fixed, no fractional reserve) + * - Backing: 1:1 with fiat currency in segregated custodial accounts + * - GRU Isolation: Direct/indirect GRU conversion prohibited + */ +contract ISO4217WToken is + IISO4217WToken, + Initializable, + ERC20Upgradeable, + AccessControlUpgradeable, + UUPSUpgradeable, + ReentrancyGuardUpgradeable +{ + using ISO4217WCompliance for *; + + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + bytes32 public constant RESERVE_UPDATE_ROLE = keccak256("RESERVE_UPDATE_ROLE"); + + string private _currencyCode; // ISO-4217 code (e.g., "USD") + uint8 private _decimals; // Token decimals (typically 2 for fiat) + uint256 private _verifiedReserve; // Verified reserve balance in base currency units + address private _custodian; + address private _mintController; + address private _burnController; + address private _complianceGuard; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /** + * @notice Initialize the ISO-4217 W token + * @param name Token name (e.g., "USDW Token") + * @param symbol Token symbol (e.g., "USDW") + * @param currencyCode_ ISO-4217 currency code (e.g., "USD") + * @param decimals_ Token decimals (typically 2 for fiat) + * @param custodian_ Custodian address + * @param mintController_ Mint controller address + * @param burnController_ Burn controller address + * @param complianceGuard_ Compliance guard address + * @param admin Admin address + */ + function initialize( + string memory name, + string memory symbol, + string memory currencyCode_, + uint8 decimals_, + address custodian_, + address mintController_, + address burnController_, + address complianceGuard_, + address admin + ) external initializer { + __ERC20_init(name, symbol); + __AccessControl_init(); + __UUPSUpgradeable_init(); + __ReentrancyGuard_init(); + + // Validate ISO-4217 format + require( + ISO4217WCompliance.isValidISO4217Format(currencyCode_), + "ISO4217WToken: invalid ISO-4217 format" + ); + + // Validate token symbol matches W pattern + require( + ISO4217WCompliance.validateTokenSymbol(currencyCode_, symbol), + "ISO4217WToken: token symbol must be W" + ); + + // Validate GRU isolation + require( + !ISO4217WCompliance.violatesGRUIsolation(currencyCode_), + "ISO4217WToken: GRU isolation violation" + ); + + require(custodian_ != address(0), "ISO4217WToken: zero custodian"); + require(mintController_ != address(0), "ISO4217WToken: zero mint controller"); + require(burnController_ != address(0), "ISO4217WToken: zero burn controller"); + require(complianceGuard_ != address(0), "ISO4217WToken: zero compliance guard"); + + _currencyCode = currencyCode_; + _decimals = decimals_; + _custodian = custodian_; + _mintController = mintController_; + _burnController = burnController_; + _complianceGuard = complianceGuard_; + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MINTER_ROLE, mintController_); + _grantRole(BURNER_ROLE, burnController_); + } + + /** + * @notice Get the ISO-4217 currency code this token represents + * @return currencyCode 3-letter ISO-4217 code + */ + function currencyCode() external view override returns (string memory) { + return _currencyCode; + } + + /** + * @notice Override totalSupply to resolve multiple inheritance conflict + * @return Total supply of tokens + */ + function totalSupply() public view override(ERC20Upgradeable, IISO4217WToken) returns (uint256) { + return super.totalSupply(); + } + + /** + * @notice Get verified reserve balance + * @return reserveBalance Reserve balance in base currency units + */ + function verifiedReserve() external view override returns (uint256) { + return _verifiedReserve; + } + + /** + * @notice Check if reserves are sufficient + * @dev Reserve MUST be >= supply (enforcing 1:1 backing) + * @return isSufficient True if verifiedReserve >= totalSupply + */ + function isReserveSufficient() external view override returns (bool) { + return ISO4217WCompliance.isReserveSufficient(_verifiedReserve, totalSupply()); + } + + /** + * @notice Get custodian address + */ + function custodian() external view override returns (address) { + return _custodian; + } + + /** + * @notice Get mint controller address + */ + function mintController() external view override returns (address) { + return _mintController; + } + + /** + * @notice Get burn controller address + */ + function burnController() external view override returns (address) { + return _burnController; + } + + /** + * @notice Get compliance guard address + */ + function complianceGuard() external view override returns (address) { + return _complianceGuard; + } + + /** + * @notice Update verified reserve (oracle/attestation) + * @dev Can only be called by authorized reserve update role + * @param newReserve New reserve balance + */ + function updateVerifiedReserve(uint256 newReserve) external onlyRole(RESERVE_UPDATE_ROLE) { + uint256 currentSupply = totalSupply(); + + // Enforce money multiplier = 1.0 + // Reserve MUST be >= supply (1:1 backing or better) + if (newReserve < currentSupply) { + emit ReserveInsufficient(newReserve, currentSupply); + // Do not revert - allow flagging for monitoring + } + + _verifiedReserve = newReserve; + emit ReserveUpdated(newReserve, block.timestamp); + } + + /** + * @notice Mint tokens (only by mint controller) + * @param to Recipient address + * @param amount Amount to mint + */ + function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) nonReentrant { + require(to != address(0), "ISO4217WToken: zero address"); + require(amount > 0, "ISO4217WToken: zero amount"); + + uint256 currentSupply = totalSupply(); + uint256 newSupply = currentSupply + amount; + + // Enforce money multiplier = 1.0 + // Reserve MUST be >= new supply (1:1 backing) + require( + _verifiedReserve >= newSupply, + "ISO4217WToken: reserve insufficient - money multiplier violation" + ); + + _mint(to, amount); + emit Minted(to, amount, _currencyCode); + } + + /** + * @notice Burn tokens (only by burn controller) + * @param from Source address + * @param amount Amount to burn + */ + function burn(address from, uint256 amount) external onlyRole(BURNER_ROLE) nonReentrant { + require(amount > 0, "ISO4217WToken: zero amount"); + + _burn(from, amount); + emit Burned(from, amount, _currencyCode); + } + + /** + * @notice Override decimals (typically 2 for fiat currencies) + */ + function decimals() public view virtual override returns (uint8) { + return _decimals; + } + + /** + * @notice Authorize upgrade (UUPS) + * @dev Only non-monetary components may be upgraded + */ + function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) { + // In production, add checks to ensure monetary logic is immutable + // Only allow upgrades to non-monetary components + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/TokenFactory.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/TokenFactory.sol new file mode 100644 index 0000000..9a33c40 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/TokenFactory.sol @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import "./ISO4217WToken.sol"; +import "./interfaces/ITokenRegistry.sol"; +import "./interfaces/IComplianceGuard.sol"; +import "./libraries/ISO4217WCompliance.sol"; + +/** + * @title TokenFactory + * @notice Factory for deploying ISO-4217 W tokens + * @dev Creates UUPS upgradeable proxy tokens with proper configuration + */ +contract TokenFactory is AccessControl { + bytes32 public constant DEPLOYER_ROLE = keccak256("DEPLOYER_ROLE"); + + address public immutable tokenImplementation; + ITokenRegistry public tokenRegistry; + IComplianceGuard public complianceGuard; + address public reserveOracle; + address public mintController; + address public burnController; + + event TokenDeployed( + address indexed token, + string indexed currencyCode, + string tokenSymbol, + address indexed custodian + ); + + constructor( + address admin, + address tokenImplementation_, + address tokenRegistry_, + address complianceGuard_, + address reserveOracle_, + address mintController_, + address burnController_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(DEPLOYER_ROLE, admin); + + tokenImplementation = tokenImplementation_; + tokenRegistry = ITokenRegistry(tokenRegistry_); + complianceGuard = IComplianceGuard(complianceGuard_); + reserveOracle = reserveOracle_; + mintController = mintController_; + burnController = burnController_; + } + + /** + * @notice Deploy a new ISO-4217 W token + * @param currencyCode ISO-4217 currency code (e.g., "USD") + * @param name Token name (e.g., "USDW Token") + * @param symbol Token symbol (must be W, e.g., "USDW") + * @param decimals Token decimals (typically 2 for fiat) + * @param custodian Custodian address + * @return token Address of deployed token + */ + function deployToken( + string memory currencyCode, + string memory name, + string memory symbol, + uint8 decimals, + address custodian + ) external onlyRole(DEPLOYER_ROLE) returns (address token) { + // Validate ISO-4217 format + require( + ISO4217WCompliance.isValidISO4217Format(currencyCode), + "TokenFactory: invalid ISO-4217 format" + ); + + // Validate GRU isolation + require( + !ISO4217WCompliance.violatesGRUIsolation(currencyCode), + "TokenFactory: GRU isolation violation" + ); + + // Validate token symbol matches W pattern + require( + ISO4217WCompliance.validateTokenSymbol(currencyCode, symbol), + "TokenFactory: token symbol must be W" + ); + + require(custodian != address(0), "TokenFactory: zero custodian"); + require(bytes(name).length > 0, "TokenFactory: empty name"); + require(bytes(symbol).length > 0, "TokenFactory: empty symbol"); + + // Deploy UUPS proxy + bytes memory initData = abi.encodeWithSelector( + ISO4217WToken.initialize.selector, + name, + symbol, + currencyCode, + decimals, + custodian, + mintController, + burnController, + address(complianceGuard), + msg.sender // Admin + ); + + ERC1967Proxy proxy = new ERC1967Proxy(tokenImplementation, initData); + token = address(proxy); + + // Grant reserve update role to oracle + ISO4217WToken(token).grantRole(keccak256("RESERVE_UPDATE_ROLE"), reserveOracle); + + // Register token in registry + tokenRegistry.registerToken(currencyCode, token, symbol, decimals, custodian); + tokenRegistry.setMintController(currencyCode, mintController); + tokenRegistry.setBurnController(currencyCode, burnController); + + emit TokenDeployed(token, currencyCode, symbol, custodian); + } + + /** + * @notice Set system contract addresses + */ + function setTokenRegistry(address tokenRegistry_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(tokenRegistry_ != address(0), "TokenFactory: zero address"); + tokenRegistry = ITokenRegistry(tokenRegistry_); + } + + function setComplianceGuard(address complianceGuard_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(complianceGuard_ != address(0), "TokenFactory: zero address"); + complianceGuard = IComplianceGuard(complianceGuard_); + } + + function setReserveOracle(address reserveOracle_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(reserveOracle_ != address(0), "TokenFactory: zero address"); + reserveOracle = reserveOracle_; + } + + function setMintController(address mintController_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(mintController_ != address(0), "TokenFactory: zero address"); + mintController = mintController_; + } + + function setBurnController(address burnController_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(burnController_ != address(0), "TokenFactory: zero address"); + burnController = burnController_; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/controllers/BurnController.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/controllers/BurnController.sol new file mode 100644 index 0000000..a73897a --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/controllers/BurnController.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../interfaces/IBurnController.sol"; +import "../interfaces/IISO4217WToken.sol"; + +/** + * @title BurnController + * @notice Controls burning of ISO-4217 W tokens on redemption + * @dev Burn-before-release sequence for on-demand redemption at par + */ +contract BurnController is IBurnController, AccessControl, ReentrancyGuard { + bytes32 public constant REDEEMER_ROLE = keccak256("REDEEMER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + + uint256 private _redemptionCounter; + + mapping(address => bool) public isApprovedToken; + mapping(bytes32 => Redemption) public redemptions; + + struct Redemption { + address token; + address redeemer; + uint256 amount; + uint256 timestamp; + bool processed; + } + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REDEEMER_ROLE, admin); + _grantRole(BURNER_ROLE, admin); + } + + /** + * @notice Redeem tokens (burn and release fiat) + * @param token Token address + * @param from Redeemer address + * @param amount Amount to redeem (in token decimals) + * @return redemptionId Redemption ID for tracking + */ + function redeem( + address token, + address from, + uint256 amount + ) external override nonReentrant onlyRole(REDEEMER_ROLE) returns (bytes32 redemptionId) { + require(isApprovedToken[token], "BurnController: token not approved"); + require(amount > 0, "BurnController: zero amount"); + require(from != address(0), "BurnController: zero address"); + + // Check if redemption is allowed + require(this.canRedeem(token, amount), "BurnController: redemption not allowed"); + + // Burn tokens (atomic burn-before-release sequence) + IISO4217WToken tokenContract = IISO4217WToken(token); + tokenContract.burn(from, amount); + + // Generate redemption ID + _redemptionCounter++; + redemptionId = keccak256(abi.encodePacked(token, from, amount, _redemptionCounter, block.timestamp)); + + // Record redemption + redemptions[redemptionId] = Redemption({ + token: token, + redeemer: from, + amount: amount, + timestamp: block.timestamp, + processed: true + }); + + // Note: Fiat release happens off-chain or via separate payment system + // This contract handles the token burn portion + + emit Redeemed(token, from, amount, redemptionId); + } + + /** + * @notice Burn tokens without redemption (emergency/transfer) + * @param token Token address + * @param from Source address + * @param amount Amount to burn + */ + function burn(address token, address from, uint256 amount) external override nonReentrant onlyRole(BURNER_ROLE) { + require(isApprovedToken[token], "BurnController: token not approved"); + require(amount > 0, "BurnController: zero amount"); + + IISO4217WToken tokenContract = IISO4217WToken(token); + tokenContract.burn(from, amount); + + emit Burned(token, from, amount); + } + + /** + * @notice Check if redemption is allowed + * @param token Token address + * @param amount Amount to redeem + * @return canRedeem True if redemption is allowed + */ + function canRedeem(address token, uint256 amount) external view override returns (bool canRedeem) { + if (!isApprovedToken[token]) { + return false; + } + + IISO4217WToken tokenContract = IISO4217WToken(token); + uint256 totalSupply = tokenContract.totalSupply(); + + // Redemption is allowed if supply >= amount + // Additional checks (e.g., reserve sufficiency) would be added here + return totalSupply >= amount; + } + + /** + * @notice Approve a token for burning/redemption + * @param token Token address + */ + function approveToken(address token) external onlyRole(DEFAULT_ADMIN_ROLE) { + isApprovedToken[token] = true; + } + + /** + * @notice Revoke token approval + * @param token Token address + */ + function revokeToken(address token) external onlyRole(DEFAULT_ADMIN_ROLE) { + isApprovedToken[token] = false; + } + + /** + * @notice Get redemption information + * @param redemptionId Redemption ID + * @return redemption Redemption struct + */ + function getRedemption(bytes32 redemptionId) external view returns (Redemption memory redemption) { + return redemptions[redemptionId]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/controllers/MintController.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/controllers/MintController.sol new file mode 100644 index 0000000..d78ad08 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/controllers/MintController.sol @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../interfaces/IMintController.sol"; +import "../interfaces/IISO4217WToken.sol"; +import {IReserveOracle} from "../interfaces/IReserveOracle.sol"; +import {IComplianceGuard} from "../interfaces/IComplianceGuard.sol"; + +/** + * @title MintController + * @notice Controls minting of ISO-4217 W tokens with reserve verification + * @dev Minting requires: verified fiat settlement, custodian attestation, oracle quorum + */ +contract MintController is IMintController, AccessControl, ReentrancyGuard { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + + IReserveOracle public reserveOracle; + IComplianceGuard public complianceGuard; + + mapping(address => bool) public isApprovedToken; + + constructor(address admin, address reserveOracle_, address complianceGuard_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MINTER_ROLE, admin); + reserveOracle = IReserveOracle(reserveOracle_); + complianceGuard = IComplianceGuard(complianceGuard_); + } + + /** + * @notice Mint tokens (requires reserve verification) + * @param token Token address + * @param to Recipient address + * @param amount Amount to mint (in token decimals) + * @param settlementId Fiat settlement ID for audit trail + */ + function mint( + address token, + address to, + uint256 amount, + bytes32 settlementId + ) external override nonReentrant onlyRole(MINTER_ROLE) { + require(isApprovedToken[token], "MintController: token not approved"); + require(amount > 0, "MintController: zero amount"); + require(to != address(0), "MintController: zero address"); + + IISO4217WToken tokenContract = IISO4217WToken(token); + string memory currencyCode = tokenContract.currencyCode(); + + // Check if minting is allowed + (bool canMint, bytes32 reasonCode) = this.canMint(token, amount); + require(canMint, string(abi.encodePacked("MintController: mint not allowed: ", reasonCode))); + + // Mint tokens + tokenContract.mint(to, amount); + + emit MintExecuted(token, to, amount, settlementId); + } + + /** + * @notice Check if minting is allowed + * @param token Token address + * @param amount Amount to mint + * @return canMint True if minting is allowed + * @return reasonCode Reason if not allowed + */ + function canMint(address token, uint256 amount) external view override returns (bool canMint, bytes32 reasonCode) { + require(isApprovedToken[token], "MintController: token not approved"); + + IISO4217WToken tokenContract = IISO4217WToken(token); + string memory currencyCode = tokenContract.currencyCode(); + + // Check oracle quorum + if (!this.isOracleQuorumMet(token)) { + return (false, keccak256("ORACLE_QUORUM_NOT_MET")); + } + + // Get verified reserve + (uint256 verifiedReserve, ) = reserveOracle.getVerifiedReserve(currencyCode); + uint256 currentSupply = tokenContract.totalSupply(); + + // Validate mint with compliance guard + (bool isValid, bytes32 complianceReason) = complianceGuard.validateMint( + currencyCode, + amount, + currentSupply, + verifiedReserve + ); + + if (!isValid) { + return (false, complianceReason); + } + + return (true, bytes32(0)); + } + + /** + * @notice Check if oracle quorum is met + * @param token Token address + * @return quorumMet True if quorum is met + */ + function isOracleQuorumMet(address token) external view override returns (bool quorumMet) { + IISO4217WToken tokenContract = IISO4217WToken(token); + string memory currencyCode = tokenContract.currencyCode(); + + (quorumMet, ) = reserveOracle.isQuorumMet(currencyCode); + } + + /** + * @notice Approve a token for minting + * @param token Token address + */ + function approveToken(address token) external onlyRole(DEFAULT_ADMIN_ROLE) { + isApprovedToken[token] = true; + } + + /** + * @notice Revoke token approval + * @param token Token address + */ + function revokeToken(address token) external onlyRole(DEFAULT_ADMIN_ROLE) { + isApprovedToken[token] = false; + } + + /** + * @notice Set reserve oracle address + * @param reserveOracle_ New oracle address + */ + function setReserveOracle(address reserveOracle_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(reserveOracle_ != address(0), "MintController: zero address"); + reserveOracle = IReserveOracle(reserveOracle_); + } + + /** + * @notice Set compliance guard address + * @param complianceGuard_ New guard address + */ + function setComplianceGuard(address complianceGuard_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(complianceGuard_ != address(0), "MintController: zero address"); + complianceGuard = IComplianceGuard(complianceGuard_); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IBurnController.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IBurnController.sol new file mode 100644 index 0000000..dddf710 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IBurnController.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IBurnController + * @notice Interface for burning ISO-4217 W tokens on redemption + * @dev Burn-before-release sequence for on-demand redemption at par + */ +interface IBurnController { + /** + * @notice Redeem tokens (burn and release fiat) + * @param token Token address + * @param from Redeemer address + * @param amount Amount to redeem (in token decimals) + * @return redemptionId Redemption ID for tracking + */ + function redeem(address token, address from, uint256 amount) external returns (bytes32 redemptionId); + + /** + * @notice Burn tokens without redemption (emergency/transfer) + * @param token Token address + * @param from Source address + * @param amount Amount to burn + */ + function burn(address token, address from, uint256 amount) external; + + /** + * @notice Check if redemption is allowed + * @param token Token address + * @param amount Amount to redeem + * @return canRedeem True if redemption is allowed + */ + function canRedeem(address token, uint256 amount) external view returns (bool canRedeem); + + event Redeemed( + address indexed token, + address indexed from, + uint256 amount, + bytes32 indexed redemptionId + ); + event Burned(address indexed token, address indexed from, uint256 amount); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IComplianceGuard.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IComplianceGuard.sol new file mode 100644 index 0000000..2df1053 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IComplianceGuard.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IComplianceGuard + * @notice Interface for compliance guard enforcing ISO-4217 W token rules + * @dev Ensures GRU isolation, money multiplier = 1.0, reserve constraints + */ +interface IComplianceGuard { + /** + * @notice Validate mint operation + * @param currencyCode ISO-4217 currency code + * @param amount Amount to mint + * @param currentSupply Current token supply + * @param verifiedReserve Verified reserve balance + * @return isValid True if mint is compliant + * @return reasonCode Reason if not compliant + */ + function validateMint( + string memory currencyCode, + uint256 amount, + uint256 currentSupply, + uint256 verifiedReserve + ) external view returns (bool isValid, bytes32 reasonCode); + + /** + * @notice Validate that money multiplier = 1.0 + * @dev Hard constraint: m = 1.0 (no fractional reserve) + * @param reserve Reserve balance + * @param supply Token supply + * @return isValid True if multiplier = 1.0 + */ + function validateMoneyMultiplier(uint256 reserve, uint256 supply) external pure returns (bool isValid); + + /** + * @notice Check if currency is ISO-4217 compliant + * @param currencyCode Currency code to validate + * @return isISO4217 True if ISO-4217 compliant + */ + function isISO4217Compliant(string memory currencyCode) external pure returns (bool isISO4217); + + /** + * @notice Check if operation violates GRU isolation + * @param currencyCode Currency code + * @return violatesIsolation True if GRU linkage detected + */ + function violatesGRUIsolation(string memory currencyCode) external pure returns (bool violatesIsolation); + + /** + * @notice Validate reserve sufficiency + * @param reserve Reserve balance + * @param supply Token supply + * @return isSufficient True if reserve >= supply + */ + function isReserveSufficient(uint256 reserve, uint256 supply) external pure returns (bool isSufficient); + + event ComplianceCheckPassed(string indexed currencyCode, bytes32 checkType); + event ComplianceCheckFailed(string indexed currencyCode, bytes32 checkType, bytes32 reasonCode); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IISO4217WToken.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IISO4217WToken.sol new file mode 100644 index 0000000..5bb37e6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IISO4217WToken.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IISO4217WToken + * @notice Interface for ISO-4217 W tokens (e.g., USDW, EURW, GBPW) + * @dev M1 eMoney tokens representing 1:1 redeemable digital claims on fiat currency + * + * COMPLIANCE: + * - Classification: M1 eMoney + * - Legal Tender: NO + * - Synthetic / Reserve Unit: NO + * - Commodity-Backed: NO + * - Money Multiplier: m = 1.0 (fixed, no fractional reserve) + */ +interface IISO4217WToken { + /** + * @notice Get the ISO-4217 currency code this token represents + * @return currencyCode 3-letter ISO-4217 code (e.g., "USD") + */ + function currencyCode() external view returns (string memory); + + /** + * @notice Get total supply of tokens + * @return supply Total supply + */ + function totalSupply() external view returns (uint256); + + /** + * @notice Get verified reserve balance for this currency + * @return reserveBalance Reserve balance in base currency units + */ + function verifiedReserve() external view returns (uint256); + + /** + * @notice Check if reserves are sufficient + * @return isSufficient True if verifiedReserve >= totalSupply + */ + function isReserveSufficient() external view returns (bool); + + /** + * @notice Get custodian address + * @return custodian Custodian address + */ + function custodian() external view returns (address); + + /** + * @notice Get mint controller address + * @return mintController Mint controller address + */ + function mintController() external view returns (address); + + /** + * @notice Get burn controller address + * @return burnController Burn controller address + */ + function burnController() external view returns (address); + + /** + * @notice Get compliance guard address + * @return complianceGuard Compliance guard address + */ + function complianceGuard() external view returns (address); + + /** + * @notice Mint tokens to an address + * @param to Address to mint to + * @param amount Amount to mint + */ + function mint(address to, uint256 amount) external; + + /** + * @notice Burn tokens from an address + * @param from Address to burn from + * @param amount Amount to burn + */ + function burn(address from, uint256 amount) external; + + event Minted(address indexed to, uint256 amount, string indexed currencyCode); + event Burned(address indexed from, uint256 amount, string indexed currencyCode); + event ReserveUpdated(uint256 newReserve, uint256 timestamp); + event ReserveInsufficient(uint256 reserve, uint256 supply); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IMintController.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IMintController.sol new file mode 100644 index 0000000..f97f38a --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IMintController.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IMintController + * @notice Interface for minting ISO-4217 W tokens with reserve verification + * @dev Minting requires: verified fiat settlement, custodian attestation, oracle quorum + */ +interface IMintController { + /** + * @notice Mint tokens (requires reserve verification) + * @param token Token address + * @param to Recipient address + * @param amount Amount to mint (in token decimals) + * @param settlementId Fiat settlement ID for audit trail + */ + function mint(address token, address to, uint256 amount, bytes32 settlementId) external; + + /** + * @notice Check if minting is allowed + * @param token Token address + * @param amount Amount to mint + * @return canMint True if minting is allowed + * @return reasonCode Reason if not allowed + */ + function canMint(address token, uint256 amount) external view returns (bool canMint, bytes32 reasonCode); + + /** + * @notice Check if oracle quorum is met + * @param token Token address + * @return quorumMet True if quorum is met + */ + function isOracleQuorumMet(address token) external view returns (bool quorumMet); + + event MintExecuted( + address indexed token, + address indexed to, + uint256 amount, + bytes32 indexed settlementId + ); + event MintRejected(address indexed token, uint256 amount, bytes32 reasonCode); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IReserveOracle.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IReserveOracle.sol new file mode 100644 index 0000000..f95a6fe --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/IReserveOracle.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IReserveOracle + * @notice Interface for reserve verification oracles + * @dev Quorum-based oracle system for verifying fiat reserves + */ +interface IReserveOracle { + struct ReserveReport { + address reporter; + uint256 reserveBalance; + uint256 timestamp; + bytes32 attestationHash; + bool isValid; + } + + /** + * @notice Submit reserve report for a currency + * @param currencyCode ISO-4217 currency code + * @param reserveBalance Reserve balance in base currency units + * @param attestationHash Hash of custodian attestation + */ + function submitReserveReport( + string memory currencyCode, + uint256 reserveBalance, + bytes32 attestationHash + ) external; + + /** + * @notice Get verified reserve balance for a currency + * @param currencyCode ISO-4217 currency code + * @return reserveBalance Verified reserve balance + * @return timestamp Last update timestamp + */ + function getVerifiedReserve(string memory currencyCode) external view returns ( + uint256 reserveBalance, + uint256 timestamp + ); + + /** + * @notice Check if oracle quorum is met for a currency + * @param currencyCode ISO-4217 currency code + * @return quorumMet True if quorum is met + * @return reportCount Number of valid reports + */ + function isQuorumMet(string memory currencyCode) external view returns (bool quorumMet, uint256 reportCount); + + /** + * @notice Get consensus reserve balance (median/average of quorum reports) + * @param currencyCode ISO-4217 currency code + * @return consensusReserve Consensus reserve balance + */ + function getConsensusReserve(string memory currencyCode) external view returns (uint256 consensusReserve); + + event ReserveReportSubmitted( + string indexed currencyCode, + address indexed reporter, + uint256 reserveBalance, + uint256 timestamp + ); + event QuorumMet(string indexed currencyCode, uint256 consensusReserve); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/ITokenRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/ITokenRegistry.sol new file mode 100644 index 0000000..50a74b4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/interfaces/ITokenRegistry.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ITokenRegistry + * @notice Interface for ISO-4217 W token registry + * @dev Canonical registry mapping ISO-4217 codes to token addresses + */ +interface ITokenRegistry { + struct TokenInfo { + address tokenAddress; + string currencyCode; // ISO-4217 code (e.g., "USD") + string tokenSymbol; // Token symbol (e.g., "USDW") + uint8 decimals; + address custodian; + address mintController; + address burnController; + bool isActive; + uint256 createdAt; + } + + /** + * @notice Register a new ISO-4217 W token + * @param currencyCode ISO-4217 currency code (must be valid ISO-4217) + * @param tokenAddress Token contract address + * @param tokenSymbol Token symbol (should be W format) + * @param decimals Token decimals (typically 2 for fiat currencies) + * @param custodian Custodian address + */ + function registerToken( + string memory currencyCode, + address tokenAddress, + string memory tokenSymbol, + uint8 decimals, + address custodian + ) external; + + /** + * @notice Get token address for ISO-4217 code + * @param currencyCode ISO-4217 currency code + * @return tokenAddress Token contract address + */ + function getTokenAddress(string memory currencyCode) external view returns (address tokenAddress); + + /** + * @notice Get token info for ISO-4217 code + * @param currencyCode ISO-4217 currency code + * @return info Token information + */ + function getTokenInfo(string memory currencyCode) external view returns (TokenInfo memory info); + + /** + * @notice Check if currency code is registered + * @param currencyCode ISO-4217 currency code + * @return isRegistered True if registered + */ + function isRegistered(string memory currencyCode) external view returns (bool isRegistered); + + /** + * @notice Deactivate a token (emergency) + * @param currencyCode ISO-4217 currency code + */ + function deactivateToken(string memory currencyCode) external; + + /** + * @notice Set mint controller for a token + * @param currencyCode ISO-4217 currency code + * @param mintController Mint controller address + */ + function setMintController(string memory currencyCode, address mintController) external; + + /** + * @notice Set burn controller for a token + * @param currencyCode ISO-4217 currency code + * @param burnController Burn controller address + */ + function setBurnController(string memory currencyCode, address burnController) external; + + event TokenRegistered( + string indexed currencyCode, + address indexed tokenAddress, + string tokenSymbol, + address indexed custodian + ); + event TokenDeactivated(string indexed currencyCode, uint256 timestamp); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/libraries/ISO4217WCompliance.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/libraries/ISO4217WCompliance.sol new file mode 100644 index 0000000..045e0fd --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/libraries/ISO4217WCompliance.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ISO4217WCompliance + * @notice Compliance library for ISO-4217 W tokens + * @dev Enforces hard constraints: m=1.0, GRU isolation, reserve constraints + * + * MANDATORY CONSTRAINTS: + * - Classification: M1 eMoney (NOT legal tender, NOT synthetic, NOT commodity-backed) + * - Money Multiplier: m = 1.0 (hard-fixed, no fractional reserve) + * - Backing: 1:1 with fiat currency in segregated custodial accounts + * - GRU Isolation: Direct or indirect GRU conversion prohibited + */ +library ISO4217WCompliance { + /** + * @notice Money multiplier constant (hard-fixed at 1.0) + * @dev MANDATORY: m = 1.0 (no fractional reserve) + */ + uint256 public constant MONEY_MULTIPLIER = 1e18; // 1.0 in 18 decimals + uint256 public constant BASIS_POINTS = 10000; + + /** + * @notice Validate money multiplier = 1.0 + * @dev Hard constraint: m MUST equal 1.0 + * @param reserve Reserve balance + * @param supply Token supply + * @return isValid True if reserve >= supply (enforcing m = 1.0) + * @return reasonCode Reason if invalid + */ + function validateMoneyMultiplier(uint256 reserve, uint256 supply) internal pure returns ( + bool isValid, + bytes32 reasonCode + ) { + // Money multiplier m = 1.0 means: reserve >= supply (exactly 1:1 or better) + if (reserve < supply) { + return (false, keccak256("RESERVE_INSUFFICIENT")); + } + + // Allow reserve >= supply (1:1 or better backing) + // Reject any logic that implies m > 1.0 (fractional reserve) + return (true, bytes32(0)); + } + + /** + * @notice Validate reserve sufficiency for minting + * @dev MANDATORY: verifiedReserve >= totalSupply + amount (enforces 1:1 backing) + * @param currentReserve Current verified reserve + * @param currentSupply Current token supply + * @param mintAmount Amount to mint + * @return isValid True if reserve is sufficient + * @return reasonCode Reason if invalid + */ + function validateReserveForMint( + uint256 currentReserve, + uint256 currentSupply, + uint256 mintAmount + ) internal pure returns (bool isValid, bytes32 reasonCode) { + uint256 newSupply = currentSupply + mintAmount; + + // Constraint: verifiedReserve >= totalSupply + amount + if (currentReserve < newSupply) { + return (false, keccak256("RESERVE_INSUFFICIENT_FOR_MINT")); + } + + return (true, bytes32(0)); + } + + /** + * @notice Check if currency code violates GRU isolation + * @dev GRU identifiers are protocol-blacklisted + * @param currencyCode Currency code to check + * @return violatesIsolation True if GRU linkage detected + */ + function violatesGRUIsolation(string memory currencyCode) internal pure returns (bool violatesIsolation) { + bytes32 codeHash = keccak256(bytes(currencyCode)); + + // Blacklist GRU identifiers + return codeHash == keccak256("GRU") || + codeHash == keccak256("M00") || + codeHash == keccak256("M0") || + codeHash == keccak256("M1"); + } + + /** + * @notice Validate ISO-4217 currency code format + * @dev ISO-4217 codes are exactly 3 uppercase letters + * @param currencyCode Currency code to validate + * @return isValid True if valid ISO-4217 format + */ + function isValidISO4217Format(string memory currencyCode) internal pure returns (bool isValid) { + bytes memory codeBytes = bytes(currencyCode); + if (codeBytes.length != 3) { + return false; + } + + for (uint256 i = 0; i < 3; i++) { + uint8 char = uint8(codeBytes[i]); + if (char < 65 || char > 90) { // Not A-Z + return false; + } + } + + return true; + } + + /** + * @notice Validate token symbol matches W pattern + * @dev Token symbol MUST be W (e.g., USDW, EURW) + * @param currencyCode ISO-4217 currency code + * @param tokenSymbol Token symbol + * @return isValid True if symbol matches pattern + */ + function validateTokenSymbol(string memory currencyCode, string memory tokenSymbol) internal pure returns (bool isValid) { + // Check if tokenSymbol is currencyCode + "W" + string memory expectedSymbol = string(abi.encodePacked(currencyCode, "W")); + return keccak256(bytes(tokenSymbol)) == keccak256(bytes(expectedSymbol)); + } + + /** + * @notice Check if reserve is sufficient + * @dev Reserve MUST be >= supply (enforcing 1:1 backing) + * @param reserve Reserve balance + * @param supply Token supply + * @return isSufficient True if reserve >= supply + */ + function isReserveSufficient(uint256 reserve, uint256 supply) internal pure returns (bool isSufficient) { + return reserve >= supply; + } + + /** + * @notice Calculate money multiplier (should always be 1.0) + * @dev For validation/analytics only - MUST NOT influence issuance or pricing + * @param reserve Reserve balance + * @param supply Token supply + * @return multiplier Money multiplier (should be 1.0 in 18 decimals) + */ + function calculateMoneyMultiplier(uint256 reserve, uint256 supply) internal pure returns (uint256 multiplier) { + if (supply == 0) { + return MONEY_MULTIPLIER; // 1.0 + } + + // m = reserve / supply + // Should be >= 1.0 (1:1 or better backing) + return (reserve * 1e18) / supply; + } + + /** + * @notice Require money multiplier = 1.0 (revert if violated) + * @param reserve Reserve balance + * @param supply Token supply + */ + function requireMoneyMultiplier(uint256 reserve, uint256 supply) internal pure { + require(reserve >= supply, "ISO4217WCompliance: money multiplier violation - reserve < supply"); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/oracle/ReserveOracle.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/oracle/ReserveOracle.sol new file mode 100644 index 0000000..a45971e --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/oracle/ReserveOracle.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../interfaces/IReserveOracle.sol"; + +/** + * @title ReserveOracle + * @notice Quorum-based oracle system for verifying fiat reserves + * @dev Requires quorum of oracle reports before accepting reserve values + */ +contract ReserveOracle is IReserveOracle, AccessControl, ReentrancyGuard { + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + + uint256 public quorumThreshold; // Number of reports required for quorum (default: 3) + uint256 public stalenessThreshold; // Maximum age of reports in seconds (default: 3600 = 1 hour) + + // Currency code => ReserveReport[] + mapping(string => ReserveReport[]) private _reports; + + // Currency code => verified reserve (consensus value) + mapping(string => uint256) private _verifiedReserves; + mapping(string => uint256) private _lastUpdate; + + // Track valid oracles + mapping(address => bool) public isOracle; + + constructor(address admin, uint256 quorumThreshold_, uint256 stalenessThreshold_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ORACLE_ROLE, admin); + quorumThreshold = quorumThreshold_; + stalenessThreshold = stalenessThreshold_; + isOracle[admin] = true; + } + + /** + * @notice Submit reserve report for a currency + * @param currencyCode ISO-4217 currency code + * @param reserveBalance Reserve balance in base currency units + * @param attestationHash Hash of custodian attestation + */ + function submitReserveReport( + string memory currencyCode, + uint256 reserveBalance, + bytes32 attestationHash + ) external override onlyRole(ORACLE_ROLE) nonReentrant { + require(isOracle[msg.sender], "ReserveOracle: not authorized oracle"); + require(reserveBalance > 0, "ReserveOracle: zero reserve"); + + // Validate ISO-4217 format (basic check) + bytes memory codeBytes = bytes(currencyCode); + require(codeBytes.length == 3, "ReserveOracle: invalid currency code format"); + + // Remove stale reports + _removeStaleReports(currencyCode); + + // Add new report + _reports[currencyCode].push(ReserveReport({ + reporter: msg.sender, + reserveBalance: reserveBalance, + timestamp: block.timestamp, + attestationHash: attestationHash, + isValid: true + })); + + emit ReserveReportSubmitted(currencyCode, msg.sender, reserveBalance, block.timestamp); + + // Check if quorum is met and update verified reserve + (bool quorumMet, ) = this.isQuorumMet(currencyCode); + if (quorumMet) { + uint256 consensusReserve = this.getConsensusReserve(currencyCode); + _verifiedReserves[currencyCode] = consensusReserve; + _lastUpdate[currencyCode] = block.timestamp; + emit QuorumMet(currencyCode, consensusReserve); + } + } + + /** + * @notice Get verified reserve balance for a currency + * @param currencyCode ISO-4217 currency code + * @return reserveBalance Verified reserve balance + * @return timestamp Last update timestamp + */ + function getVerifiedReserve(string memory currencyCode) external view override returns ( + uint256 reserveBalance, + uint256 timestamp + ) { + return (_verifiedReserves[currencyCode], _lastUpdate[currencyCode]); + } + + /** + * @notice Check if oracle quorum is met for a currency + * @param currencyCode ISO-4217 currency code + * @return quorumMet True if quorum is met + * @return reportCount Number of valid reports + */ + function isQuorumMet(string memory currencyCode) external view override returns (bool quorumMet, uint256 reportCount) { + ReserveReport[] memory reports = _reports[currencyCode]; + uint256 validCount = 0; + + uint256 cutoffTime = block.timestamp > stalenessThreshold ? block.timestamp - stalenessThreshold : 0; + + for (uint256 i = 0; i < reports.length; i++) { + if (reports[i].isValid && reports[i].timestamp >= cutoffTime) { + validCount++; + } + } + + reportCount = validCount; + quorumMet = validCount >= quorumThreshold; + } + + /** + * @notice Get consensus reserve balance (median/average of quorum reports) + * @param currencyCode ISO-4217 currency code + * @return consensusReserve Consensus reserve balance + */ + function getConsensusReserve(string memory currencyCode) external view override returns (uint256 consensusReserve) { + ReserveReport[] memory reports = _reports[currencyCode]; + + // Remove stale and invalid reports + uint256[] memory validReserves = new uint256[](reports.length); + uint256 validCount = 0; + uint256 cutoffTime = block.timestamp > stalenessThreshold ? block.timestamp - stalenessThreshold : 0; + + for (uint256 i = 0; i < reports.length; i++) { + if (reports[i].isValid && reports[i].timestamp >= cutoffTime) { + validReserves[validCount] = reports[i].reserveBalance; + validCount++; + } + } + + if (validCount == 0) { + return 0; + } + + // Sort and calculate median (simple average if count is even) + // For simplicity, calculate average (in production, use median for robustness) + uint256 sum = 0; + for (uint256 i = 0; i < validCount; i++) { + sum += validReserves[i]; + } + + consensusReserve = sum / validCount; + } + + /** + * @notice Remove stale reports for a currency + * @param currencyCode ISO-4217 currency code + */ + function _removeStaleReports(string memory currencyCode) internal { + ReserveReport[] storage reports = _reports[currencyCode]; + uint256 cutoffTime = block.timestamp > stalenessThreshold ? block.timestamp - stalenessThreshold : 0; + + // Mark stale reports as invalid + for (uint256 i = 0; i < reports.length; i++) { + if (reports[i].timestamp < cutoffTime) { + reports[i].isValid = false; + } + } + } + + /** + * @notice Add oracle + * @param oracle Oracle address + */ + function addOracle(address oracle) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(oracle != address(0), "ReserveOracle: zero address"); + isOracle[oracle] = true; + _grantRole(ORACLE_ROLE, oracle); + } + + /** + * @notice Remove oracle + * @param oracle Oracle address + */ + function removeOracle(address oracle) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isOracle[oracle], "ReserveOracle: not an oracle"); + isOracle[oracle] = false; + _revokeRole(ORACLE_ROLE, oracle); + } + + /** + * @notice Set quorum threshold + * @param threshold New quorum threshold + */ + function setQuorumThreshold(uint256 threshold) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(threshold > 0, "ReserveOracle: zero threshold"); + quorumThreshold = threshold; + } + + /** + * @notice Set staleness threshold + * @param threshold New staleness threshold in seconds + */ + function setStalenessThreshold(uint256 threshold) external onlyRole(DEFAULT_ADMIN_ROLE) { + stalenessThreshold = threshold; + } + + /** + * @notice Get reports for a currency + * @param currencyCode ISO-4217 currency code + * @return reports Array of reserve reports + */ + function getReports(string memory currencyCode) external view returns (ReserveReport[] memory reports) { + return _reports[currencyCode]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/registry/TokenRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/registry/TokenRegistry.sol new file mode 100644 index 0000000..15caa3c --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/iso4217w/registry/TokenRegistry.sol @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../interfaces/ITokenRegistry.sol"; +import "../libraries/ISO4217WCompliance.sol"; + +/** + * @title TokenRegistry + * @notice Canonical registry mapping ISO-4217 codes to W token addresses + * @dev Registry is immutable once published (tokens can be deactivated but not removed) + */ +contract TokenRegistry is ITokenRegistry, AccessControl { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + + // Currency code => TokenInfo + mapping(string => TokenInfo) private _tokens; + + // Track all registered currency codes + string[] private _registeredCurrencies; + mapping(string => bool) private _isRegistered; + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a new ISO-4217 W token + * @param currencyCode ISO-4217 currency code (must be valid ISO-4217) + * @param tokenAddress Token contract address + * @param tokenSymbol Token symbol (should be W format) + * @param decimals Token decimals (typically 2 for fiat currencies) + * @param custodian Custodian address + */ + function registerToken( + string memory currencyCode, + address tokenAddress, + string memory tokenSymbol, + uint8 decimals, + address custodian + ) external override onlyRole(REGISTRAR_ROLE) { + require(tokenAddress != address(0), "TokenRegistry: zero token address"); + require(custodian != address(0), "TokenRegistry: zero custodian"); + require(!_isRegistered[currencyCode], "TokenRegistry: already registered"); + + // Validate ISO-4217 format + require( + ISO4217WCompliance.isValidISO4217Format(currencyCode), + "TokenRegistry: invalid ISO-4217 format" + ); + + // Validate GRU isolation + require( + !ISO4217WCompliance.violatesGRUIsolation(currencyCode), + "TokenRegistry: GRU isolation violation" + ); + + // Validate token symbol matches W pattern + require( + ISO4217WCompliance.validateTokenSymbol(currencyCode, tokenSymbol), + "TokenRegistry: token symbol must be W" + ); + + // Create token info + TokenInfo memory info = TokenInfo({ + tokenAddress: tokenAddress, + currencyCode: currencyCode, + tokenSymbol: tokenSymbol, + decimals: decimals, + custodian: custodian, + mintController: address(0), // Set separately + burnController: address(0), // Set separately + isActive: true, + createdAt: block.timestamp + }); + + _tokens[currencyCode] = info; + _registeredCurrencies.push(currencyCode); + _isRegistered[currencyCode] = true; + + emit TokenRegistered(currencyCode, tokenAddress, tokenSymbol, custodian); + } + + /** + * @notice Set mint controller for a currency + * @param currencyCode ISO-4217 currency code + * @param mintController Mint controller address + */ + function setMintController(string memory currencyCode, address mintController) external onlyRole(REGISTRAR_ROLE) { + require(_isRegistered[currencyCode], "TokenRegistry: not registered"); + require(mintController != address(0), "TokenRegistry: zero address"); + _tokens[currencyCode].mintController = mintController; + } + + /** + * @notice Set burn controller for a currency + * @param currencyCode ISO-4217 currency code + * @param burnController Burn controller address + */ + function setBurnController(string memory currencyCode, address burnController) external onlyRole(REGISTRAR_ROLE) { + require(_isRegistered[currencyCode], "TokenRegistry: not registered"); + require(burnController != address(0), "TokenRegistry: zero address"); + _tokens[currencyCode].burnController = burnController; + } + + /** + * @notice Get token address for ISO-4217 code + * @param currencyCode ISO-4217 currency code + * @return tokenAddress Token contract address + */ + function getTokenAddress(string memory currencyCode) external view override returns (address tokenAddress) { + require(_isRegistered[currencyCode], "TokenRegistry: not registered"); + return _tokens[currencyCode].tokenAddress; + } + + /** + * @notice Get token info for ISO-4217 code + * @param currencyCode ISO-4217 currency code + * @return info Token information + */ + function getTokenInfo(string memory currencyCode) external view override returns (TokenInfo memory info) { + require(_isRegistered[currencyCode], "TokenRegistry: not registered"); + return _tokens[currencyCode]; + } + + /** + * @notice Check if currency code is registered + * @param currencyCode ISO-4217 currency code + * @return isRegistered True if registered + */ + function isRegistered(string memory currencyCode) external view override returns (bool isRegistered) { + return _isRegistered[currencyCode]; + } + + /** + * @notice Deactivate a token (emergency) + * @param currencyCode ISO-4217 currency code + */ + function deactivateToken(string memory currencyCode) external override onlyRole(REGISTRAR_ROLE) { + require(_isRegistered[currencyCode], "TokenRegistry: not registered"); + require(_tokens[currencyCode].isActive, "TokenRegistry: already inactive"); + + _tokens[currencyCode].isActive = false; + emit TokenDeactivated(currencyCode, block.timestamp); + } + + /** + * @notice Get all registered currency codes + * @return currencies Array of registered currency codes + */ + function getRegisteredCurrencies() external view returns (string[] memory currencies) { + return _registeredCurrencies; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/LiquidityManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/LiquidityManager.sol new file mode 100644 index 0000000..0536b49 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/LiquidityManager.sol @@ -0,0 +1,264 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "./interfaces/ILiquidityProvider.sol"; + +/** + * @title LiquidityManager + * @notice Orchestrates liquidity across multiple sources (DODO, Uniswap, Curve) + * @dev Implements per-asset configuration for PMM usage + */ +contract LiquidityManager is + Initializable, + AccessControlUpgradeable, + ReentrancyGuardUpgradeable, + UUPSUpgradeable +{ + using SafeERC20 for IERC20; + + bytes32 public constant LIQUIDITY_ADMIN_ROLE = keccak256("LIQUIDITY_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + struct LiquidityConfig { + uint256 minAmountForPMM; // Below this, don't use PMM + uint256 maxSlippageBps; // Max acceptable slippage + uint256 timeout; // Max wait time for liquidity + bool autoCreate; // Auto-create pools if needed + bool enabled; // PMM enabled for this asset + } + + struct ProviderInfo { + address providerContract; + bool active; + uint256 priority; // Higher priority = checked first + uint256 totalVolume; + uint256 successfulSwaps; + uint256 failedSwaps; + } + + struct LiquidityReservation { + bytes32 messageId; + address token; + uint256 amount; + uint256 reservedAt; + bool released; + } + + // Storage + mapping(address => LiquidityConfig) public assetConfigs; + ILiquidityProvider[] public providers; + mapping(address => ProviderInfo) public providerInfo; + mapping(bytes32 => LiquidityReservation) public reservations; + + event LiquidityProvided( + bytes32 indexed messageId, + address indexed token, + uint256 amount, + address provider + ); + + event ProviderAdded(address indexed provider, uint256 priority); + event ProviderRemoved(address indexed provider); + event AssetConfigured(address indexed token, LiquidityConfig config); + event LiquidityReserved(bytes32 indexed messageId, address token, uint256 amount); + event LiquidityReleased(bytes32 indexed messageId); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __ReentrancyGuard_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(LIQUIDITY_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Get best liquidity quote across all providers + */ + function getBestQuote( + address tokenIn, + address tokenOut, + uint256 amountIn + ) external view returns ( + address bestProvider, + uint256 bestAmountOut, + uint256 bestSlippageBps + ) { + uint256 bestAmount = 0; + uint256 bestSlippage = type(uint256).max; + + for (uint256 i = 0; i < providers.length; i++) { + if (!providerInfo[address(providers[i])].active) continue; + + try providers[i].supportsTokenPair(tokenIn, tokenOut) returns (bool supported) { + if (!supported) continue; + + try providers[i].getQuote(tokenIn, tokenOut, amountIn) returns ( + uint256 amountOut, + uint256 slippageBps + ) { + // Select provider with best output and lowest slippage + if (amountOut > bestAmount || + (amountOut == bestAmount && slippageBps < bestSlippage)) { + bestProvider = address(providers[i]); + bestAmount = amountOut; + bestSlippage = slippageBps; + } + } catch { + // Provider failed, skip + continue; + } + } catch { + continue; + } + } + + return (bestProvider, bestAmount, bestSlippage); + } + + /** + * @notice Provide liquidity for bridge operation + */ + function provideLiquidity( + address token, + uint256 amount, + bytes calldata strategyParams + ) external nonReentrant returns (uint256 liquidityProvided) { + LiquidityConfig memory config = assetConfigs[token]; + + // Check if PMM enabled for this asset + if (!config.enabled || amount < config.minAmountForPMM) { + return 0; + } + + // Find best provider + // In production, this would execute actual liquidity provision + // For now, return the amount as-is + + liquidityProvided = amount; + + return liquidityProvided; + } + + /** + * @notice Reserve liquidity for pending bridge + */ + function reserveLiquidity( + bytes32 messageId, + address token, + uint256 amount + ) external onlyRole(LIQUIDITY_ADMIN_ROLE) { + require(messageId != bytes32(0), "Invalid message ID"); + require(reservations[messageId].reservedAt == 0, "Already reserved"); + + reservations[messageId] = LiquidityReservation({ + messageId: messageId, + token: token, + amount: amount, + reservedAt: block.timestamp, + released: false + }); + + emit LiquidityReserved(messageId, token, amount); + } + + /** + * @notice Release reserved liquidity + */ + function releaseLiquidity(bytes32 messageId) external onlyRole(LIQUIDITY_ADMIN_ROLE) { + LiquidityReservation storage reservation = reservations[messageId]; + require(reservation.reservedAt > 0, "Not reserved"); + require(!reservation.released, "Already released"); + + reservation.released = true; + + emit LiquidityReleased(messageId); + } + + /** + * @notice Add liquidity provider + */ + function addProvider( + address provider, + uint256 priority + ) external onlyRole(LIQUIDITY_ADMIN_ROLE) { + require(provider != address(0), "Zero address"); + require(!providerInfo[provider].active, "Already added"); + + providers.push(ILiquidityProvider(provider)); + providerInfo[provider] = ProviderInfo({ + providerContract: provider, + active: true, + priority: priority, + totalVolume: 0, + successfulSwaps: 0, + failedSwaps: 0 + }); + + emit ProviderAdded(provider, priority); + } + + /** + * @notice Remove liquidity provider + */ + function removeProvider(address provider) external onlyRole(LIQUIDITY_ADMIN_ROLE) { + providerInfo[provider].active = false; + + emit ProviderRemoved(provider); + } + + /** + * @notice Configure asset liquidity settings + */ + function configureAsset( + address token, + uint256 minAmountForPMM, + uint256 maxSlippageBps, + uint256 timeout, + bool autoCreate, + bool enabled + ) external onlyRole(LIQUIDITY_ADMIN_ROLE) { + assetConfigs[token] = LiquidityConfig({ + minAmountForPMM: minAmountForPMM, + maxSlippageBps: maxSlippageBps, + timeout: timeout, + autoCreate: autoCreate, + enabled: enabled + }); + + emit AssetConfigured(token, assetConfigs[token]); + } + + // View functions + + function getAssetConfig(address token) external view returns (LiquidityConfig memory) { + return assetConfigs[token]; + } + + function getProviderCount() external view returns (uint256) { + return providers.length; + } + + function getProvider(uint256 index) external view returns (address) { + return address(providers[index]); + } + + function getReservation(bytes32 messageId) external view returns (LiquidityReservation memory) { + return reservations[messageId]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/PoolManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/PoolManager.sol new file mode 100644 index 0000000..efa40f4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/PoolManager.sol @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../registry/UniversalAssetRegistry.sol"; + +/** + * @title PoolManager + * @notice Manages pool creation, configuration, and lifecycle + * @dev Auto-creates pools when new assets are registered + */ +contract PoolManager is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant POOL_ADMIN_ROLE = keccak256("POOL_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + struct PoolInfo { + address pool; + address provider; // DODO, Uniswap, etc. + address tokenA; + address tokenB; + uint256 liquidityUSD; + uint256 volume24h; + uint256 createdAt; + uint256 lastUpdateTime; + bool isActive; + } + + // Storage + UniversalAssetRegistry public assetRegistry; + mapping(address => PoolInfo[]) public tokenPools; // token => pools + mapping(address => PoolInfo) public poolRegistry; // pool address => info + address[] public allPools; + + // Provider addresses + address public dodoProvider; + address public uniswapV3Provider; + address public curveProvider; + + event PoolCreated( + address indexed pool, + address indexed token, + address provider, + UniversalAssetRegistry.AssetType assetType + ); + + event PoolHealthChecked( + address indexed pool, + bool isHealthy, + string reason + ); + + event PoolLiquidityUpdated( + address indexed pool, + uint256 newLiquidityUSD + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + address _assetRegistry, + address admin + ) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + require(_assetRegistry != address(0), "Zero registry"); + + assetRegistry = UniversalAssetRegistry(_assetRegistry); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Auto-create pool when new asset registered + */ + function onAssetRegistered( + address token, + UniversalAssetRegistry.AssetType assetType + ) external onlyRole(POOL_ADMIN_ROLE) returns (address pool) { + // Determine optimal pool type based on asset type + if (assetType == UniversalAssetRegistry.AssetType.Stablecoin || + assetType == UniversalAssetRegistry.AssetType.ISO4217W) { + // Create DODO PMM pool (optimal for stable pairs) + pool = _createDODOPool(token); + } else if (assetType == UniversalAssetRegistry.AssetType.ERC20Standard || + assetType == UniversalAssetRegistry.AssetType.GovernanceToken) { + // Create Uniswap V3 pool (optimal for volatile pairs) + pool = _createUniswapV3Pool(token); + } else { + // For other types (GRU, Security, Commodity), manual pool creation + return address(0); + } + + emit PoolCreated(pool, token, dodoProvider, assetType); + + return pool; + } + + /** + * @notice Create DODO PMM pool + */ + function _createDODOPool(address token) internal returns (address) { + // In production, this would call DODOPMMIntegration to create actual pool + // For now, placeholder + return address(0); + } + + /** + * @notice Create Uniswap V3 pool + */ + function _createUniswapV3Pool(address token) internal returns (address) { + // In production, this would deploy Uniswap V3 pool + // For now, placeholder + return address(0); + } + + /** + * @notice Register existing pool + */ + function registerPool( + address pool, + address provider, + address tokenA, + address tokenB, + uint256 liquidityUSD + ) external onlyRole(POOL_ADMIN_ROLE) { + require(pool != address(0), "Zero address"); + require(!poolRegistry[pool].isActive, "Already registered"); + + PoolInfo memory info = PoolInfo({ + pool: pool, + provider: provider, + tokenA: tokenA, + tokenB: tokenB, + liquidityUSD: liquidityUSD, + volume24h: 0, + createdAt: block.timestamp, + lastUpdateTime: block.timestamp, + isActive: true + }); + + poolRegistry[pool] = info; + tokenPools[tokenA].push(info); + if (tokenB != tokenA) { + tokenPools[tokenB].push(info); + } + allPools.push(pool); + } + + /** + * @notice Check pool health + */ + function checkPoolHealth(address pool) external view returns ( + bool isHealthy, + string memory reason + ) { + PoolInfo memory info = poolRegistry[pool]; + + if (!info.isActive) { + return (false, "Pool inactive"); + } + + if (info.liquidityUSD < 1000e18) { + return (false, "Insufficient liquidity"); + } + + if (block.timestamp - info.lastUpdateTime > 7 days) { + return (false, "Stale data"); + } + + return (true, "Healthy"); + } + + /** + * @notice Update pool liquidity + */ + function updatePoolLiquidity( + address pool, + uint256 liquidityUSD + ) external onlyRole(POOL_ADMIN_ROLE) { + require(poolRegistry[pool].isActive, "Pool not registered"); + + poolRegistry[pool].liquidityUSD = liquidityUSD; + poolRegistry[pool].lastUpdateTime = block.timestamp; + + emit PoolLiquidityUpdated(pool, liquidityUSD); + } + + /** + * @notice Set provider addresses + */ + function setProviders( + address _dodoProvider, + address _uniswapV3Provider, + address _curveProvider + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + dodoProvider = _dodoProvider; + uniswapV3Provider = _uniswapV3Provider; + curveProvider = _curveProvider; + } + + // View functions + + function getPoolsForToken(address token) external view returns (PoolInfo[] memory) { + return tokenPools[token]; + } + + function getPoolInfo(address pool) external view returns (PoolInfo memory) { + return poolRegistry[pool]; + } + + function getAllPools() external view returns (address[] memory) { + return allPools; + } + + function getPoolCount() external view returns (uint256) { + return allPools.length; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/interfaces/ILiquidityProvider.sol b/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/interfaces/ILiquidityProvider.sol new file mode 100644 index 0000000..4d63902 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/interfaces/ILiquidityProvider.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +interface ILiquidityProvider { + function getQuote(address tokenIn, address tokenOut, uint256 amountIn) + external view returns (uint256 amountOut, uint256 slippageBps); + function executeSwap(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut) + external returns (uint256 amountOut); + function supportsTokenPair(address tokenIn, address tokenOut) external view returns (bool); + function providerName() external pure returns (string memory); + function estimateGas(address tokenIn, address tokenOut, uint256 amountIn) external view returns (uint256); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/providers/DODOPMMProvider.sol b/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/providers/DODOPMMProvider.sol new file mode 100644 index 0000000..34741b4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/liquidity/providers/DODOPMMProvider.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "../interfaces/ILiquidityProvider.sol"; +import "../../dex/DODOPMMIntegration.sol"; + +/** + * @title DODOPMMProvider + * @notice Wrapper for DODO PMM with extended functionality + * @dev Implements ILiquidityProvider for multi-provider liquidity system + */ +contract DODOPMMProvider is ILiquidityProvider, AccessControl { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + + DODOPMMIntegration public dodoIntegration; + + // Pool tracking + mapping(address => mapping(address => address)) public pools; // tokenIn => tokenOut => pool + mapping(address => bool) public isKnownPool; + + event PoolCreated(address indexed tokenIn, address indexed tokenOut, address pool); + event PoolOptimized(address indexed pool, uint256 newK, uint256 newI); + + constructor(address _dodoIntegration, address admin) { + require(_dodoIntegration != address(0), "Zero address"); + + dodoIntegration = DODOPMMIntegration(_dodoIntegration); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + } + + /** + * @notice Get quote from DODO PMM + */ + function getQuote( + address tokenIn, + address tokenOut, + uint256 amountIn + ) external view override returns (uint256 amountOut, uint256 slippageBps) { + address pool = pools[tokenIn][tokenOut]; + + if (pool == address(0)) { + return (0, 10000); // No pool, 100% slippage + } + + try dodoIntegration.getPoolPriceOrOracle(pool) returns (uint256 price) { + // Simple calculation (in production, would use actual DODO math) + amountOut = (amountIn * price) / 1e18; + slippageBps = 30; // 0.3% typical for stablecoin pools + return (amountOut, slippageBps); + } catch { + return (0, 10000); + } + } + + /** + * @notice Execute swap via DODO PMM + */ + function executeSwap( + address tokenIn, + address tokenOut, + uint256 amountIn, + uint256 minAmountOut + ) external override returns (uint256 amountOut) { + // Get pool for token pair + address pool = pools[tokenIn][tokenOut]; + require(pool != address(0), "Pool not found"); + + // Transfer tokens from caller + IERC20(tokenIn).safeTransferFrom(msg.sender, address(this), amountIn); + + // Route to appropriate swap method based on token pair + // This is a simplified version - in production, you'd want a more generic approach + if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.officialUSDT()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapCUSDTForUSDT(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.officialUSDT() && tokenOut == dodoIntegration.compliantUSDT()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapUSDTForCUSDT(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.officialUSDC()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapCUSDCForUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.officialUSDC() && tokenOut == dodoIntegration.compliantUSDC()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapUSDCForCUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.compliantUSDC()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapCUSDTForUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.compliantUSDT()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapUSDCForCUSDT(pool, amountIn, minAmountOut); + } else { + revert("Unsupported token pair"); + } + + // Transfer output tokens to caller + IERC20(tokenOut).safeTransfer(msg.sender, amountOut); + + return amountOut; + } + + /** + * @notice Check if provider supports token pair + */ + function supportsTokenPair( + address tokenIn, + address tokenOut + ) external view override returns (bool) { + return pools[tokenIn][tokenOut] != address(0); + } + + /** + * @notice Get provider name + */ + function providerName() external pure override returns (string memory) { + return "DODO PMM"; + } + + /** + * @notice Estimate gas for swap + */ + function estimateGas( + address, + address, + uint256 + ) external pure override returns (uint256) { + return 150000; // Typical gas for DODO swap + } + + /** + * @notice Ensure pool exists for token pair + */ + function ensurePoolExists(address tokenIn, address tokenOut) external onlyRole(POOL_MANAGER_ROLE) { + if (pools[tokenIn][tokenOut] == address(0)) { + _createOptimalPool(tokenIn, tokenOut); + } + } + + /// @dev Default params for stablecoin pairs: 0.03% fee, 1:1 price, k=0.5e18 + uint256 private constant DEFAULT_LP_FEE = 3; + uint256 private constant DEFAULT_I = 1e18; + uint256 private constant DEFAULT_K = 0.5e18; + + /** + * @notice Create optimal DODO pool via DODOPMMIntegration + * @dev Requires DODOPMMIntegration to grant POOL_MANAGER_ROLE to this contract + */ + function _createOptimalPool(address tokenIn, address tokenOut) internal { + address pool = dodoIntegration.createPool( + tokenIn, + tokenOut, + DEFAULT_LP_FEE, + DEFAULT_I, + DEFAULT_K, + false // isOpenTWAP - disable for stablecoins + ); + pools[tokenIn][tokenOut] = pool; + pools[tokenOut][tokenIn] = pool; + isKnownPool[pool] = true; + emit PoolCreated(tokenIn, tokenOut, pool); + } + + /** + * @notice Register existing pool + */ + function registerPool( + address tokenIn, + address tokenOut, + address pool + ) external onlyRole(POOL_MANAGER_ROLE) { + require(pool != address(0), "Zero address"); + + pools[tokenIn][tokenOut] = pool; + isKnownPool[pool] = true; + + emit PoolCreated(tokenIn, tokenOut, pool); + } + + /** + * @notice Optimize pool parameters (K, I) + * @dev DODO PMM parameters are typically oracle-driven; DVM pools may expose + * setK/setI. Emits for off-chain monitoring. If the pool supports + * parameter updates, extend this to call the pool's update functions. + */ + function optimizePoolParameters( + address pool, + uint256 newK, + uint256 newI + ) external onlyRole(POOL_MANAGER_ROLE) { + require(isKnownPool[pool], "Unknown pool"); + // DODO DVM/PMM: parameters set at creation; oracle-driven rebalancing. + // Emit for observability; integrate pool.setK/setI when supported. + emit PoolOptimized(pool, newK, newI); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/mirror/MirrorManager.sol b/verification-sources/chain138-buildinfo-7678218/contracts/mirror/MirrorManager.sol new file mode 100644 index 0000000..5fb22f4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/mirror/MirrorManager.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title MirrorManager + * @notice Registry of mirrored token/contract addresses across chains with replay protection and pausability + */ +contract MirrorManager { + address public admin; + bool public paused; + + // mapping: (sourceChain, sourceAddress) => (destChain => destAddress) + mapping(uint64 => mapping(address => mapping(uint64 => address))) public mirrors; + mapping(bytes32 => bool) public processed; // optional replay protection for off-chain message ids + + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + event MirrorSet(uint64 indexed srcChain, address indexed src, uint64 indexed dstChain, address dst); + event MirrorRemoved(uint64 indexed srcChain, address indexed src, uint64 indexed dstChain); + event Processed(bytes32 indexed id); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin) { + require(_admin != address(0), "zero admin"); + admin = _admin; + } + + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } + + function setMirror(uint64 srcChain, address src, uint64 dstChain, address dst) external onlyAdmin whenNotPaused { + require(src != address(0) && dst != address(0), "zero addr"); + mirrors[srcChain][src][dstChain] = dst; + emit MirrorSet(srcChain, src, dstChain, dst); + } + + function removeMirror(uint64 srcChain, address src, uint64 dstChain) external onlyAdmin whenNotPaused { + delete mirrors[srcChain][src][dstChain]; + emit MirrorRemoved(srcChain, src, dstChain); + } + + function getMirror(uint64 srcChain, address src, uint64 dstChain) external view returns (address) { + return mirrors[srcChain][src][dstChain]; + } + + function markProcessed(bytes32 id) external onlyAdmin { + processed[id] = true; + emit Processed(id); + } +} + + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/mirror/MirrorRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/mirror/MirrorRegistry.sol new file mode 100644 index 0000000..3635f17 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/mirror/MirrorRegistry.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title MirrorRegistry + * @notice Stores Merkle commitment roots for DBIS/Alltra transaction mirroring to public mainnets. + * @dev submitCommit(chainId, startBlock, endBlock, root, uri, ts) + event CommitSubmitted. + * Publisher allowlist and optional rate limiting. + */ +contract MirrorRegistry { + address public admin; + bool public paused; + + mapping(address => bool) public publishers; + uint256 public commitsCount; + uint256 public constant MAX_COMMITS_PER_BLOCK = 5; + uint256 public commitsThisBlock; + uint256 public lastBlock; + + event CommitSubmitted( + uint256 indexed sourceChainId, + uint64 startBlock, + uint64 endBlock, + bytes32 root, + string uri, + uint64 ts + ); + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + event PublisherSet(address indexed publisher, bool allowed); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + modifier onlyPublisher() { + require(publishers[msg.sender], "not publisher"); + _; + } + + constructor(address _admin) { + require(_admin != address(0), "zero admin"); + admin = _admin; + publishers[_admin] = true; + } + + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } + + function setPublisher(address publisher, bool allowed) external onlyAdmin { + publishers[publisher] = allowed; + emit PublisherSet(publisher, allowed); + } + + /** + * @notice Submit a Merkle commitment for a block range on source chain (138 or 651940). + * @param sourceChainId Chain ID (e.g. 138, 651940). + * @param startBlock Start block (inclusive). + * @param endBlock End block (inclusive). + * @param root Merkle root of leaves (tx_hash, block_number, receipt_root, payload_hash, sal_hash). + * @param uri URI to leaf set (e.g. S3 or API). + * @param ts Timestamp of commit (epoch seconds). + */ + function submitCommit( + uint256 sourceChainId, + uint64 startBlock, + uint64 endBlock, + bytes32 root, + string calldata uri, + uint64 ts + ) external onlyPublisher whenNotPaused { + require(startBlock <= endBlock, "invalid range"); + require(root != bytes32(0), "zero root"); + + if (block.number != lastBlock) { + lastBlock = block.number; + commitsThisBlock = 0; + } + require(commitsThisBlock < MAX_COMMITS_PER_BLOCK, "rate limit"); + commitsThisBlock++; + commitsCount++; + + emit CommitSubmitted(sourceChainId, startBlock, endBlock, root, uri, ts); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/mirror/TransactionMirror.sol b/verification-sources/chain138-buildinfo-7678218/contracts/mirror/TransactionMirror.sol new file mode 100644 index 0000000..37b5096 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/mirror/TransactionMirror.sol @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title TransactionMirror + * @notice Mirrors Chain-138 transactions to Ethereum Mainnet for Etherscan visibility + * @dev Logs all Chain-138 transactions as events on Mainnet, making them searchable + * and viewable on Etherscan. This provides transparency and auditability. + */ +contract TransactionMirror { + address public admin; + bool public paused; + + // Chain-138 chain ID + uint64 public constant CHAIN_138 = 138; + + // Maximum batch size to prevent gas limit issues + uint256 public constant MAX_BATCH_SIZE = 100; + + // Transaction structure + struct MirroredTransaction { + bytes32 txHash; // Chain-138 transaction hash + address from; // Sender address + address to; // Recipient address (or contract) + uint256 value; // Value transferred + uint256 blockNumber; // Chain-138 block number + uint256 blockTimestamp; // Block timestamp + uint256 gasUsed; // Gas used + bool success; // Transaction success status + bytes data; // Transaction data (if any) + bytes32 indexedHash; // Indexed hash for searchability + } + + // Mapping: txHash => MirroredTransaction + mapping(bytes32 => MirroredTransaction) public transactions; + + // Array of all mirrored transaction hashes + bytes32[] public mirroredTxHashes; + + // Mapping: txHash => bool (replay protection) + mapping(bytes32 => bool) public processed; + + // Events (indexed for Etherscan searchability) + event TransactionMirrored( + bytes32 indexed txHash, + address indexed from, + address indexed to, + uint256 value, + uint256 blockNumber, + uint256 blockTimestamp, + uint256 gasUsed, + bool success + ); + + event BatchTransactionsMirrored( + uint256 count, + uint256 startBlock, + uint256 endBlock + ); + + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin) { + require(_admin != address(0), "zero admin"); + admin = _admin; + } + + /** + * @notice Mirror a single Chain-138 transaction to Mainnet + * @param txHash Chain-138 transaction hash + * @param from Sender address + * @param to Recipient address + * @param value Value transferred + * @param blockNumber Chain-138 block number + * @param blockTimestamp Block timestamp + * @param gasUsed Gas used + * @param success Transaction success status + * @param data Transaction data (optional) + */ + function mirrorTransaction( + bytes32 txHash, + address from, + address to, + uint256 value, + uint256 blockNumber, + uint256 blockTimestamp, + uint256 gasUsed, + bool success, + bytes calldata data + ) external onlyAdmin whenNotPaused { + require(txHash != bytes32(0), "invalid hash"); + require(!processed[txHash], "already mirrored"); + + bytes32 indexedHash = keccak256(abi.encodePacked(CHAIN_138, txHash)); + + transactions[txHash] = MirroredTransaction({ + txHash: txHash, + from: from, + to: to, + value: value, + blockNumber: blockNumber, + blockTimestamp: blockTimestamp, + gasUsed: gasUsed, + success: success, + data: data, + indexedHash: indexedHash + }); + + mirroredTxHashes.push(txHash); + processed[txHash] = true; + + emit TransactionMirrored( + txHash, + from, + to, + value, + blockNumber, + blockTimestamp, + gasUsed, + success + ); + } + + /** + * @notice Mirror multiple Chain-138 transactions in a batch + * @param txHashes Array of transaction hashes + * @param froms Array of sender addresses + * @param tos Array of recipient addresses + * @param values Array of values + * @param blockNumbers Array of block numbers + * @param blockTimestamps Array of timestamps + * @param gasUseds Array of gas used + * @param successes Array of success statuses + * @param datas Array of transaction data + */ + function mirrorBatchTransactions( + bytes32[] calldata txHashes, + address[] calldata froms, + address[] calldata tos, + uint256[] calldata values, + uint256[] calldata blockNumbers, + uint256[] calldata blockTimestamps, + uint256[] calldata gasUseds, + bool[] calldata successes, + bytes[] calldata datas + ) external onlyAdmin whenNotPaused { + uint256 count = txHashes.length; + require(count > 0, "empty batch"); + require(count <= MAX_BATCH_SIZE, "batch too large"); + require( + count == froms.length && + count == tos.length && + count == values.length && + count == blockNumbers.length && + count == blockTimestamps.length && + count == gasUseds.length && + count == successes.length && + count == datas.length, + "array length mismatch" + ); + + uint256 startBlock = blockNumbers[0]; + uint256 endBlock = blockNumbers[count - 1]; + + // Process transactions in batches to avoid stack too deep + for (uint256 i = 0; i < count; i++) { + bytes32 txHash = txHashes[i]; + require(txHash != bytes32(0), "invalid hash"); + require(!processed[txHash], "already mirrored"); + + bytes32 indexedHash = keccak256(abi.encodePacked(CHAIN_138, txHash)); + + transactions[txHash] = MirroredTransaction({ + txHash: txHash, + from: froms[i], + to: tos[i], + value: values[i], + blockNumber: blockNumbers[i], + blockTimestamp: blockTimestamps[i], + gasUsed: gasUseds[i], + success: successes[i], + data: datas[i], + indexedHash: indexedHash + }); + + mirroredTxHashes.push(txHash); + processed[txHash] = true; + + emit TransactionMirrored( + txHash, + froms[i], + tos[i], + values[i], + blockNumbers[i], + blockTimestamps[i], + gasUseds[i], + successes[i] + ); + } + + emit BatchTransactionsMirrored(count, startBlock, endBlock); + } + + + /** + * @notice Get mirrored transaction details + * @param txHash Chain-138 transaction hash + * @return mirroredTx Mirrored transaction structure + */ + function getTransaction(bytes32 txHash) external view returns (MirroredTransaction memory mirroredTx) { + require(processed[txHash], "not mirrored"); + return transactions[txHash]; + } + + /** + * @notice Check if a transaction is mirrored + * @param txHash Chain-138 transaction hash + * @return true if mirrored + */ + function isMirrored(bytes32 txHash) external view returns (bool) { + return processed[txHash]; + } + + /** + * @notice Get total number of mirrored transactions + * @return count Number of mirrored transactions + */ + function getMirroredTransactionCount() external view returns (uint256) { + return mirroredTxHashes.length; + } + + /** + * @notice Get mirrored transaction hash at index + * @param index Index in mirroredTxHashes array + * @return txHash Transaction hash + */ + function getMirroredTransaction(uint256 index) external view returns (bytes32) { + require(index < mirroredTxHashes.length, "out of bounds"); + return mirroredTxHashes[index]; + } + + /** + * @notice Admin functions + */ + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/nft/GRUFormulasNFT.sol b/verification-sources/chain138-buildinfo-7678218/contracts/nft/GRUFormulasNFT.sol new file mode 100644 index 0000000..aea24f6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/nft/GRUFormulasNFT.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Base64.sol"; + +/** + * @title GRUFormulasNFT + * @notice ERC-721 NFT depicting the three GRU-related monetary formulas as on-chain SVG graphics + * @dev Token IDs: 0 = Money Supply (GRU M00/M0/M1), 1 = Money Velocity (M×V=P×Y), 2 = Money Multiplier (m=1.0) + */ +contract GRUFormulasNFT is ERC721, ERC721URIStorage, AccessControl { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + + uint256 public constant TOKEN_ID_MONEY_SUPPLY = 0; + uint256 public constant TOKEN_ID_MONEY_VELOCITY = 1; + uint256 public constant TOKEN_ID_MONEY_MULTIPLIER = 2; + uint256 public constant MAX_TOKEN_ID = 2; + + constructor(address admin) ERC721("GRU Formulas", "GRUF") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MINTER_ROLE, admin); + } + + /** + * @notice Mint one of the three formula NFTs (tokenId 0, 1, or 2) + * @param to Recipient + * @param tokenId 0 = Money Supply, 1 = Money Velocity, 2 = Money Multiplier + */ + function mint(address to, uint256 tokenId) external onlyRole(MINTER_ROLE) { + require(tokenId <= MAX_TOKEN_ID, "GRUFormulasNFT: invalid tokenId"); + _safeMint(to, tokenId); + } + + function _baseURI() internal pure override returns (string memory) { + return ""; + } + + /** + * @notice Returns metadata URI with on-chain SVG image for the formula + * @param tokenId 0 = Money Supply, 1 = Money Velocity, 2 = Money Multiplier + */ + function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { + require(_ownerOf(tokenId) != address(0), "ERC721: invalid token ID"); + (string memory name, string memory description, string memory svg) = _formulaData(tokenId); + string memory imageData = string.concat("data:image/svg+xml;base64,", Base64.encode(bytes(svg))); + string memory json = string.concat( + '{"name":"', name, + '","description":"', description, + '","image":"', imageData, + '"}' + ); + return string.concat("data:application/json;base64,", Base64.encode(bytes(json))); + } + + function _formulaData(uint256 tokenId) internal pure returns (string memory name, string memory description, string memory svg) { + if (tokenId == TOKEN_ID_MONEY_SUPPLY) { + name = "GRU Money Supply (M)"; + description = "GRU monetary layers: 1 M00 = 5 M0 = 25 M1 (base, collateral, credit). Non-ISO synthetic unit of account."; + svg = _svgMoneySupply(); + } else if (tokenId == TOKEN_ID_MONEY_VELOCITY) { + name = "Money Velocity (V)"; + description = "Equation of exchange: M x V = P x Y (money supply, velocity, price level, output)."; + svg = _svgMoneyVelocity(); + } else if (tokenId == TOKEN_ID_MONEY_MULTIPLIER) { + name = "Money Multiplier (m)"; + description = "m = Reserve / Supply; GRU and ISO4217W enforce m = 1.0 (no fractional reserve)."; + svg = _svgMoneyMultiplier(); + } else { + revert("GRUFormulasNFT: invalid tokenId"); + } + } + + function _svgMoneySupply() internal pure returns (string memory) { + return string.concat( + "", + "", + "Money Supply (M) - GRU layers", + "1 M00 = 5 M0 = 25 M1", + "M00 base | M0 collateral | M1 credit", + "" + ); + } + + function _svgMoneyVelocity() internal pure returns (string memory) { + return string.concat( + "", + "", + "Money Velocity (V)", + "M * V = P * Y", + "Equation of exchange", + "" + ); + } + + function _svgMoneyMultiplier() internal pure returns (string memory) { + return string.concat( + "", + "", + "Money Multiplier (m)", + "m = Reserve / Supply = 1.0", + "No fractional reserve (GRU / ISO4217W)", + "" + ); + } + + function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721URIStorage, AccessControl) returns (bool) { + return super.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/oracle/Aggregator.sol b/verification-sources/chain138-buildinfo-7678218/contracts/oracle/Aggregator.sol new file mode 100644 index 0000000..6729ca4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/oracle/Aggregator.sol @@ -0,0 +1,263 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Oracle Aggregator + * @notice Chainlink-compatible oracle aggregator for price feeds + * @dev Implements round-based oracle updates with access control + */ +contract Aggregator { + struct Round { + uint256 answer; + uint256 startedAt; + uint256 updatedAt; + uint256 answeredInRound; + address transmitter; + } + + uint8 public constant decimals = 8; + string public description; + + uint256 public version = 1; + uint256 public latestRound; + + mapping(uint256 => Round) public rounds; + + // Access control + address public admin; + address[] public transmitters; + mapping(address => bool) public isTransmitter; + + // Round parameters + uint256 public heartbeat; + uint256 public deviationThreshold; // in basis points (e.g., 50 = 0.5%) + bool public paused; + + event AnswerUpdated( + int256 indexed current, + uint256 indexed roundId, + uint256 updatedAt + ); + event NewRound( + uint256 indexed roundId, + address indexed startedBy, + uint256 startedAt + ); + event TransmitterAdded(address indexed transmitter); + event TransmitterRemoved(address indexed transmitter); + event AdminChanged(address indexed oldAdmin, address indexed newAdmin); + event HeartbeatUpdated(uint256 oldHeartbeat, uint256 newHeartbeat); + event DeviationThresholdUpdated(uint256 oldThreshold, uint256 newThreshold); + event Paused(address account); + event Unpaused(address account); + + modifier onlyAdmin() { + require(msg.sender == admin, "Aggregator: only admin"); + _; + } + + modifier onlyTransmitter() { + require(isTransmitter[msg.sender], "Aggregator: only transmitter"); + _; + } + + modifier whenNotPaused() { + require(!paused, "Aggregator: paused"); + _; + } + + constructor( + string memory _description, + address _admin, + uint256 _heartbeat, + uint256 _deviationThreshold + ) { + description = _description; + admin = _admin; + heartbeat = _heartbeat; + deviationThreshold = _deviationThreshold; + } + + /** + * @notice Update the answer for the current round + * @param answer New answer value + */ + function updateAnswer(uint256 answer) external virtual onlyTransmitter whenNotPaused { + uint256 currentRound = latestRound; + Round storage round = rounds[currentRound]; + + // Check if we need to start a new round + if (round.updatedAt == 0 || + block.timestamp >= round.startedAt + heartbeat || + shouldUpdate(answer, round.answer)) { + currentRound = latestRound + 1; + latestRound = currentRound; + + rounds[currentRound] = Round({ + answer: answer, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: currentRound, + transmitter: msg.sender + }); + + emit NewRound(currentRound, msg.sender, block.timestamp); + } else { + // Update existing round (median or weighted average logic can be added) + round.updatedAt = block.timestamp; + round.transmitter = msg.sender; + } + + emit AnswerUpdated(int256(answer), currentRound, block.timestamp); + } + + /** + * @notice Check if answer should be updated based on deviation threshold + */ + function shouldUpdate(uint256 newAnswer, uint256 oldAnswer) internal view returns (bool) { + if (oldAnswer == 0) return true; + + uint256 deviation = newAnswer > oldAnswer + ? ((newAnswer - oldAnswer) * 10000) / oldAnswer + : ((oldAnswer - newAnswer) * 10000) / oldAnswer; + + return deviation >= deviationThreshold; + } + + /** + * @notice Get the latest answer + */ + function latestAnswer() external view returns (int256) { + return int256(rounds[latestRound].answer); + } + + /** + * @notice Get the latest round data + */ + function latestRoundData() + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ) + { + Round storage round = rounds[latestRound]; + return ( + uint80(latestRound), + int256(round.answer), + round.startedAt, + round.updatedAt, + uint80(round.answeredInRound) + ); + } + + /** + * @notice Get round data for a specific round + */ + function getRoundData(uint80 _roundId) + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ) + { + Round storage round = rounds[_roundId]; + require(round.updatedAt > 0, "Aggregator: round not found"); + return ( + _roundId, + int256(round.answer), + round.startedAt, + round.updatedAt, + uint80(round.answeredInRound) + ); + } + + /** + * @notice Add a transmitter + */ + function addTransmitter(address transmitter) external onlyAdmin { + require(!isTransmitter[transmitter], "Aggregator: already transmitter"); + isTransmitter[transmitter] = true; + transmitters.push(transmitter); + emit TransmitterAdded(transmitter); + } + + /** + * @notice Remove a transmitter + */ + function removeTransmitter(address transmitter) external onlyAdmin { + require(isTransmitter[transmitter], "Aggregator: not transmitter"); + isTransmitter[transmitter] = false; + + // Remove from array + for (uint256 i = 0; i < transmitters.length; i++) { + if (transmitters[i] == transmitter) { + transmitters[i] = transmitters[transmitters.length - 1]; + transmitters.pop(); + break; + } + } + + emit TransmitterRemoved(transmitter); + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "Aggregator: zero address"); + address oldAdmin = admin; + admin = newAdmin; + emit AdminChanged(oldAdmin, newAdmin); + } + + /** + * @notice Update heartbeat + */ + function updateHeartbeat(uint256 newHeartbeat) external onlyAdmin { + uint256 oldHeartbeat = heartbeat; + heartbeat = newHeartbeat; + emit HeartbeatUpdated(oldHeartbeat, newHeartbeat); + } + + /** + * @notice Update deviation threshold + */ + function updateDeviationThreshold(uint256 newThreshold) external onlyAdmin { + uint256 oldThreshold = deviationThreshold; + deviationThreshold = newThreshold; + emit DeviationThresholdUpdated(oldThreshold, newThreshold); + } + + /** + * @notice Pause the aggregator + */ + function pause() external onlyAdmin { + paused = true; + emit Paused(msg.sender); + } + + /** + * @notice Unpause the aggregator + */ + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(msg.sender); + } + + /** + * @notice Get list of transmitters + */ + function getTransmitters() external view returns (address[] memory) { + return transmitters; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/oracle/IAggregator.sol b/verification-sources/chain138-buildinfo-7678218/contracts/oracle/IAggregator.sol new file mode 100644 index 0000000..5859842 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/oracle/IAggregator.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title IAggregator Interface + * @notice Interface for Chainlink-compatible oracle aggregator + * @dev Based on Chainlink AggregatorV3Interface + */ +interface IAggregator { + /** + * @notice Get the latest answer + * @return answer Latest answer + */ + function latestAnswer() external view returns (int256); + + /** + * @notice Get the latest round data + * @return roundId Round ID + * @return answer Answer + * @return startedAt Started at timestamp + * @return updatedAt Updated at timestamp + * @return answeredInRound Answered in round + */ + function latestRoundData() + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ); + + /** + * @notice Get round data for a specific round + * @param _roundId Round ID + * @return roundId Round ID + * @return answer Answer + * @return startedAt Started at timestamp + * @return updatedAt Updated at timestamp + * @return answeredInRound Answered in round + */ + function getRoundData(uint80 _roundId) + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ); + + /** + * @notice Update the answer (for transmitters) + * @param answer New answer value + */ + function updateAnswer(uint256 answer) external; + + /** + * @notice Get decimals + * @return decimals Number of decimals + */ + function decimals() external view returns (uint8); + + /** + * @notice Get description + * @return description Description + */ + function description() external view returns (string memory); + + /** + * @notice Get version + * @return version Version + */ + function version() external view returns (uint256); +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/oracle/OracleWithCCIP.sol b/verification-sources/chain138-buildinfo-7678218/contracts/oracle/OracleWithCCIP.sol new file mode 100644 index 0000000..be23ffc --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/oracle/OracleWithCCIP.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./Aggregator.sol"; +import "../ccip/CCIPSender.sol"; + +/** + * @title Oracle Aggregator with CCIP Integration + * @notice Extends Aggregator with CCIP cross-chain messaging capabilities + * @dev Automatically sends oracle updates to other chains via CCIP when updates occur + */ +contract OracleWithCCIP is Aggregator { + CCIPSender public ccipSender; + bool public ccipEnabled; + + // Destination chain configurations (using CCIPSender's destinations) + uint64[] public ccipDestinationChains; + + event CCIPUpdateSent( + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + uint256 answer, + uint256 roundId + ); + event CCIPEnabled(bool enabled); + event CCIPSenderUpdated(address oldSender, address newSender); + + constructor( + string memory _description, + address _admin, + uint256 _heartbeat, + uint256 _deviationThreshold, + address _ccipSender + ) Aggregator(_description, _admin, _heartbeat, _deviationThreshold) { + require(_ccipSender != address(0), "OracleWithCCIP: zero sender address"); + ccipSender = CCIPSender(_ccipSender); + ccipEnabled = true; + } + + /** + * @notice Update the answer and send to CCIP destinations + * @param answer New answer value + */ + function updateAnswer(uint256 answer) external override onlyTransmitter whenNotPaused { + uint256 currentRound = latestRound; + Round storage round = rounds[currentRound]; + + // Check if we need to start a new round + if (round.updatedAt == 0 || + block.timestamp >= round.startedAt + heartbeat || + shouldUpdate(answer, round.answer)) { + currentRound = latestRound + 1; + latestRound = currentRound; + + rounds[currentRound] = Round({ + answer: answer, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: currentRound, + transmitter: msg.sender + }); + + emit NewRound(currentRound, msg.sender, block.timestamp); + + // Send to CCIP destinations if enabled + if (ccipEnabled) { + _sendToCCIP(currentRound, answer); + } + } else { + // Update existing round + round.updatedAt = block.timestamp; + round.transmitter = msg.sender; + } + + emit AnswerUpdated(int256(answer), currentRound, block.timestamp); + } + + /** + * @notice Send oracle update to all CCIP destinations + */ + function _sendToCCIP(uint256 roundId, uint256 answer) internal { + uint64[] memory destinations = ccipSender.getDestinationChains(); + + for (uint256 i = 0; i < destinations.length; i++) { + uint64 chainSelector = destinations[i]; + + try ccipSender.sendOracleUpdate( + chainSelector, + answer, + roundId, + block.timestamp + ) returns (bytes32 messageId) { + emit CCIPUpdateSent(messageId, chainSelector, answer, roundId); + } catch { + // Log error but don't revert + // In production, consider adding error tracking + } + } + } + + /** + * @notice Enable/disable CCIP + */ + function setCCIPEnabled(bool enabled) external { + require(msg.sender == admin, "OracleWithCCIP: only admin"); + ccipEnabled = enabled; + emit CCIPEnabled(enabled); + } + + /** + * @notice Update CCIP sender + */ + function updateCCIPSender(address newSender) external { + require(msg.sender == admin, "OracleWithCCIP: only admin"); + require(newSender != address(0), "OracleWithCCIP: zero address"); + + address oldSender = address(ccipSender); + ccipSender = CCIPSender(newSender); + + emit CCIPSenderUpdated(oldSender, newSender); + } + + /** + * @notice Get CCIP destinations + */ + function getCCIPDestinations() external view returns (uint64[] memory) { + return ccipSender.getDestinationChains(); + } + + /** + * @notice Get fee for sending to CCIP destination + */ + function getCCIPFee(uint64 chainSelector) external view returns (uint256) { + bytes memory data = abi.encode(uint256(0), uint256(0), uint256(0)); + return ccipSender.calculateFee(chainSelector, data); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/oracle/Proxy.sol b/verification-sources/chain138-buildinfo-7678218/contracts/oracle/Proxy.sol new file mode 100644 index 0000000..6681cfb --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/oracle/Proxy.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Transparent Proxy + * @notice Transparent proxy pattern for upgradeable oracle contracts + * @dev Based on OpenZeppelin's transparent proxy pattern + */ +contract Proxy { + address public implementation; + address public admin; + + event Upgraded(address indexed implementation); + event AdminChanged(address indexed oldAdmin, address indexed newAdmin); + + modifier onlyAdmin() { + require(msg.sender == admin, "Proxy: only admin"); + _; + } + + constructor(address _implementation, address _admin) { + implementation = _implementation; + admin = _admin; + } + + /** + * @notice Upgrade the implementation + */ + function upgrade(address newImplementation) external onlyAdmin { + require(newImplementation != address(0), "Proxy: zero address"); + implementation = newImplementation; + emit Upgraded(newImplementation); + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "Proxy: zero address"); + address oldAdmin = admin; + admin = newAdmin; + emit AdminChanged(oldAdmin, newAdmin); + } + + /** + * @notice Delegate call to implementation + */ + fallback() external payable { + address impl = implementation; + assembly { + calldatacopy(0, 0, calldatasize()) + let result := delegatecall(gas(), impl, 0, calldatasize(), 0, 0) + returndatacopy(0, 0, returndatasize()) + switch result + case 0 { revert(0, returndatasize()) } + default { return(0, returndatasize()) } + } + } + + receive() external payable {} +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/plugins/PluginRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/plugins/PluginRegistry.sol new file mode 100644 index 0000000..4c09fa5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/plugins/PluginRegistry.sol @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title PluginRegistry + * @notice Central registry for all pluggable components + * @dev Enables adding new asset types, liquidity providers, compliance modules without redeployment + */ +contract PluginRegistry is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant PLUGIN_ADMIN_ROLE = keccak256("PLUGIN_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + enum PluginType { + AssetTypeHandler, + LiquidityProvider, + ComplianceModule, + OracleProvider, + VaultStrategy + } + + struct Plugin { + address implementation; + string version; + bool active; + uint256 registeredAt; + string description; + } + + // Storage + mapping(PluginType => mapping(bytes32 => Plugin)) public plugins; + mapping(PluginType => bytes32[]) public pluginsByType; + + // Plugin metadata + mapping(address => bool) public isRegisteredPlugin; + mapping(PluginType => uint256) public pluginCount; + + event PluginRegistered( + PluginType indexed pluginType, + bytes32 indexed identifier, + address implementation, + string version + ); + + event PluginActivated(PluginType indexed pluginType, bytes32 indexed identifier); + event PluginDeactivated(PluginType indexed pluginType, bytes32 indexed identifier); + event PluginUpgraded( + PluginType indexed pluginType, + bytes32 indexed identifier, + address oldImplementation, + address newImplementation + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(PLUGIN_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Register new plugin + */ + function registerPlugin( + PluginType pluginType, + bytes32 identifier, + address implementation, + string calldata version, + string calldata description + ) external onlyRole(PLUGIN_ADMIN_ROLE) { + require(implementation != address(0), "Zero address"); + require(implementation.code.length > 0, "Not a contract"); + require(plugins[pluginType][identifier].implementation == address(0), "Already registered"); + + plugins[pluginType][identifier] = Plugin({ + implementation: implementation, + version: version, + active: true, + registeredAt: block.timestamp, + description: description + }); + + pluginsByType[pluginType].push(identifier); + isRegisteredPlugin[implementation] = true; + pluginCount[pluginType]++; + + emit PluginRegistered(pluginType, identifier, implementation, version); + } + + /** + * @notice Upgrade plugin to new implementation + */ + function upgradePlugin( + PluginType pluginType, + bytes32 identifier, + address newImplementation, + string calldata newVersion + ) external onlyRole(PLUGIN_ADMIN_ROLE) { + require(newImplementation != address(0), "Zero address"); + require(newImplementation.code.length > 0, "Not a contract"); + + Plugin storage plugin = plugins[pluginType][identifier]; + require(plugin.implementation != address(0), "Plugin not found"); + + address oldImplementation = plugin.implementation; + plugin.implementation = newImplementation; + plugin.version = newVersion; + isRegisteredPlugin[newImplementation] = true; + + emit PluginUpgraded(pluginType, identifier, oldImplementation, newImplementation); + } + + /** + * @notice Activate plugin + */ + function activatePlugin( + PluginType pluginType, + bytes32 identifier + ) external onlyRole(PLUGIN_ADMIN_ROLE) { + Plugin storage plugin = plugins[pluginType][identifier]; + require(plugin.implementation != address(0), "Plugin not found"); + + plugin.active = true; + + emit PluginActivated(pluginType, identifier); + } + + /** + * @notice Deactivate plugin + */ + function deactivatePlugin( + PluginType pluginType, + bytes32 identifier + ) external onlyRole(PLUGIN_ADMIN_ROLE) { + Plugin storage plugin = plugins[pluginType][identifier]; + require(plugin.implementation != address(0), "Plugin not found"); + + plugin.active = false; + + emit PluginDeactivated(pluginType, identifier); + } + + // View functions + + function getPlugin( + PluginType pluginType, + bytes32 identifier + ) external view returns (address implementation) { + Plugin memory plugin = plugins[pluginType][identifier]; + require(plugin.active, "Plugin not active"); + return plugin.implementation; + } + + function getPluginInfo( + PluginType pluginType, + bytes32 identifier + ) external view returns (Plugin memory) { + return plugins[pluginType][identifier]; + } + + function getAllPlugins(PluginType pluginType) external view returns (bytes32[] memory) { + return pluginsByType[pluginType]; + } + + function getPluginCount(PluginType pluginType) external view returns (uint256) { + return pluginCount[pluginType]; + } + + function isPluginActive( + PluginType pluginType, + bytes32 identifier + ) external view returns (bool) { + return plugins[pluginType][identifier].active; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/registry/ChainRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/registry/ChainRegistry.sol new file mode 100644 index 0000000..b543dac --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/registry/ChainRegistry.sol @@ -0,0 +1,320 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title ChainRegistry + * @notice Central registry for all supported blockchains (EVM and non-EVM) + * @dev Maps chain identifiers to adapter contracts and metadata + */ +contract ChainRegistry is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant REGISTRY_ADMIN_ROLE = keccak256("REGISTRY_ADMIN_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + enum ChainType { + EVM, // Ethereum, Polygon, Arbitrum, etc. + XRPL, // XRP Ledger + XDC, // XDC Network (EVM-compatible but different address format) + Stellar, // Stellar Network + Algorand, // Algorand + Hedera, // Hedera Hashgraph + Tron, // Tron + TON, // The Open Network + Cosmos, // Cosmos Hub + Solana, // Solana + Fabric, // Hyperledger Fabric + Corda, // R3 Corda + Indy, // Hyperledger Indy + Firefly, // Hyperledger Firefly + Cacti, // Hyperledger Cacti + Other // Custom/unknown + } + + struct ChainMetadata { + uint256 chainId; // For EVM chains (0 for non-EVM) + string chainIdentifier; // For non-EVM (e.g., "XRPL", "Fabric-Channel1") + ChainType chainType; + address adapter; // Bridge adapter contract address + bool isActive; + uint256 minConfirmations; // Required confirmations + uint256 avgBlockTime; // Average block time in seconds + bool requiresOracle; // Non-EVM chains need oracle + string rpcEndpoint; // RPC endpoint (encrypted or public) + string explorerUrl; // Block explorer URL + bytes additionalData; // Chain-specific config + uint256 addedAt; + uint256 lastUpdated; + } + + // EVM chains: chainId => metadata + mapping(uint256 => ChainMetadata) public evmChains; + + // Non-EVM chains: identifier => metadata + mapping(string => ChainMetadata) public nonEvmChains; + + // All registered chain identifiers + uint256[] public registeredEVMChainIds; + string[] public registeredNonEVMIdentifiers; + + // Adapter validation + mapping(address => bool) public isValidAdapter; + mapping(address => ChainType) public adapterToChainType; + + event ChainRegistered( + uint256 indexed chainId, + string indexed chainIdentifier, + ChainType chainType, + address adapter + ); + + event ChainUpdated( + uint256 indexed chainId, + string indexed chainIdentifier, + bool isActive + ); + + event ChainDeactivated( + uint256 indexed chainId, + string indexed chainIdentifier + ); + + event AdapterUpdated( + uint256 indexed chainId, + string indexed chainIdentifier, + address oldAdapter, + address newAdapter + ); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRY_ADMIN_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Register an EVM chain + */ + function registerEVMChain( + uint256 chainId, + address adapter, + string calldata explorerUrl, + uint256 minConfirmations, + uint256 avgBlockTime, + bytes calldata additionalData + ) external onlyRole(REGISTRY_ADMIN_ROLE) { + require(chainId != 0, "Invalid chain ID"); + require(adapter != address(0), "Zero adapter"); + require(adapter.code.length > 0, "Not a contract"); + + ChainMetadata storage chain = evmChains[chainId]; + + // If new chain, add to list + if (chain.addedAt == 0) { + registeredEVMChainIds.push(chainId); + } + + chain.chainId = chainId; + chain.chainIdentifier = string(abi.encodePacked("EVM-", chainId)); + chain.chainType = ChainType.EVM; + chain.adapter = adapter; + chain.isActive = true; + chain.minConfirmations = minConfirmations; + chain.avgBlockTime = avgBlockTime; + chain.requiresOracle = false; + chain.explorerUrl = explorerUrl; + chain.additionalData = additionalData; + chain.lastUpdated = block.timestamp; + + if (chain.addedAt == 0) { + chain.addedAt = block.timestamp; + } + + isValidAdapter[adapter] = true; + adapterToChainType[adapter] = ChainType.EVM; + + emit ChainRegistered(chainId, chain.chainIdentifier, ChainType.EVM, adapter); + } + + /** + * @notice Register a non-EVM chain + */ + function registerNonEVMChain( + string calldata chainIdentifier, + ChainType chainType, + address adapter, + string calldata explorerUrl, + uint256 minConfirmations, + uint256 avgBlockTime, + bool requiresOracle, + bytes calldata additionalData + ) external onlyRole(REGISTRY_ADMIN_ROLE) { + require(bytes(chainIdentifier).length > 0, "Empty identifier"); + require(adapter != address(0), "Zero adapter"); + require(adapter.code.length > 0, "Not a contract"); + require(chainType != ChainType.EVM, "Use registerEVMChain"); + + ChainMetadata storage chain = nonEvmChains[chainIdentifier]; + + // If new chain, add to list + if (chain.addedAt == 0) { + registeredNonEVMIdentifiers.push(chainIdentifier); + } + + chain.chainId = 0; + chain.chainIdentifier = chainIdentifier; + chain.chainType = chainType; + chain.adapter = adapter; + chain.isActive = true; + chain.minConfirmations = minConfirmations; + chain.avgBlockTime = avgBlockTime; + chain.requiresOracle = requiresOracle; + chain.explorerUrl = explorerUrl; + chain.additionalData = additionalData; + chain.lastUpdated = block.timestamp; + + if (chain.addedAt == 0) { + chain.addedAt = block.timestamp; + } + + isValidAdapter[adapter] = true; + adapterToChainType[adapter] = chainType; + + emit ChainRegistered(0, chainIdentifier, chainType, adapter); + } + + /** + * @notice Update chain adapter + */ + function updateAdapter( + uint256 chainId, + string calldata chainIdentifier, + address newAdapter + ) external onlyRole(REGISTRY_ADMIN_ROLE) { + require(newAdapter != address(0), "Zero adapter"); + require(newAdapter.code.length > 0, "Not a contract"); + + address oldAdapter; + + if (chainId != 0) { + ChainMetadata storage chain = evmChains[chainId]; + require(chain.addedAt != 0, "Chain not registered"); + oldAdapter = chain.adapter; + chain.adapter = newAdapter; + chain.lastUpdated = block.timestamp; + } else { + ChainMetadata storage chain = nonEvmChains[chainIdentifier]; + require(chain.addedAt != 0, "Chain not registered"); + oldAdapter = chain.adapter; + chain.adapter = newAdapter; + chain.lastUpdated = block.timestamp; + } + + isValidAdapter[oldAdapter] = false; + isValidAdapter[newAdapter] = true; + + emit AdapterUpdated(chainId, chainIdentifier, oldAdapter, newAdapter); + } + + /** + * @notice Enable/disable chain + */ + function setChainActive( + uint256 chainId, + string calldata chainIdentifier, + bool active + ) external onlyRole(REGISTRY_ADMIN_ROLE) { + if (chainId != 0) { + ChainMetadata storage chain = evmChains[chainId]; + require(chain.addedAt != 0, "Chain not registered"); + chain.isActive = active; + chain.lastUpdated = block.timestamp; + } else { + ChainMetadata storage chain = nonEvmChains[chainIdentifier]; + require(chain.addedAt != 0, "Chain not registered"); + chain.isActive = active; + chain.lastUpdated = block.timestamp; + } + + emit ChainUpdated(chainId, chainIdentifier, active); + + if (!active) { + emit ChainDeactivated(chainId, chainIdentifier); + } + } + + // View functions + + function getEVMChain(uint256 chainId) + external view returns (ChainMetadata memory) { + return evmChains[chainId]; + } + + function getNonEVMChain(string calldata chainIdentifier) + external view returns (ChainMetadata memory) { + return nonEvmChains[chainIdentifier]; + } + + function getAdapter(uint256 chainId, string calldata chainIdentifier) + external view returns (address) { + if (chainId != 0) { + return evmChains[chainId].adapter; + } else { + return nonEvmChains[chainIdentifier].adapter; + } + } + + function isChainActive(uint256 chainId, string calldata chainIdentifier) + external view returns (bool) { + if (chainId != 0) { + return evmChains[chainId].isActive; + } else { + return nonEvmChains[chainIdentifier].isActive; + } + } + + function getAllEVMChains() + external view returns (uint256[] memory, ChainMetadata[] memory) { + uint256 length = registeredEVMChainIds.length; + ChainMetadata[] memory chains = new ChainMetadata[](length); + + for (uint256 i = 0; i < length; i++) { + chains[i] = evmChains[registeredEVMChainIds[i]]; + } + + return (registeredEVMChainIds, chains); + } + + function getAllNonEVMChains() + external view returns (string[] memory, ChainMetadata[] memory) { + uint256 length = registeredNonEVMIdentifiers.length; + ChainMetadata[] memory chains = new ChainMetadata[](length); + + for (uint256 i = 0; i < length; i++) { + chains[i] = nonEvmChains[registeredNonEVMIdentifiers[i]]; + } + + return (registeredNonEVMIdentifiers, chains); + } + + function getTotalChains() external view returns (uint256, uint256) { + return (registeredEVMChainIds.length, registeredNonEVMIdentifiers.length); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/registry/UniversalAssetRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/registry/UniversalAssetRegistry.sol new file mode 100644 index 0000000..f204451 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/registry/UniversalAssetRegistry.sol @@ -0,0 +1,420 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title UniversalAssetRegistry + * @notice Central registry for all asset types with governance and compliance + * @dev Supports 10+ asset types with hybrid governance based on risk levels + */ +contract UniversalAssetRegistry is + Initializable, + AccessControlUpgradeable, + ReentrancyGuardUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); + bytes32 public constant VALIDATOR_ROLE = keccak256("VALIDATOR_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + // Asset classification types + enum AssetType { + ERC20Standard, // Standard tokens + ISO4217W, // eMoney/CBDCs + GRU, // Global Reserve Units (M00/M0/M1) + Commodity, // Gold, oil, etc. + Security, // Tokenized securities + RealWorldAsset, // Real estate, art, etc. + Synthetic, // Derivatives, futures + Stablecoin, // USDT, USDC, etc. + GovernanceToken, // DAO tokens + NFTBacked // NFT-collateralized tokens + } + + // Compliance levels + enum ComplianceLevel { + Public, // No restrictions + KYC, // KYC required + Accredited, // Accredited investors only + Institutional, // Institutions only + Sovereign // Central banks/governments only + } + + // Proposal types + enum ProposalType { + AddAsset, + RemoveAsset, + UpdateRiskParams, + UpdateCompliance, + EmergencyPause + } + + struct UniversalAsset { + address tokenAddress; + AssetType assetType; + ComplianceLevel complianceLevel; + + // Metadata + string name; + string symbol; + uint8 decimals; + string jurisdiction; + + // Risk parameters + uint8 volatilityScore; // 0-100 + uint256 minBridgeAmount; + uint256 maxBridgeAmount; + uint256 dailyVolumeLimit; + + // PMM liquidity + address pmmPool; + bool hasLiquidity; + uint256 liquidityReserveUSD; + + // Governance + bool requiresGovernance; + address[] validators; + uint256 validationThreshold; + + // Status + bool isActive; + uint256 registeredAt; + uint256 lastUpdated; + } + + struct PendingAssetProposal { + bytes32 proposalId; + ProposalType proposalType; + address proposer; + uint256 proposedAt; + uint256 executeAfter; + uint256 votesFor; + uint256 votesAgainst; + bool executed; + bool cancelled; + + // Proposal data + address tokenAddress; + AssetType assetType; + ComplianceLevel complianceLevel; + string name; + string symbol; + uint8 decimals; + string jurisdiction; + uint8 volatilityScore; + uint256 minBridgeAmount; + uint256 maxBridgeAmount; + } + + // Storage + mapping(address => UniversalAsset) public assets; + mapping(AssetType => address[]) public assetsByType; + mapping(bytes32 => PendingAssetProposal) public proposals; + mapping(bytes32 => mapping(address => bool)) public hasVoted; + + // Governance parameters + uint256 public constant TIMELOCK_STANDARD = 1 days; + uint256 public constant TIMELOCK_MODERATE = 3 days; + uint256 public constant TIMELOCK_HIGH = 7 days; + uint256 public quorumPercentage; + + // Validator set + address[] public validators; + mapping(address => bool) public isValidator; + + // Events + event AssetProposed( + bytes32 indexed proposalId, + address indexed token, + AssetType assetType, + address proposer + ); + + event AssetApproved( + address indexed token, + AssetType assetType, + ComplianceLevel complianceLevel + ); + + event AssetRemoved(address indexed token, AssetType assetType); + + event ValidatorAdded(address indexed validator); + event ValidatorRemoved(address indexed validator); + + event ProposalVoted( + bytes32 indexed proposalId, + address indexed voter, + bool support + ); + + event ProposalExecuted(bytes32 indexed proposalId); + event ProposalCancelled(bytes32 indexed proposalId); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) external initializer { + __AccessControl_init(); + __ReentrancyGuard_init(); + __UUPSUpgradeable_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + _grantRole(PROPOSER_ROLE, admin); + _grantRole(VALIDATOR_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + + quorumPercentage = 51; // 51% quorum + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Propose new asset with timelock governance + */ + function proposeAsset( + address tokenAddress, + AssetType assetType, + ComplianceLevel complianceLevel, + string calldata name, + string calldata symbol, + uint8 decimals, + string calldata jurisdiction, + uint8 volatilityScore, + uint256 minBridge, + uint256 maxBridge + ) external onlyRole(PROPOSER_ROLE) returns (bytes32 proposalId) { + require(tokenAddress != address(0), "Zero address"); + require(!assets[tokenAddress].isActive, "Already registered"); + require(volatilityScore <= 100, "Invalid volatility"); + require(maxBridge >= minBridge, "Invalid limits"); + + proposalId = keccak256(abi.encode( + tokenAddress, + assetType, + block.timestamp, + msg.sender + )); + + uint256 timelockPeriod = _getTimelockPeriod(assetType, complianceLevel); + + PendingAssetProposal storage proposal = proposals[proposalId]; + proposal.proposalId = proposalId; + proposal.proposalType = ProposalType.AddAsset; + proposal.proposer = msg.sender; + proposal.proposedAt = block.timestamp; + proposal.executeAfter = block.timestamp + timelockPeriod; + proposal.tokenAddress = tokenAddress; + proposal.assetType = assetType; + proposal.complianceLevel = complianceLevel; + proposal.name = name; + proposal.symbol = symbol; + proposal.decimals = decimals; + proposal.jurisdiction = jurisdiction; + proposal.volatilityScore = volatilityScore; + proposal.minBridgeAmount = minBridge; + proposal.maxBridgeAmount = maxBridge; + + emit AssetProposed(proposalId, tokenAddress, assetType, msg.sender); + + return proposalId; + } + + /** + * @notice Vote on asset proposal + */ + function voteOnProposal( + bytes32 proposalId, + bool support + ) external onlyRole(VALIDATOR_ROLE) { + PendingAssetProposal storage proposal = proposals[proposalId]; + require(!proposal.executed, "Already executed"); + require(!proposal.cancelled, "Cancelled"); + require(!hasVoted[proposalId][msg.sender], "Already voted"); + + hasVoted[proposalId][msg.sender] = true; + + if (support) { + proposal.votesFor++; + } else { + proposal.votesAgainst++; + } + + emit ProposalVoted(proposalId, msg.sender, support); + } + + /** + * @notice Execute proposal after timelock + */ + function executeProposal(bytes32 proposalId) external nonReentrant { + PendingAssetProposal storage proposal = proposals[proposalId]; + + require(!proposal.executed, "Already executed"); + require(!proposal.cancelled, "Cancelled"); + require(block.timestamp >= proposal.executeAfter, "Timelock active"); + + // Check quorum + uint256 totalVotes = proposal.votesFor + proposal.votesAgainst; + uint256 requiredVotes = (validators.length * quorumPercentage) / 100; + require(totalVotes >= requiredVotes, "Quorum not met"); + require(proposal.votesFor > proposal.votesAgainst, "Rejected"); + + // Execute based on proposal type + if (proposal.proposalType == ProposalType.AddAsset) { + _registerAsset(proposal); + } + + proposal.executed = true; + emit ProposalExecuted(proposalId); + } + + /** + * @notice Internal asset registration + */ + function _registerAsset(PendingAssetProposal storage proposal) internal { + UniversalAsset storage asset = assets[proposal.tokenAddress]; + + asset.tokenAddress = proposal.tokenAddress; + asset.assetType = proposal.assetType; + asset.complianceLevel = proposal.complianceLevel; + asset.name = proposal.name; + asset.symbol = proposal.symbol; + asset.decimals = proposal.decimals; + asset.jurisdiction = proposal.jurisdiction; + asset.volatilityScore = proposal.volatilityScore; + asset.minBridgeAmount = proposal.minBridgeAmount; + asset.maxBridgeAmount = proposal.maxBridgeAmount; + asset.dailyVolumeLimit = proposal.maxBridgeAmount * 10; + asset.requiresGovernance = _requiresGovernance( + proposal.assetType, + proposal.complianceLevel + ); + asset.isActive = true; + asset.registeredAt = block.timestamp; + asset.lastUpdated = block.timestamp; + + assetsByType[proposal.assetType].push(proposal.tokenAddress); + + emit AssetApproved( + proposal.tokenAddress, + proposal.assetType, + proposal.complianceLevel + ); + } + + /** + * @notice Add validator + */ + function addValidator(address validator) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(validator != address(0), "Zero address"); + require(!isValidator[validator], "Already validator"); + + validators.push(validator); + isValidator[validator] = true; + _grantRole(VALIDATOR_ROLE, validator); + + emit ValidatorAdded(validator); + } + + /** + * @notice Remove validator + */ + function removeValidator(address validator) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isValidator[validator], "Not validator"); + + isValidator[validator] = false; + _revokeRole(VALIDATOR_ROLE, validator); + + // Remove from array + for (uint256 i = 0; i < validators.length; i++) { + if (validators[i] == validator) { + validators[i] = validators[validators.length - 1]; + validators.pop(); + break; + } + } + + emit ValidatorRemoved(validator); + } + + /** + * @notice Update PMM pool for asset + */ + function updatePMMPool( + address token, + address pmmPool + ) external onlyRole(REGISTRAR_ROLE) { + require(assets[token].isActive, "Not registered"); + + assets[token].pmmPool = pmmPool; + assets[token].hasLiquidity = pmmPool != address(0); + assets[token].lastUpdated = block.timestamp; + } + + /** + * @notice Get timelock period based on asset type and compliance + */ + function _getTimelockPeriod( + AssetType assetType, + ComplianceLevel complianceLevel + ) internal pure returns (uint256) { + if (assetType == AssetType.Security || + assetType == AssetType.ISO4217W || + complianceLevel >= ComplianceLevel.Institutional) { + return TIMELOCK_HIGH; + } else if (assetType == AssetType.Commodity || + assetType == AssetType.RealWorldAsset || + complianceLevel >= ComplianceLevel.Accredited) { + return TIMELOCK_MODERATE; + } else { + return TIMELOCK_STANDARD; + } + } + + /** + * @notice Check if asset type requires governance + */ + function _requiresGovernance( + AssetType assetType, + ComplianceLevel complianceLevel + ) internal pure returns (bool) { + return assetType == AssetType.Security || + assetType == AssetType.ISO4217W || + assetType == AssetType.Commodity || + complianceLevel >= ComplianceLevel.Accredited; + } + + // View functions + + function getAsset(address token) external view returns (UniversalAsset memory) { + return assets[token]; + } + + function getAssetType(address token) external view returns (AssetType) { + return assets[token].assetType; + } + + function getAssetsByType(AssetType assetType) external view returns (address[] memory) { + return assetsByType[assetType]; + } + + function getValidators() external view returns (address[] memory) { + return validators; + } + + function getProposal(bytes32 proposalId) external view returns (PendingAssetProposal memory) { + return proposals[proposalId]; + } + + function isAssetActive(address token) external view returns (bool) { + return assets[token].isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/CommodityHandler.sol b/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/CommodityHandler.sol new file mode 100644 index 0000000..0cfac6b --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/CommodityHandler.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../interfaces/IAssetTypeHandler.sol"; + +/** + * @title CommodityHandler + * @notice Handler for commodity-backed tokens (gold, oil, etc.) with certificate validation + */ +contract CommodityHandler is IAssetTypeHandler { + // Certificate registry for commodity authenticity + mapping(address => mapping(bytes32 => bool)) public validCertificates; + + // Custodian registry + mapping(address => address) public custodians; + + function validateAsset(address token) external view override returns (bool) { + if (token.code.length == 0) return false; + + // Verify custodian is registered + return custodians[token] != address(0); + } + + function getRequiredCompliance() external pure override returns (UniversalAssetRegistry.ComplianceLevel) { + return UniversalAssetRegistry.ComplianceLevel.KYC; + } + + function getDefaultLimits() external pure override returns (uint256 min, uint256 max) { + return (1e15, 1000000e18); // 0.001 to 1M units + } + + function preTransferHook(address, address, uint256 amount) external pure override { + require(amount > 0, "Invalid amount"); + // Certificate validation would happen here in production + } + + function postTransferHook(address, address, uint256) external pure override { + // Post-transfer custodian notification if needed + } + + // Admin functions + function registerCustodian(address token, address custodian) external { + custodians[token] = custodian; + } + + function registerCertificate(address token, bytes32 certificateHash) external { + validCertificates[token][certificateHash] = true; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/ERC20Handler.sol b/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/ERC20Handler.sol new file mode 100644 index 0000000..a41b343 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/ERC20Handler.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../interfaces/IAssetTypeHandler.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title ERC20Handler + * @notice Handler for standard ERC-20 tokens + */ +contract ERC20Handler is IAssetTypeHandler { + function validateAsset(address token) external view override returns (bool) { + if (token.code.length == 0) return false; + + try IERC20(token).totalSupply() returns (uint256) { + return true; + } catch { + return false; + } + } + + function getRequiredCompliance() external pure override returns (UniversalAssetRegistry.ComplianceLevel) { + return UniversalAssetRegistry.ComplianceLevel.Public; + } + + function getDefaultLimits() external pure override returns (uint256 min, uint256 max) { + return (1e15, 1000000e18); // 0.001 to 1M tokens + } + + function preTransferHook(address, address, uint256) external pure override { + // No pre-transfer checks for standard ERC-20 + } + + function postTransferHook(address, address, uint256) external pure override { + // No post-transfer hooks for standard ERC-20 + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/GRUHandler.sol b/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/GRUHandler.sol new file mode 100644 index 0000000..a61998e --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/GRUHandler.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../interfaces/IAssetTypeHandler.sol"; +import "../../vault/libraries/GRUConstants.sol"; + +/** + * @title GRUHandler + * @notice Handler for Global Reserve Unit (GRU) tokens with layer validation + */ +contract GRUHandler is IAssetTypeHandler { + using GRUConstants for *; + + function validateAsset(address token) external view override returns (bool) { + if (token.code.length == 0) return false; + + // Additional GRU-specific validation could be added here + // For now, basic contract existence check + return true; + } + + function getRequiredCompliance() external pure override returns (UniversalAssetRegistry.ComplianceLevel) { + return UniversalAssetRegistry.ComplianceLevel.Institutional; + } + + function getDefaultLimits() external pure override returns (uint256 min, uint256 max) { + return (1e18, 10000000e18); // 1 to 10M GRU + } + + function preTransferHook(address, address, uint256) external pure override { + // GRU layer validation happens in the token contract itself + } + + function postTransferHook(address, address, uint256) external pure override { + // Post-transfer hooks for GRU if needed + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/ISO4217WHandler.sol b/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/ISO4217WHandler.sol new file mode 100644 index 0000000..75db2fb --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/ISO4217WHandler.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../interfaces/IAssetTypeHandler.sol"; +import "../../iso4217w/interfaces/IISO4217WToken.sol"; + +/** + * @title ISO4217WHandler + * @notice Handler for ISO-4217W eMoney/CBDC tokens with compliance checks + */ +contract ISO4217WHandler is IAssetTypeHandler { + function validateAsset(address token) external view override returns (bool) { + if (token.code.length == 0) return false; + + try IISO4217WToken(token).currencyCode() returns (string memory code) { + // Verify it follows ISO-4217W format (e.g., USDW, EURW) + bytes memory codeBytes = bytes(code); + return codeBytes.length >= 4 && codeBytes[codeBytes.length - 1] == 'W'; + } catch { + return false; + } + } + + function getRequiredCompliance() external pure override returns (UniversalAssetRegistry.ComplianceLevel) { + return UniversalAssetRegistry.ComplianceLevel.KYC; + } + + function getDefaultLimits() external pure override returns (uint256 min, uint256 max) { + return (100e18, 1000000e18); // 100 to 1M units + } + + function preTransferHook(address from, address to, uint256 amount) external view override { + // Compliance checks would go here + // In practice, this would integrate with ComplianceGuard + require(from != address(0) && to != address(0), "Invalid addresses"); + require(amount > 0, "Invalid amount"); + } + + function postTransferHook(address, address, uint256) external pure override { + // Post-transfer compliance tracking if needed + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/SecurityHandler.sol b/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/SecurityHandler.sol new file mode 100644 index 0000000..11e9223 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/registry/handlers/SecurityHandler.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../interfaces/IAssetTypeHandler.sol"; + +/** + * @title SecurityHandler + * @notice Handler for tokenized securities with accredited investor requirements + */ +contract SecurityHandler is IAssetTypeHandler { + // In production, this would integrate with accredited investor registry + mapping(address => bool) public accreditedInvestors; + + function validateAsset(address token) external view override returns (bool) { + if (token.code.length == 0) return false; + + // Additional security token validation + // Could check for compliance with standards like ERC-3643 (T-REX) + return true; + } + + function getRequiredCompliance() external pure override returns (UniversalAssetRegistry.ComplianceLevel) { + return UniversalAssetRegistry.ComplianceLevel.Accredited; + } + + function getDefaultLimits() external pure override returns (uint256 min, uint256 max) { + return (1e18, 100000e18); // 1 to 100K securities + } + + function preTransferHook(address from, address to, uint256 amount) external view override { + // Verify accredited investor status + if (from != address(0)) { + require(accreditedInvestors[from], "Sender not accredited"); + } + if (to != address(0)) { + require(accreditedInvestors[to], "Recipient not accredited"); + } + require(amount > 0, "Invalid amount"); + } + + function postTransferHook(address, address, uint256) external pure override { + // Post-transfer compliance tracking (e.g., T+2 settlement) + } + + // Admin function to set accredited status (in production, would be permissioned) + function setAccreditedStatus(address investor, bool status) external { + accreditedInvestors[investor] = status; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/registry/interfaces/IAssetTypeHandler.sol b/verification-sources/chain138-buildinfo-7678218/contracts/registry/interfaces/IAssetTypeHandler.sol new file mode 100644 index 0000000..62ad4fc --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/registry/interfaces/IAssetTypeHandler.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../UniversalAssetRegistry.sol"; + +/** + * @title IAssetTypeHandler + * @notice Interface for asset-specific validation and hooks + */ +interface IAssetTypeHandler { + function validateAsset(address token) external view returns (bool); + function getRequiredCompliance() external view returns (UniversalAssetRegistry.ComplianceLevel); + function getDefaultLimits() external view returns (uint256 min, uint256 max); + function preTransferHook(address from, address to, uint256 amount) external; + function postTransferHook(address from, address to, uint256 amount) external; +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/relay/CCIPRelayBridge.sol b/verification-sources/chain138-buildinfo-7678218/contracts/relay/CCIPRelayBridge.sol new file mode 100644 index 0000000..aa4b2d5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/relay/CCIPRelayBridge.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "../ccip/IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title CCIP Relay Bridge + * @notice Bridge that accepts messages from a relay router + * @dev Modified version of CCIPWETH9Bridge that accepts relay router + */ +contract CCIPRelayBridge is AccessControl { + bytes32 public constant ROUTER_ROLE = keccak256("ROUTER_ROLE"); + + address public immutable weth9; + address public relayRouter; + + // Track cross-chain transfers for replay protection + mapping(bytes32 => bool) public processedTransfers; + mapping(address => uint256) public nonces; + + event CrossChainTransferCompleted( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed recipient, + uint256 amount + ); + + constructor(address _weth9, address _relayRouter) { + require(_weth9 != address(0), "CCIPRelayBridge: zero WETH9"); + require(_relayRouter != address(0), "CCIPRelayBridge: zero router"); + + weth9 = _weth9; + relayRouter = _relayRouter; + _grantRole(ROUTER_ROLE, _relayRouter); + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + } + + /** + * @notice Update relay router address + */ + function updateRelayRouter(address newRelayRouter) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(newRelayRouter != address(0), "CCIPRelayBridge: zero address"); + _revokeRole(ROUTER_ROLE, relayRouter); + relayRouter = newRelayRouter; + _grantRole(ROUTER_ROLE, newRelayRouter); + } + + /** + * @notice Receive WETH9 tokens from another chain via relay + * @param message The CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRole(ROUTER_ROLE) { + // Replay protection + require(!processedTransfers[message.messageId], "CCIPRelayBridge: transfer already processed"); + processedTransfers[message.messageId] = true; + + // Validate token amounts + require(message.tokenAmounts.length > 0, "CCIPRelayBridge: no tokens"); + require(message.tokenAmounts[0].token == weth9, "CCIPRelayBridge: invalid token"); + + uint256 amount = message.tokenAmounts[0].amount; + require(amount > 0, "CCIPRelayBridge: invalid amount"); + + // Decode transfer data (recipient, amount, sender, nonce) + (address recipient, , , ) = abi.decode( + message.data, + (address, uint256, address, uint256) + ); + + require(recipient != address(0), "CCIPRelayBridge: zero recipient"); + + // Transfer WETH9 to recipient + require(IERC20(weth9).transfer(recipient, amount), "CCIPRelayBridge: transfer failed"); + + emit CrossChainTransferCompleted( + message.messageId, + message.sourceChainSelector, + recipient, + amount + ); + } + + /** + * @notice Get user nonce + */ + function getUserNonce(address user) external view returns (uint256) { + return nonces[user]; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/relay/CCIPRelayRouter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/relay/CCIPRelayRouter.sol new file mode 100644 index 0000000..9b1ce8b --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/relay/CCIPRelayRouter.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "../ccip/IRouterClient.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title CCIP Relay Router + * @notice Relay router that forwards CCIP messages from off-chain relay to bridge contracts + * @dev This contract acts as a relay endpoint on the destination chain + */ +contract CCIPRelayRouter is AccessControl { + bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE"); + + // Mapping of bridge contracts that can receive messages + mapping(address => bool) public authorizedBridges; + + event MessageRelayed( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed bridge, + address recipient, + uint256 amount + ); + + event BridgeAuthorized(address indexed bridge); + event BridgeRevoked(address indexed bridge); + + constructor() { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + } + + /** + * @notice Authorize a bridge contract to receive relayed messages + */ + function authorizeBridge(address bridge) external onlyRole(DEFAULT_ADMIN_ROLE) { + authorizedBridges[bridge] = true; + emit BridgeAuthorized(bridge); + } + + /** + * @notice Revoke authorization for a bridge contract + */ + function revokeBridge(address bridge) external onlyRole(DEFAULT_ADMIN_ROLE) { + authorizedBridges[bridge] = false; + emit BridgeRevoked(bridge); + } + + /** + * @notice Grant relayer role to an address + */ + function grantRelayerRole(address relayer) external onlyRole(DEFAULT_ADMIN_ROLE) { + _grantRole(RELAYER_ROLE, relayer); + } + + /** + * @notice Revoke relayer role from an address + */ + function revokeRelayerRole(address relayer) external onlyRole(DEFAULT_ADMIN_ROLE) { + _revokeRole(RELAYER_ROLE, relayer); + } + + /** + * @notice Relay a CCIP message to a bridge contract + * @param bridge The bridge contract address to receive the message + * @param message The CCIP message to relay + */ + function relayMessage( + address bridge, + IRouterClient.Any2EVMMessage calldata message + ) external onlyRole(RELAYER_ROLE) { + require(authorizedBridges[bridge], "CCIPRelayRouter: bridge not authorized"); + + // Call bridge's ccipReceive function using low-level call + // This ensures proper ABI encoding for the struct parameter + // The call will revert with the actual error if it fails + (bool success, bytes memory returnData) = bridge.call( + abi.encodeWithSignature("ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))", message) + ); + require(success, "CCIPRelayRouter: ccipReceive failed"); + + // If we get here, the call succeeded + // Decode recipient and amount from message data + (address recipient, uint256 amount, , ) = abi.decode( + message.data, + (address, uint256, address, uint256) + ); + + emit MessageRelayed( + message.messageId, + message.sourceChainSelector, + bridge, + recipient, + amount + ); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/reserve/IReserveSystem.sol b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/IReserveSystem.sol new file mode 100644 index 0000000..c23f819 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/IReserveSystem.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IReserveSystem + * @notice Interface for the GRU Reserve System + * @dev Defines the core functionality for reserve management, conversion, and redemption + */ +interface IReserveSystem { + // ============ Events ============ + + event ReserveDeposited( + address indexed asset, + uint256 amount, + address indexed depositor, + bytes32 indexed reserveId + ); + + event ReserveWithdrawn( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed reserveId + ); + + event ConversionExecuted( + address indexed sourceAsset, + address indexed targetAsset, + uint256 sourceAmount, + uint256 targetAmount, + bytes32 indexed conversionId, + uint256 fees + ); + + event RedemptionExecuted( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed redemptionId + ); + + event PriceFeedUpdated( + address indexed asset, + uint256 price, + uint256 timestamp + ); + + // ============ Reserve Management ============ + + /** + * @notice Deposit assets into the reserve system + * @param asset Address of the asset to deposit + * @param amount Amount to deposit + * @return reserveId Unique identifier for this reserve deposit + */ + function depositReserve( + address asset, + uint256 amount + ) external returns (bytes32 reserveId); + + /** + * @notice Withdraw assets from the reserve system + * @param asset Address of the asset to withdraw + * @param amount Amount to withdraw + * @param recipient Address to receive the withdrawn assets + * @return reserveId Unique identifier for this reserve withdrawal + */ + function withdrawReserve( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 reserveId); + + /** + * @notice Get the total reserve balance for an asset + * @param asset Address of the asset + * @return balance Total reserve balance + */ + function getReserveBalance(address asset) external view returns (uint256 balance); + + /** + * @notice Get reserve balance for a specific reserve ID + * @param reserveId Unique identifier for the reserve + * @return asset Address of the asset + * @return balance Reserve balance + */ + function getReserveById(bytes32 reserveId) external view returns (address asset, uint256 balance); + + // ============ Conversion ============ + + /** + * @notice Convert assets using optimal path (XAU triangulation) + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return conversionId Unique identifier for this conversion + * @return targetAmount Amount received after conversion + * @return fees Total fees charged + */ + function convertAssets( + address sourceAsset, + address targetAsset, + uint256 amount + ) external returns ( + bytes32 conversionId, + uint256 targetAmount, + uint256 fees + ); + + /** + * @notice Calculate conversion amount without executing + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return targetAmount Expected amount after conversion + * @return fees Expected fees + * @return path Optimal conversion path + */ + function calculateConversion( + address sourceAsset, + address targetAsset, + uint256 amount + ) external view returns ( + uint256 targetAmount, + uint256 fees, + address[] memory path + ); + + // ============ Redemption ============ + + /** + * @notice Redeem assets from the reserve system + * @param asset Address of the asset to redeem + * @param amount Amount to redeem + * @param recipient Address to receive the redeemed assets + * @return redemptionId Unique identifier for this redemption + */ + function redeem( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 redemptionId); + + // ============ Price Feeds ============ + + /** + * @notice Update price feed for an asset + * @param asset Address of the asset + * @param price Current price + * @param timestamp Price timestamp + */ + function updatePriceFeed( + address asset, + uint256 price, + uint256 timestamp + ) external; + + /** + * @notice Get current price for an asset + * @param asset Address of the asset + * @return price Current price + * @return timestamp Price timestamp + */ + function getPrice(address asset) external view returns (uint256 price, uint256 timestamp); + + /** + * @notice Get price for conversion between two assets + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @return price Conversion price (target per source) + */ + function getConversionPrice( + address sourceAsset, + address targetAsset + ) external view returns (uint256 price); +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/reserve/MockPriceFeed.sol b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/MockPriceFeed.sol new file mode 100644 index 0000000..d0497a0 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/MockPriceFeed.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "../oracle/IAggregator.sol"; + +/** + * @title MockPriceFeed + * @notice Mock price feed for testing and development + * @dev Implements IAggregator interface for Chainlink compatibility + */ +contract MockPriceFeed is IAggregator, Ownable { + int256 private _latestAnswer; + uint256 private _latestTimestamp; + uint8 private _decimals; + + event PriceUpdated(int256 newPrice, uint256 timestamp); + + constructor(int256 initialPrice, uint8 decimals_) Ownable(msg.sender) { + _latestAnswer = initialPrice; + _latestTimestamp = block.timestamp; + _decimals = decimals_; + } + + /** + * @notice Update price (owner only) + * @param newPrice New price value + */ + function updatePrice(int256 newPrice) external onlyOwner { + require(newPrice > 0, "MockPriceFeed: price must be positive"); + _latestAnswer = newPrice; + _latestTimestamp = block.timestamp; + emit PriceUpdated(newPrice, block.timestamp); + } + + /** + * @notice Update price with custom timestamp + * @param newPrice New price value + * @param timestamp Custom timestamp + */ + function updatePriceWithTimestamp(int256 newPrice, uint256 timestamp) external onlyOwner { + require(newPrice > 0, "MockPriceFeed: price must be positive"); + require(timestamp <= block.timestamp, "MockPriceFeed: future timestamp"); + _latestAnswer = newPrice; + _latestTimestamp = timestamp; + emit PriceUpdated(newPrice, timestamp); + } + + /** + * @notice Get latest answer + * @return answer Latest price answer + */ + function latestAnswer() external view override returns (int256) { + return _latestAnswer; + } + + /** + * @notice Get latest timestamp + * @return timestamp Latest price timestamp + */ + function latestTimestamp() external view returns (uint256) { + return _latestTimestamp; + } + + /** + * @notice Get decimals + * @return decimals Number of decimals + */ + function decimals() external view override returns (uint8) { + return _decimals; + } + + /** + * @notice Get latest round data + * @return roundId Round ID (mock: always 1) + * @return answer Latest price answer + * @return startedAt Start timestamp (mock: same as latestTimestamp) + * @return updatedAt Latest timestamp + * @return answeredInRound Round ID (mock: always 1) + */ + function latestRoundData() external view override returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ) { + return ( + 1, + _latestAnswer, + _latestTimestamp, + _latestTimestamp, + 1 + ); + } + + /** + * @notice Get round data (mock: always returns latest) + * @param roundId Round ID (ignored in mock) + * @return roundId Round ID + * @return answer Latest price answer + * @return startedAt Start timestamp + * @return updatedAt Latest timestamp + * @return answeredInRound Round ID + */ + function getRoundData(uint80 roundId) external view override returns ( + uint80, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ) { + return ( + roundId, + _latestAnswer, + _latestTimestamp, + _latestTimestamp, + roundId + ); + } + + /** + * @notice Get description + * @return description Price feed description + */ + function description() external pure override returns (string memory) { + return "Mock Price Feed"; + } + + /** + * @notice Update answer (for testing) + * @param answer New answer value + */ + function updateAnswer(uint256 answer) external override onlyOwner { + require(answer > 0, "MockPriceFeed: answer must be positive"); + _latestAnswer = int256(answer); + _latestTimestamp = block.timestamp; + emit PriceUpdated(int256(answer), block.timestamp); + } + + /** + * @notice Get version + * @return version Version number + */ + function version() external pure override returns (uint256) { + return 1; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/reserve/OraclePriceFeed.sol b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/OraclePriceFeed.sol new file mode 100644 index 0000000..64a8560 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/OraclePriceFeed.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../oracle/IAggregator.sol"; +import "./IReserveSystem.sol"; + +/** + * @title OraclePriceFeed + * @notice Integrates Reserve System with Chainlink-compatible oracle aggregators + * @dev Provides price feeds from multiple sources with aggregation and validation + */ +contract OraclePriceFeed is AccessControl { + bytes32 public constant PRICE_FEED_UPDATER_ROLE = keccak256("PRICE_FEED_UPDATER_ROLE"); + + IReserveSystem public reserveSystem; + + // Asset to aggregator mapping + mapping(address => address) public aggregators; + // Asset to price multiplier (for decimals conversion) + mapping(address => uint256) public priceMultipliers; + + // Price feed update interval (seconds) + uint256 public updateInterval = 30; + + // Last update timestamp per asset + mapping(address => uint256) public lastUpdateTime; + + event AggregatorSet(address indexed asset, address indexed aggregator, uint256 multiplier); + event PriceFeedUpdated(address indexed asset, uint256 price, uint256 timestamp); + + constructor(address admin, address reserveSystem_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(PRICE_FEED_UPDATER_ROLE, admin); + + reserveSystem = IReserveSystem(reserveSystem_); + } + + /** + * @notice Set aggregator for an asset + * @param asset Address of the asset + * @param aggregator Address of the Chainlink aggregator + * @param multiplier Price multiplier for decimals conversion (e.g., 1e10 for 8-decimal aggregator to 18 decimals) + */ + function setAggregator( + address asset, + address aggregator, + uint256 multiplier + ) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(asset != address(0), "OraclePriceFeed: zero asset"); + require(aggregator != address(0), "OraclePriceFeed: zero aggregator"); + require(multiplier > 0, "OraclePriceFeed: zero multiplier"); + + aggregators[asset] = aggregator; + priceMultipliers[asset] = multiplier; + + emit AggregatorSet(asset, aggregator, multiplier); + } + + /** + * @notice Update price feed from aggregator + * @param asset Address of the asset + */ + function updatePriceFeed(address asset) public onlyRole(PRICE_FEED_UPDATER_ROLE) { + address aggregator = aggregators[asset]; + require(aggregator != address(0), "OraclePriceFeed: aggregator not set"); + + IAggregator agg = IAggregator(aggregator); + (, int256 answer, , uint256 updatedAt, ) = agg.latestRoundData(); + + require(answer > 0, "OraclePriceFeed: invalid price"); + require(updatedAt > 0, "OraclePriceFeed: invalid timestamp"); + require(block.timestamp - updatedAt <= updateInterval * 2, "OraclePriceFeed: stale price"); + + uint256 price = uint256(answer) * priceMultipliers[asset]; + + reserveSystem.updatePriceFeed(asset, price, updatedAt); + + lastUpdateTime[asset] = block.timestamp; + + emit PriceFeedUpdated(asset, price, updatedAt); + } + + /** + * @notice Update multiple price feeds + * @param assets Array of asset addresses + */ + function updateMultiplePriceFeeds(address[] calldata assets) external onlyRole(PRICE_FEED_UPDATER_ROLE) { + for (uint256 i = 0; i < assets.length; i++) { + updatePriceFeed(assets[i]); + } + } + + /** + * @notice Get current price from aggregator and update reserve system + * @param asset Address of the asset + * @return price Current price + * @return timestamp Price timestamp + */ + function getAndUpdatePrice(address asset) external returns (uint256 price, uint256 timestamp) { + updatePriceFeed(asset); + return reserveSystem.getPrice(asset); + } + + /** + * @notice Set update interval + * @param interval New update interval in seconds + */ + function setUpdateInterval(uint256 interval) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(interval > 0, "OraclePriceFeed: zero interval"); + updateInterval = interval; + } + + /** + * @notice Check if price feed needs update + * @param asset Address of the asset + * @return updateNeeded True if update is needed + */ + function needsUpdate(address asset) external view returns (bool updateNeeded) { + uint256 lastUpdate = lastUpdateTime[asset]; + if (lastUpdate == 0) { + return true; + } + return block.timestamp - lastUpdate >= updateInterval; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/reserve/PriceFeedKeeper.sol b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/PriceFeedKeeper.sol new file mode 100644 index 0000000..72a71ad --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/PriceFeedKeeper.sol @@ -0,0 +1,260 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./OraclePriceFeed.sol"; + +/** + * @title PriceFeedKeeper + * @notice Keeper contract for automated price feed updates + * @dev Can be called by external keepers (Chainlink Keepers, Gelato, etc.) to update price feeds + */ +contract PriceFeedKeeper is AccessControl, ReentrancyGuard { + bytes32 public constant KEEPER_ROLE = keccak256("KEEPER_ROLE"); + bytes32 public constant UPKEEPER_ROLE = keccak256("UPKEEPER_ROLE"); // Can update keeper addresses + + OraclePriceFeed public oraclePriceFeed; + + // Asset tracking + address[] public trackedAssets; + mapping(address => bool) public isTracked; + + // Update configuration + uint256 public updateInterval = 30; // seconds + mapping(address => uint256) public lastUpdateTime; + + // Keeper configuration + uint256 public maxUpdatesPerCall = 10; // Maximum assets to update per call + uint256 public gasBuffer = 50000; // Gas buffer for keeper operations + + event AssetTracked(address indexed asset); + event AssetUntracked(address indexed asset); + event PriceFeedsUpdated(address[] assets, uint256 timestamp); + event UpdateIntervalChanged(uint256 oldInterval, uint256 newInterval); + event MaxUpdatesPerCallChanged(uint256 oldMax, uint256 newMax); + + constructor(address admin, address oraclePriceFeed_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(KEEPER_ROLE, admin); + _grantRole(UPKEEPER_ROLE, admin); + + oraclePriceFeed = OraclePriceFeed(oraclePriceFeed_); + } + + /** + * @notice Add asset to tracking list + * @param asset Address of the asset to track + */ + function trackAsset(address asset) external onlyRole(UPKEEPER_ROLE) { + require(asset != address(0), "PriceFeedKeeper: zero address"); + require(!isTracked[asset], "PriceFeedKeeper: already tracked"); + + trackedAssets.push(asset); + isTracked[asset] = true; + + emit AssetTracked(asset); + } + + /** + * @notice Remove asset from tracking list + * @param asset Address of the asset to untrack + */ + function untrackAsset(address asset) external onlyRole(UPKEEPER_ROLE) { + require(isTracked[asset], "PriceFeedKeeper: not tracked"); + + // Remove from array + for (uint256 i = 0; i < trackedAssets.length; i++) { + if (trackedAssets[i] == asset) { + trackedAssets[i] = trackedAssets[trackedAssets.length - 1]; + trackedAssets.pop(); + break; + } + } + + isTracked[asset] = false; + delete lastUpdateTime[asset]; + + emit AssetUntracked(asset); + } + + /** + * @notice Check if any assets need updating + * @return updateNeeded True if any assets need updating + * @return assets Array of assets that need updating + */ + function checkUpkeep() public view returns (bool updateNeeded, address[] memory assets) { + address[] memory needsUpdateList = new address[](trackedAssets.length); + uint256 count = 0; + + for (uint256 i = 0; i < trackedAssets.length; i++) { + address asset = trackedAssets[i]; + if (_needsUpdate(asset)) { + needsUpdateList[count] = asset; + count++; + } + } + + if (count > 0) { + // Resize array + assets = new address[](count); + for (uint256 i = 0; i < count; i++) { + assets[i] = needsUpdateList[i]; + } + updateNeeded = true; + } else { + assets = new address[](0); + updateNeeded = false; + } + } + + /** + * @notice Perform upkeep - update price feeds that need updating + * @return success True if updates were successful + * @return updatedAssets Array of assets that were updated + */ + function performUpkeep() external onlyRole(KEEPER_ROLE) nonReentrant returns ( + bool success, + address[] memory updatedAssets + ) { + address[] memory needsUpdateList = new address[](trackedAssets.length); + uint256 count = 0; + + // Collect assets that need updating + for (uint256 i = 0; i < trackedAssets.length; i++) { + address asset = trackedAssets[i]; + if (_needsUpdate(asset) && count < maxUpdatesPerCall) { + needsUpdateList[count] = asset; + count++; + } + } + + if (count == 0) { + return (true, new address[](0)); + } + + // Resize array + updatedAssets = new address[](count); + for (uint256 i = 0; i < count; i++) { + updatedAssets[i] = needsUpdateList[i]; + } + + // Update price feeds + try oraclePriceFeed.updateMultiplePriceFeeds(updatedAssets) { + // Update last update time + uint256 currentTime = block.timestamp; + for (uint256 i = 0; i < count; i++) { + lastUpdateTime[updatedAssets[i]] = currentTime; + } + + emit PriceFeedsUpdated(updatedAssets, currentTime); + success = true; + } catch { + success = false; + } + } + + /** + * @notice Update specific assets + * @param assets Array of asset addresses to update + */ + function updateAssets(address[] calldata assets) external onlyRole(KEEPER_ROLE) nonReentrant { + require(assets.length > 0, "PriceFeedKeeper: empty array"); + require(assets.length <= maxUpdatesPerCall, "PriceFeedKeeper: too many assets"); + + // Verify all assets are tracked + for (uint256 i = 0; i < assets.length; i++) { + require(isTracked[assets[i]], "PriceFeedKeeper: asset not tracked"); + } + + oraclePriceFeed.updateMultiplePriceFeeds(assets); + + uint256 currentTime = block.timestamp; + for (uint256 i = 0; i < assets.length; i++) { + lastUpdateTime[assets[i]] = currentTime; + } + + emit PriceFeedsUpdated(assets, currentTime); + } + + /** + * @notice Check if a specific asset needs updating + * @param asset Address of the asset + * @return needsUpdate True if asset needs updating + */ + function needsUpdate(address asset) external view returns (bool) { + return _needsUpdate(asset); + } + + /** + * @notice Get all tracked assets + * @return assets Array of tracked asset addresses + */ + function getTrackedAssets() external view returns (address[] memory) { + return trackedAssets; + } + + /** + * @notice Set update interval + * @param interval New update interval in seconds + */ + function setUpdateInterval(uint256 interval) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(interval > 0, "PriceFeedKeeper: zero interval"); + uint256 oldInterval = updateInterval; + updateInterval = interval; + emit UpdateIntervalChanged(oldInterval, interval); + } + + /** + * @notice Set maximum updates per call + * @param max New maximum updates per call + */ + function setMaxUpdatesPerCall(uint256 max) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(max > 0, "PriceFeedKeeper: zero max"); + uint256 oldMax = maxUpdatesPerCall; + maxUpdatesPerCall = max; + emit MaxUpdatesPerCallChanged(oldMax, max); + } + + /** + * @notice Set oracle price feed address + * @param oraclePriceFeed_ New oracle price feed address + */ + function setOraclePriceFeed(address oraclePriceFeed_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(oraclePriceFeed_ != address(0), "PriceFeedKeeper: zero address"); + oraclePriceFeed = OraclePriceFeed(oraclePriceFeed_); + } + + /** + * @notice Internal function to check if asset needs update + * @param asset Address of the asset + * @return True if asset needs updating + */ + function _needsUpdate(address asset) internal view returns (bool) { + if (!isTracked[asset]) { + return false; + } + + uint256 lastUpdate = lastUpdateTime[asset]; + if (lastUpdate == 0) { + return true; // Never updated + } + + return block.timestamp - lastUpdate >= updateInterval; + } + + /** + * @notice Get gas estimate for upkeep + * @return gasEstimate Estimated gas needed for upkeep + */ + function getUpkeepGasEstimate() external view returns (uint256 gasEstimate) { + (bool needsUpdate_, address[] memory assets) = checkUpkeep(); + if (!needsUpdate_ || assets.length == 0) { + return 0; + } + + // Base gas + gas per asset update + gasEstimate = 50000 + (assets.length * 30000) + gasBuffer; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/reserve/ReserveSystem.sol b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/ReserveSystem.sol new file mode 100644 index 0000000..4afb2c4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/ReserveSystem.sol @@ -0,0 +1,326 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./IReserveSystem.sol"; + +/** + * @title ReserveSystem + * @notice Core implementation of the GRU Reserve System + * @dev Manages reserves in multiple asset classes (XAU, digital assets, sovereign instruments) + * Implements XAU triangulation conversion algorithm and redemption mechanisms + */ +contract ReserveSystem is IReserveSystem, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + // ============ Constants ============ + + bytes32 public constant RESERVE_MANAGER_ROLE = keccak256("RESERVE_MANAGER_ROLE"); + bytes32 public constant PRICE_FEED_ROLE = keccak256("PRICE_FEED_ROLE"); + bytes32 public constant CONVERSION_OPERATOR_ROLE = keccak256("CONVERSION_OPERATOR_ROLE"); + + // Conversion fee parameters (basis points: 10000 = 100%) + uint256 public constant BASE_FEE_BPS = 10; // 0.1% + uint256 public constant SLIPPAGE_FEE_BPS = 50; // 0.5% per 1% slippage + uint256 public constant LARGE_TRANSACTION_THRESHOLD = 1_000_000 * 1e18; // $1M + uint256 public constant LARGE_TRANSACTION_FEE_BPS = 5; // 0.05% + + // Price staleness threshold (30 seconds) + uint256 public constant PRICE_STALENESS_THRESHOLD = 30; + + // Maximum slippage (0.5% for liquid, 1.0% for less liquid) + uint256 public constant MAX_SLIPPAGE_BPS = 50; // 0.5% + + // ============ Storage ============ + + struct Reserve { + address asset; + uint256 balance; + uint256 lastUpdated; + } + + struct PriceFeed { + uint256 price; + uint256 timestamp; + bool isValid; + } + + struct Conversion { + address sourceAsset; + address targetAsset; + uint256 sourceAmount; + uint256 targetAmount; + uint256 fees; + address[] path; + uint256 timestamp; + } + + // Reserve tracking + mapping(address => uint256) public reserveBalances; + mapping(bytes32 => Reserve) public reserves; + bytes32[] public reserveIds; + + // Price feeds + mapping(address => PriceFeed) public priceFeeds; + address[] public supportedAssets; + + // Conversion tracking + mapping(bytes32 => Conversion) public conversions; + bytes32[] public conversionIds; + + // Asset metadata + mapping(address => bool) public isSupportedAsset; + mapping(address => bool) public isLiquidAsset; // For slippage calculation + + // ============ Constructor ============ + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(RESERVE_MANAGER_ROLE, admin); + _grantRole(PRICE_FEED_ROLE, admin); + _grantRole(CONVERSION_OPERATOR_ROLE, admin); + } + + // ============ Reserve Management ============ + + function depositReserve( + address asset, + uint256 amount + ) external override onlyRole(RESERVE_MANAGER_ROLE) nonReentrant returns (bytes32 reserveId) { + require(asset != address(0), "ReserveSystem: zero address"); + require(amount > 0, "ReserveSystem: zero amount"); + require(isSupportedAsset[asset], "ReserveSystem: unsupported asset"); + + IERC20(asset).safeTransferFrom(msg.sender, address(this), amount); + + reserveId = keccak256(abi.encodePacked(asset, amount, block.timestamp, reserveIds.length)); + reserves[reserveId] = Reserve({ + asset: asset, + balance: amount, + lastUpdated: block.timestamp + }); + reserveIds.push(reserveId); + reserveBalances[asset] += amount; + + emit ReserveDeposited(asset, amount, msg.sender, reserveId); + } + + function withdrawReserve( + address asset, + uint256 amount, + address recipient + ) external override onlyRole(RESERVE_MANAGER_ROLE) nonReentrant returns (bytes32 reserveId) { + require(asset != address(0), "ReserveSystem: zero address"); + require(recipient != address(0), "ReserveSystem: zero recipient"); + require(amount > 0, "ReserveSystem: zero amount"); + require(reserveBalances[asset] >= amount, "ReserveSystem: insufficient reserve"); + + reserveBalances[asset] -= amount; + + IERC20(asset).safeTransfer(recipient, amount); + + reserveId = keccak256(abi.encodePacked(asset, amount, block.timestamp, reserveIds.length)); + + emit ReserveWithdrawn(asset, amount, recipient, reserveId); + } + + function getReserveBalance(address asset) external view override returns (uint256) { + return reserveBalances[asset]; + } + + function getReserveById(bytes32 reserveId) external view override returns (address asset, uint256 balance) { + Reserve memory reserve = reserves[reserveId]; + return (reserve.asset, reserve.balance); + } + + // ============ Conversion ============ + + function convertAssets( + address sourceAsset, + address targetAsset, + uint256 amount + ) external override onlyRole(CONVERSION_OPERATOR_ROLE) nonReentrant returns ( + bytes32 conversionId, + uint256 targetAmount, + uint256 fees + ) { + require(sourceAsset != address(0), "ReserveSystem: zero source asset"); + require(targetAsset != address(0), "ReserveSystem: zero target asset"); + require(amount > 0, "ReserveSystem: zero amount"); + require(isSupportedAsset[sourceAsset], "ReserveSystem: unsupported source asset"); + require(isSupportedAsset[targetAsset], "ReserveSystem: unsupported target asset"); + + // Calculate conversion + (uint256 calculatedAmount, uint256 calculatedFees, address[] memory path) = + calculateConversion(sourceAsset, targetAsset, amount); + + require(reserveBalances[targetAsset] >= calculatedAmount, "ReserveSystem: insufficient target reserve"); + + // Transfer source asset + IERC20(sourceAsset).safeTransferFrom(msg.sender, address(this), amount); + reserveBalances[sourceAsset] += amount; + + // Transfer target asset + reserveBalances[targetAsset] -= calculatedAmount; + IERC20(targetAsset).safeTransfer(msg.sender, calculatedAmount); + + conversionId = keccak256(abi.encodePacked(sourceAsset, targetAsset, amount, block.timestamp, conversionIds.length)); + conversions[conversionId] = Conversion({ + sourceAsset: sourceAsset, + targetAsset: targetAsset, + sourceAmount: amount, + targetAmount: calculatedAmount, + fees: calculatedFees, + path: path, + timestamp: block.timestamp + }); + conversionIds.push(conversionId); + + emit ConversionExecuted(sourceAsset, targetAsset, amount, calculatedAmount, conversionId, calculatedFees); + + return (conversionId, calculatedAmount, calculatedFees); + } + + function calculateConversion( + address sourceAsset, + address targetAsset, + uint256 amount + ) public view override returns ( + uint256 targetAmount, + uint256 fees, + address[] memory path + ) { + require(sourceAsset != address(0), "ReserveSystem: zero source asset"); + require(targetAsset != address(0), "ReserveSystem: zero target asset"); + require(amount > 0, "ReserveSystem: zero amount"); + + // Get prices + (uint256 sourcePrice, uint256 sourceTimestamp) = getPrice(sourceAsset); + (uint256 targetPrice, uint256 targetTimestamp) = getPrice(targetAsset); + + require(sourceTimestamp > 0 && targetTimestamp > 0, "ReserveSystem: price feed not available"); + require(block.timestamp - sourceTimestamp <= PRICE_STALENESS_THRESHOLD, "ReserveSystem: stale source price"); + require(block.timestamp - targetTimestamp <= PRICE_STALENESS_THRESHOLD, "ReserveSystem: stale target price"); + + // Direct conversion + targetAmount = (amount * targetPrice) / sourcePrice; + + // Calculate fees + fees = calculateFees(targetAmount, 0); // No slippage for direct conversion + + // Simple path (direct conversion) + path = new address[](2); + path[0] = sourceAsset; + path[1] = targetAsset; + + return (targetAmount, fees, path); + } + + function calculateFees(uint256 amount, uint256 slippageBps) internal pure returns (uint256) { + uint256 baseFee = (amount * BASE_FEE_BPS) / 10000; + uint256 slippageFee = 0; + + if (slippageBps > 10) { // 0.1% threshold + slippageFee = (amount * slippageBps * SLIPPAGE_FEE_BPS) / 1000000; + } + + uint256 largeTransactionFee = 0; + if (amount >= LARGE_TRANSACTION_THRESHOLD) { + largeTransactionFee = (amount * LARGE_TRANSACTION_FEE_BPS) / 10000; + } + + return baseFee + slippageFee + largeTransactionFee; + } + + // ============ Redemption ============ + + function redeem( + address asset, + uint256 amount, + address recipient + ) external override onlyRole(RESERVE_MANAGER_ROLE) nonReentrant returns (bytes32 redemptionId) { + require(asset != address(0), "ReserveSystem: zero address"); + require(recipient != address(0), "ReserveSystem: zero recipient"); + require(amount > 0, "ReserveSystem: zero amount"); + require(reserveBalances[asset] >= amount, "ReserveSystem: insufficient reserve"); + + reserveBalances[asset] -= amount; + IERC20(asset).safeTransfer(recipient, amount); + + redemptionId = keccak256(abi.encodePacked(asset, amount, block.timestamp, conversionIds.length)); + + emit RedemptionExecuted(asset, amount, recipient, redemptionId); + } + + // ============ Price Feeds ============ + + function updatePriceFeed( + address asset, + uint256 price, + uint256 timestamp + ) external override onlyRole(PRICE_FEED_ROLE) { + require(asset != address(0), "ReserveSystem: zero address"); + require(price > 0, "ReserveSystem: zero price"); + require(timestamp <= block.timestamp, "ReserveSystem: future timestamp"); + + if (!isSupportedAsset[asset]) { + isSupportedAsset[asset] = true; + supportedAssets.push(asset); + } + + priceFeeds[asset] = PriceFeed({ + price: price, + timestamp: timestamp, + isValid: true + }); + + emit PriceFeedUpdated(asset, price, timestamp); + } + + function getPrice(address asset) public view override returns (uint256 price, uint256 timestamp) { + PriceFeed memory feed = priceFeeds[asset]; + require(feed.isValid, "ReserveSystem: price feed not available"); + return (feed.price, feed.timestamp); + } + + function getConversionPrice( + address sourceAsset, + address targetAsset + ) external view override returns (uint256) { + (uint256 sourcePrice,) = getPrice(sourceAsset); + (uint256 targetPrice,) = getPrice(targetAsset); + return (targetPrice * 1e18) / sourcePrice; // Price in 18 decimals + } + + // ============ Admin Functions ============ + + function addSupportedAsset(address asset, bool isLiquid) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(asset != address(0), "ReserveSystem: zero address"); + isSupportedAsset[asset] = true; + isLiquidAsset[asset] = isLiquid; + if (!_isInArray(asset, supportedAssets)) { + supportedAssets.push(asset); + } + } + + function removeSupportedAsset(address asset) external onlyRole(DEFAULT_ADMIN_ROLE) { + isSupportedAsset[asset] = false; + } + + function _isInArray(address item, address[] memory array) internal pure returns (bool) { + for (uint256 i = 0; i < array.length; i++) { + if (array[i] == item) { + return true; + } + } + return false; + } + + function getSupportedAssets() external view returns (address[] memory) { + return supportedAssets; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/reserve/ReserveTokenIntegration.sol b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/ReserveTokenIntegration.sol new file mode 100644 index 0000000..07a85a1 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/ReserveTokenIntegration.sol @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../emoney/interfaces/IeMoneyToken.sol"; +import "../emoney/interfaces/ITokenFactory138.sol"; +import "./IReserveSystem.sol"; + +/** + * @title ReserveTokenIntegration + * @notice Integrates Reserve System with eMoney Token Factory + * @dev Enables eMoney tokens to be backed by reserves and converted via the reserve system + */ +contract ReserveTokenIntegration is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant INTEGRATION_OPERATOR_ROLE = keccak256("INTEGRATION_OPERATOR_ROLE"); + + IReserveSystem public reserveSystem; + ITokenFactory138 public tokenFactory; + + // Token to reserve asset mapping + mapping(address => address) public tokenReserveAsset; + // Reserve asset to token mapping + mapping(address => address) public reserveAssetToken; + + // Reserve backing ratio (basis points: 10000 = 100%) + mapping(address => uint256) public reserveBackingRatio; + + event TokenBackedByReserve( + address indexed token, + address indexed reserveAsset, + uint256 backingRatio + ); + + event ReserveBackingUpdated( + address indexed token, + address indexed reserveAsset, + uint256 newBackingRatio + ); + + event TokenConvertedViaReserve( + address indexed sourceToken, + address indexed targetToken, + uint256 sourceAmount, + uint256 targetAmount, + bytes32 conversionId + ); + + constructor( + address admin, + address reserveSystem_, + address tokenFactory_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(INTEGRATION_OPERATOR_ROLE, admin); + + reserveSystem = IReserveSystem(reserveSystem_); + tokenFactory = ITokenFactory138(tokenFactory_); + } + + /** + * @notice Set reserve asset backing for an eMoney token + * @param token Address of the eMoney token + * @param reserveAsset Address of the reserve asset + * @param backingRatio Backing ratio in basis points (10000 = 100%) + */ + function setTokenBacking( + address token, + address reserveAsset, + uint256 backingRatio + ) external onlyRole(INTEGRATION_OPERATOR_ROLE) { + require(token != address(0), "ReserveTokenIntegration: zero token"); + require(reserveAsset != address(0), "ReserveTokenIntegration: zero reserve asset"); + require(backingRatio <= 10000, "ReserveTokenIntegration: invalid backing ratio"); + + tokenReserveAsset[token] = reserveAsset; + reserveAssetToken[reserveAsset] = token; + reserveBackingRatio[token] = backingRatio; + + emit TokenBackedByReserve(token, reserveAsset, backingRatio); + } + + /** + * @notice Update reserve backing ratio for a token + * @param token Address of the eMoney token + * @param newBackingRatio New backing ratio in basis points + */ + function updateBackingRatio( + address token, + uint256 newBackingRatio + ) external onlyRole(INTEGRATION_OPERATOR_ROLE) { + require(token != address(0), "ReserveTokenIntegration: zero token"); + require(newBackingRatio <= 10000, "ReserveTokenIntegration: invalid backing ratio"); + require(tokenReserveAsset[token] != address(0), "ReserveTokenIntegration: token not backed"); + + address reserveAsset = tokenReserveAsset[token]; + reserveBackingRatio[token] = newBackingRatio; + + emit ReserveBackingUpdated(token, reserveAsset, newBackingRatio); + } + + /** + * @notice Convert eMoney tokens via reserve system + * @param sourceToken Address of the source eMoney token + * @param targetToken Address of the target eMoney token + * @param amount Amount of source tokens to convert + * @return targetAmount Amount of target tokens received + * @return conversionId Conversion ID from reserve system + */ + function convertTokensViaReserve( + address sourceToken, + address targetToken, + uint256 amount + ) external nonReentrant returns (uint256 targetAmount, bytes32 conversionId) { + require(sourceToken != address(0), "ReserveTokenIntegration: zero source token"); + require(targetToken != address(0), "ReserveTokenIntegration: zero target token"); + require(amount > 0, "ReserveTokenIntegration: zero amount"); + + address sourceReserveAsset = tokenReserveAsset[sourceToken]; + address targetReserveAsset = tokenReserveAsset[targetToken]; + + require(sourceReserveAsset != address(0), "ReserveTokenIntegration: source not backed"); + require(targetReserveAsset != address(0), "ReserveTokenIntegration: target not backed"); + + // Burn source tokens + IeMoneyToken(sourceToken).burn(msg.sender, amount, "0x00"); + + // Calculate reserve asset amount based on backing ratio + uint256 sourceReserveAmount = (amount * reserveBackingRatio[sourceToken]) / 10000; + + // Convert via reserve system + uint256 targetReserveAmount; + uint256 fees; + (conversionId, targetReserveAmount, fees) = reserveSystem.convertAssets( + sourceReserveAsset, + targetReserveAsset, + sourceReserveAmount + ); + + // Calculate target token amount based on backing ratio + targetAmount = (targetReserveAmount * 10000) / reserveBackingRatio[targetToken]; + + // Mint target tokens + IeMoneyToken(targetToken).mint(msg.sender, targetAmount, bytes32(0)); + + emit TokenConvertedViaReserve(sourceToken, targetToken, amount, targetAmount, conversionId); + + return (targetAmount, conversionId); + } + + /** + * @notice Get reserve backing information for a token + * @param token Address of the eMoney token + * @return reserveAsset Address of the reserve asset + * @return backingRatio Backing ratio in basis points + * @return reserveBalance Current reserve balance + */ + function getTokenBacking(address token) external view returns ( + address reserveAsset, + uint256 backingRatio, + uint256 reserveBalance + ) { + reserveAsset = tokenReserveAsset[token]; + backingRatio = reserveBackingRatio[token]; + if (reserveAsset != address(0)) { + reserveBalance = reserveSystem.getReserveBalance(reserveAsset); + } + } + + /** + * @notice Check if token has adequate reserve backing + * @param token Address of the eMoney token + * @return isAdequate True if reserves are adequate + * @return requiredReserve Required reserve amount + * @return currentReserve Current reserve amount + */ + function checkReserveAdequacy(address token) external view returns ( + bool isAdequate, + uint256 requiredReserve, + uint256 currentReserve + ) { + address reserveAsset = tokenReserveAsset[token]; + require(reserveAsset != address(0), "ReserveTokenIntegration: token not backed"); + + uint256 totalSupply = IERC20(token).totalSupply(); + uint256 backingRatio = reserveBackingRatio[token]; + + requiredReserve = (totalSupply * backingRatio) / 10000; + currentReserve = reserveSystem.getReserveBalance(reserveAsset); + + isAdequate = currentReserve >= requiredReserve; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/reserve/StablecoinReserveVault.sol b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/StablecoinReserveVault.sol new file mode 100644 index 0000000..5cc3f1e --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/reserve/StablecoinReserveVault.sol @@ -0,0 +1,253 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../tokens/CompliantUSDT.sol"; +import "../tokens/CompliantUSDC.sol"; + +/** + * @title StablecoinReserveVault + * @notice 1:1 backing mechanism for CompliantUSDT and CompliantUSDC with official tokens + * @dev Locks official USDT/USDC, mints cUSDT/cUSDC 1:1. Can be deployed on Ethereum Mainnet + * or connected via cross-chain bridge to Chain 138 for minting. + * + * IMPORTANT: This contract should be deployed on Ethereum Mainnet where official USDT/USDC exist. + * For Chain 138 deployment, tokens would be bridged/locked via cross-chain infrastructure. + */ +contract StablecoinReserveVault is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant RESERVE_OPERATOR_ROLE = keccak256("RESERVE_OPERATOR_ROLE"); + bytes32 public constant REDEMPTION_OPERATOR_ROLE = keccak256("REDEMPTION_OPERATOR_ROLE"); + + // Official token addresses on Ethereum Mainnet + // These can be overridden in constructor for different networks + address public immutable officialUSDT; + address public immutable officialUSDC; + + // Compliant token contracts (on Chain 138 or same network) + CompliantUSDT public immutable compliantUSDT; + CompliantUSDC public immutable compliantUSDC; + + // Reserve tracking + uint256 public usdtReserveBalance; + uint256 public usdcReserveBalance; + + // Total minted (for verification) + uint256 public totalCUSDTMinted; + uint256 public totalCUSDCMinted; + + // Pause mechanism + bool public paused; + + event ReserveDeposited(address indexed token, uint256 amount, address indexed depositor); + event ReserveWithdrawn(address indexed token, uint256 amount, address indexed recipient); + event CompliantTokensMinted(address indexed token, uint256 amount, address indexed recipient); + event CompliantTokensBurned(address indexed token, uint256 amount, address indexed redeemer); + event Paused(address indexed account); + event Unpaused(address indexed account); + + modifier whenNotPaused() { + require(!paused, "StablecoinReserveVault: paused"); + _; + } + + /** + * @notice Constructor + * @param admin Admin address (will receive DEFAULT_ADMIN_ROLE) + * @param officialUSDT_ Official USDT token address (on Ethereum Mainnet: 0xdAC17F958D2ee523a2206206994597C13D831ec7) + * @param officialUSDC_ Official USDC token address (on Ethereum Mainnet: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48) + * @param compliantUSDT_ CompliantUSDT contract address + * @param compliantUSDC_ CompliantUSDC contract address + */ + constructor( + address admin, + address officialUSDT_, + address officialUSDC_, + address compliantUSDT_, + address compliantUSDC_ + ) { + require(admin != address(0), "StablecoinReserveVault: zero admin"); + require(officialUSDT_ != address(0), "StablecoinReserveVault: zero USDT"); + require(officialUSDC_ != address(0), "StablecoinReserveVault: zero USDC"); + require(compliantUSDT_ != address(0), "StablecoinReserveVault: zero cUSDT"); + require(compliantUSDC_ != address(0), "StablecoinReserveVault: zero cUSDC"); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(RESERVE_OPERATOR_ROLE, admin); + _grantRole(REDEMPTION_OPERATOR_ROLE, admin); + + officialUSDT = officialUSDT_; + officialUSDC = officialUSDC_; + compliantUSDT = CompliantUSDT(compliantUSDT_); + compliantUSDC = CompliantUSDC(compliantUSDC_); + } + + /** + * @notice Deposit official USDT and mint cUSDT 1:1 + * @dev Transfers USDT from caller, mints cUSDT to caller + * @param amount Amount of USDT to deposit (6 decimals) + */ + function depositUSDT(uint256 amount) external whenNotPaused nonReentrant { + require(amount > 0, "StablecoinReserveVault: zero amount"); + + // Transfer official USDT from caller + IERC20(officialUSDT).safeTransferFrom(msg.sender, address(this), amount); + + // Update reserve + usdtReserveBalance += amount; + totalCUSDTMinted += amount; + + // Mint cUSDT to caller + compliantUSDT.mint(msg.sender, amount); + + emit ReserveDeposited(officialUSDT, amount, msg.sender); + emit CompliantTokensMinted(address(compliantUSDT), amount, msg.sender); + } + + /** + * @notice Deposit official USDC and mint cUSDC 1:1 + * @dev Transfers USDC from caller, mints cUSDC to caller + * @param amount Amount of USDC to deposit (6 decimals) + */ + function depositUSDC(uint256 amount) external whenNotPaused nonReentrant { + require(amount > 0, "StablecoinReserveVault: zero amount"); + + // Transfer official USDC from caller + IERC20(officialUSDC).safeTransferFrom(msg.sender, address(this), amount); + + // Update reserve + usdcReserveBalance += amount; + totalCUSDCMinted += amount; + + // Mint cUSDC to caller + compliantUSDC.mint(msg.sender, amount); + + emit ReserveDeposited(officialUSDC, amount, msg.sender); + emit CompliantTokensMinted(address(compliantUSDC), amount, msg.sender); + } + + /** + * @notice Redeem cUSDT for official USDT 1:1 + * @dev Burns cUSDT from caller, transfers USDT to caller + * @param amount Amount of cUSDT to redeem (6 decimals) + */ + function redeemUSDT(uint256 amount) external whenNotPaused nonReentrant { + require(amount > 0, "StablecoinReserveVault: zero amount"); + require(usdtReserveBalance >= amount, "StablecoinReserveVault: insufficient reserve"); + + // Burn cUSDT from caller + compliantUSDT.burn(amount); + + // Update reserve + usdtReserveBalance -= amount; + totalCUSDTMinted -= amount; + + // Transfer official USDT to caller + IERC20(officialUSDT).safeTransfer(msg.sender, amount); + + emit CompliantTokensBurned(address(compliantUSDT), amount, msg.sender); + emit ReserveWithdrawn(officialUSDT, amount, msg.sender); + } + + /** + * @notice Redeem cUSDC for official USDC 1:1 + * @dev Burns cUSDC from caller, transfers USDC to caller + * @param amount Amount of cUSDC to redeem (6 decimals) + */ + function redeemUSDC(uint256 amount) external whenNotPaused nonReentrant { + require(amount > 0, "StablecoinReserveVault: zero amount"); + require(usdcReserveBalance >= amount, "StablecoinReserveVault: insufficient reserve"); + + // Burn cUSDC from caller + compliantUSDC.burn(amount); + + // Update reserve + usdcReserveBalance -= amount; + totalCUSDCMinted -= amount; + + // Transfer official USDC to caller + IERC20(officialUSDC).safeTransfer(msg.sender, amount); + + emit CompliantTokensBurned(address(compliantUSDC), amount, msg.sender); + emit ReserveWithdrawn(officialUSDC, amount, msg.sender); + } + + /** + * @notice Get reserve backing ratio + * @param token Address of compliant token (cUSDT or cUSDC) + * @return reserveBalance Current reserve balance + * @return tokenSupply Current token supply + * @return backingRatio Backing ratio (10000 = 100%) + */ + function getBackingRatio(address token) external view returns ( + uint256 reserveBalance, + uint256 tokenSupply, + uint256 backingRatio + ) { + if (token == address(compliantUSDT)) { + reserveBalance = usdtReserveBalance; + tokenSupply = compliantUSDT.totalSupply(); + } else if (token == address(compliantUSDC)) { + reserveBalance = usdcReserveBalance; + tokenSupply = compliantUSDC.totalSupply(); + } else { + revert("StablecoinReserveVault: unsupported token"); + } + + backingRatio = tokenSupply > 0 + ? (reserveBalance * 10000) / tokenSupply + : 0; + } + + /** + * @notice Check if reserves are adequate + * @return usdtAdequate True if USDT reserves are adequate + * @return usdcAdequate True if USDC reserves are adequate + */ + function checkReserveAdequacy() external view returns (bool usdtAdequate, bool usdcAdequate) { + uint256 cUSDTSupply = compliantUSDT.totalSupply(); + uint256 cUSDCSupply = compliantUSDC.totalSupply(); + + usdtAdequate = usdtReserveBalance >= cUSDTSupply; + usdcAdequate = usdcReserveBalance >= cUSDCSupply; + } + + /** + * @notice Pause all operations + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + paused = true; + emit Paused(msg.sender); + } + + /** + * @notice Unpause all operations + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + paused = false; + emit Unpaused(msg.sender); + } + + /** + * @notice Emergency withdrawal (admin only, after pause) + * @dev Can be used to recover funds in emergency situations + */ + function emergencyWithdraw(address token, uint256 amount, address recipient) + external + onlyRole(DEFAULT_ADMIN_ROLE) + whenPaused + { + require(recipient != address(0), "StablecoinReserveVault: zero recipient"); + IERC20(token).safeTransfer(recipient, amount); + } + + modifier whenPaused() { + require(paused, "StablecoinReserveVault: not paused"); + _; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/smart-accounts/AccountWalletRegistryExtended.sol b/verification-sources/chain138-buildinfo-7678218/contracts/smart-accounts/AccountWalletRegistryExtended.sol new file mode 100644 index 0000000..d989096 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/smart-accounts/AccountWalletRegistryExtended.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "../emoney/interfaces/IAccountWalletRegistry.sol"; + +/** + * @title AccountWalletRegistryExtended + * @notice Extends account-wallet registry with Smart Account (contract) support + * @dev Links accountRefId to contract addresses (smart accounts); walletRefId = keccak256(abi.encodePacked(smartAccount)) + */ +contract AccountWalletRegistryExtended is IAccountWalletRegistry, AccessControl { + bytes32 public constant ACCOUNT_MANAGER_ROLE = keccak256("ACCOUNT_MANAGER_ROLE"); + + address public smartAccountFactory; + address public entryPoint; + + mapping(bytes32 => WalletLink[]) private _accountToWallets; + mapping(bytes32 => bytes32[]) private _walletToAccounts; + mapping(bytes32 => mapping(bytes32 => uint256)) private _walletIndex; + mapping(bytes32 => mapping(bytes32 => bool)) private _walletAccountExists; + mapping(bytes32 => address) private _smartAccountAddress; // walletRefId => smart account address + + event SmartAccountLinked(bytes32 indexed accountRefId, address indexed smartAccount, bytes32 provider); + + constructor(address admin, address smartAccountFactory_, address entryPoint_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ACCOUNT_MANAGER_ROLE, admin); + smartAccountFactory = smartAccountFactory_; + entryPoint = entryPoint_; + } + + function setSmartAccountFactory(address factory) external onlyRole(DEFAULT_ADMIN_ROLE) { + smartAccountFactory = factory; + } + + function setEntryPoint(address entryPoint_) external onlyRole(DEFAULT_ADMIN_ROLE) { + entryPoint = entryPoint_; + } + + function linkAccountToWallet(bytes32 accountRefId, bytes32 walletRefId, bytes32 provider) + external + override + onlyRole(ACCOUNT_MANAGER_ROLE) + { + require(accountRefId != bytes32(0), "zero accountRefId"); + require(walletRefId != bytes32(0), "zero walletRefId"); + require(provider != bytes32(0), "zero provider"); + + if (_walletAccountExists[walletRefId][accountRefId]) { + uint256 index = _walletIndex[accountRefId][walletRefId]; + require(index < _accountToWallets[accountRefId].length, "index out of bounds"); + WalletLink storage link = _accountToWallets[accountRefId][index]; + require(link.walletRefId == walletRefId, "link mismatch"); + link.active = true; + link.linkedAt = uint64(block.timestamp); + } else { + WalletLink memory newLink = WalletLink({ + walletRefId: walletRefId, + linkedAt: uint64(block.timestamp), + active: true, + provider: provider + }); + _accountToWallets[accountRefId].push(newLink); + _walletIndex[accountRefId][walletRefId] = _accountToWallets[accountRefId].length - 1; + _walletAccountExists[walletRefId][accountRefId] = true; + _walletToAccounts[walletRefId].push(accountRefId); + } + emit AccountWalletLinked(accountRefId, walletRefId, provider, uint64(block.timestamp)); + } + + function linkSmartAccount(bytes32 accountRefId, address smartAccount, bytes32 provider) + external + onlyRole(ACCOUNT_MANAGER_ROLE) + { + require(smartAccount != address(0), "AccountWalletRegistryExtended: zero smartAccount"); + require(_isContract(smartAccount), "AccountWalletRegistryExtended: not a contract"); + + bytes32 walletRefId = keccak256(abi.encodePacked(smartAccount)); + this.linkAccountToWallet(accountRefId, walletRefId, provider); + _smartAccountAddress[walletRefId] = smartAccount; + emit SmartAccountLinked(accountRefId, smartAccount, provider); + } + + function unlinkAccountFromWallet(bytes32 accountRefId, bytes32 walletRefId) external override onlyRole(ACCOUNT_MANAGER_ROLE) { + require(_walletAccountExists[walletRefId][accountRefId], "not linked"); + uint256 index = _walletIndex[accountRefId][walletRefId]; + require(index < _accountToWallets[accountRefId].length, "index out of bounds"); + _accountToWallets[accountRefId][index].active = false; + _walletAccountExists[walletRefId][accountRefId] = false; + emit AccountWalletUnlinked(accountRefId, walletRefId); + } + + function getWallets(bytes32 accountRefId) external view override returns (WalletLink[] memory) { + return _accountToWallets[accountRefId]; + } + + function getAccounts(bytes32 walletRefId) external view override returns (bytes32[] memory) { + return _walletToAccounts[walletRefId]; + } + + function isLinked(bytes32 accountRefId, bytes32 walletRefId) external view override returns (bool) { + return _walletAccountExists[walletRefId][accountRefId]; + } + + function isActive(bytes32 accountRefId, bytes32 walletRefId) external view override returns (bool) { + if (!_walletAccountExists[walletRefId][accountRefId]) return false; + uint256 index = _walletIndex[accountRefId][walletRefId]; + return index < _accountToWallets[accountRefId].length && _accountToWallets[accountRefId][index].active; + } + + function isSmartAccount(bytes32 walletRefId) public view returns (bool) { + return _smartAccountAddress[walletRefId] != address(0); + } + + function isSmartAccountAddress(address addr) public view returns (bool) { + return _smartAccountAddress[keccak256(abi.encodePacked(addr))] == addr; + } + + function _isContract(address account) internal view returns (bool) { + return account.code.length > 0; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/sync/TokenlistGovernanceSync.sol b/verification-sources/chain138-buildinfo-7678218/contracts/sync/TokenlistGovernanceSync.sol new file mode 100644 index 0000000..fe64611 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/sync/TokenlistGovernanceSync.sol @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../registry/UniversalAssetRegistry.sol"; + +/** + * @title TokenlistGovernanceSync + * @notice Automatically syncs tokenlist.json changes to on-chain governance + * @dev Monitors tokenlist versions and creates proposals for changes + */ +contract TokenlistGovernanceSync is + Initializable, + AccessControlUpgradeable, + UUPSUpgradeable +{ + bytes32 public constant TOKENLIST_MANAGER_ROLE = keccak256("TOKENLIST_MANAGER_ROLE"); + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + + struct TokenlistVersion { + uint256 major; + uint256 minor; + uint256 patch; + string ipfsHash; + uint256 timestamp; + bool synced; + } + + struct AssetMetadata { + address tokenAddress; + UniversalAssetRegistry.AssetType assetType; + UniversalAssetRegistry.ComplianceLevel complianceLevel; + string name; + string symbol; + uint8 decimals; + string jurisdiction; + uint8 volatilityScore; + uint256 minBridgeAmount; + uint256 maxBridgeAmount; + } + + struct TokenChange { + address tokenAddress; + ChangeType changeType; + AssetMetadata metadata; + } + + enum ChangeType { + Added, + Removed, + Modified + } + + // Storage + UniversalAssetRegistry public assetRegistry; + mapping(bytes32 => TokenlistVersion) public versions; + bytes32 public currentVersion; + bytes32[] public versionHistory; + + // Events + event TokenlistUpdated( + bytes32 indexed versionHash, + uint256 major, + uint256 minor, + uint256 patch, + string ipfsHash + ); + + event AutoProposalCreated( + bytes32 indexed proposalId, + address indexed token, + ChangeType changeType + ); + + event VersionSynced(bytes32 indexed versionHash); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + address _assetRegistry, + address admin + ) external initializer { + __AccessControl_init(); + __UUPSUpgradeable_init(); + + require(_assetRegistry != address(0), "Zero registry"); + + assetRegistry = UniversalAssetRegistry(_assetRegistry); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(TOKENLIST_MANAGER_ROLE, admin); + _grantRole(UPGRADER_ROLE, admin); + } + + function _authorizeUpgrade(address newImplementation) + internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @notice Submit new tokenlist version and auto-create proposals + */ + function submitTokenlistVersion( + uint256 major, + uint256 minor, + uint256 patch, + string calldata ipfsHash, + address[] calldata newTokens, + AssetMetadata[] calldata metadata + ) external onlyRole(TOKENLIST_MANAGER_ROLE) returns (bytes32[] memory proposalIds) { + require(newTokens.length == metadata.length, "Length mismatch"); + + bytes32 versionHash = keccak256(abi.encode(major, minor, patch)); + + // Store version + TokenlistVersion storage version = versions[versionHash]; + version.major = major; + version.minor = minor; + version.patch = patch; + version.ipfsHash = ipfsHash; + version.timestamp = block.timestamp; + version.synced = false; + + versionHistory.push(versionHash); + currentVersion = versionHash; + + emit TokenlistUpdated(versionHash, major, minor, patch, ipfsHash); + + // Auto-create proposals for new tokens + proposalIds = new bytes32[](newTokens.length); + + for (uint256 i = 0; i < newTokens.length; i++) { + proposalIds[i] = _createAssetProposal(newTokens[i], metadata[i]); + + emit AutoProposalCreated( + proposalIds[i], + newTokens[i], + ChangeType.Added + ); + } + + return proposalIds; + } + + /** + * @notice Create asset proposal in registry + */ + function _createAssetProposal( + address token, + AssetMetadata memory metadata + ) internal returns (bytes32) { + return assetRegistry.proposeAsset( + token, + metadata.assetType, + metadata.complianceLevel, + metadata.name, + metadata.symbol, + metadata.decimals, + metadata.jurisdiction, + metadata.volatilityScore, + metadata.minBridgeAmount, + metadata.maxBridgeAmount + ); + } + + /** + * @notice Detect changes between versions + */ + function detectChanges( + bytes32 oldVersionHash, + bytes32 newVersionHash, + address[] calldata oldTokens, + address[] calldata newTokens + ) external pure returns (TokenChange[] memory changes) { + // Simple diff: tokens in new but not old = added + // tokens in old but not new = removed + + uint256 maxChanges = oldTokens.length + newTokens.length; + TokenChange[] memory tempChanges = new TokenChange[](maxChanges); + uint256 changeCount = 0; + + // Find added tokens + for (uint256 i = 0; i < newTokens.length; i++) { + bool found = false; + for (uint256 j = 0; j < oldTokens.length; j++) { + if (newTokens[i] == oldTokens[j]) { + found = true; + break; + } + } + if (!found) { + tempChanges[changeCount].tokenAddress = newTokens[i]; + tempChanges[changeCount].changeType = ChangeType.Added; + changeCount++; + } + } + + // Find removed tokens + for (uint256 i = 0; i < oldTokens.length; i++) { + bool found = false; + for (uint256 j = 0; j < newTokens.length; j++) { + if (oldTokens[i] == newTokens[j]) { + found = true; + break; + } + } + if (!found) { + tempChanges[changeCount].tokenAddress = oldTokens[i]; + tempChanges[changeCount].changeType = ChangeType.Removed; + changeCount++; + } + } + + // Resize array to actual size + changes = new TokenChange[](changeCount); + for (uint256 i = 0; i < changeCount; i++) { + changes[i] = tempChanges[i]; + } + + return changes; + } + + /** + * @notice Mark version as synced + */ + function markVersionSynced(bytes32 versionHash) external onlyRole(TOKENLIST_MANAGER_ROLE) { + require(versions[versionHash].timestamp > 0, "Version not found"); + + versions[versionHash].synced = true; + + emit VersionSynced(versionHash); + } + + /** + * @notice Batch create proposals for multiple tokens + */ + function batchCreateProposals( + address[] calldata tokens, + AssetMetadata[] calldata metadata + ) external onlyRole(TOKENLIST_MANAGER_ROLE) returns (bytes32[] memory proposalIds) { + require(tokens.length == metadata.length, "Length mismatch"); + + proposalIds = new bytes32[](tokens.length); + + for (uint256 i = 0; i < tokens.length; i++) { + proposalIds[i] = _createAssetProposal(tokens[i], metadata[i]); + + emit AutoProposalCreated( + proposalIds[i], + tokens[i], + ChangeType.Added + ); + } + + return proposalIds; + } + + // View functions + + function getVersion(bytes32 versionHash) external view returns (TokenlistVersion memory) { + return versions[versionHash]; + } + + function getCurrentVersion() external view returns (TokenlistVersion memory) { + return versions[currentVersion]; + } + + function getVersionHistory() external view returns (bytes32[] memory) { + return versionHistory; + } + + function isVersionSynced(bytes32 versionHash) external view returns (bool) { + return versions[versionHash].synced; + } + + function getVersionCount() external view returns (uint256) { + return versionHistory.length; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/tether/MainnetTether.sol b/verification-sources/chain138-buildinfo-7678218/contracts/tether/MainnetTether.sol new file mode 100644 index 0000000..42caa9e --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/tether/MainnetTether.sol @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title MainnetTether + * @notice Anchors Chain-138 state proofs to Ethereum Mainnet (Kaleido-style) + * @dev Stores signed state proofs from Chain-138 validators, creating an immutable + * and verifiable record of Chain-138's state on Mainnet + */ +contract MainnetTether { + address public admin; + bool public paused; + + // Chain-138 chain ID + uint64 public constant CHAIN_138 = 138; + + // State proof structure + struct StateProof { + uint256 blockNumber; // Chain-138 block number + bytes32 blockHash; // Chain-138 block hash + bytes32 stateRoot; // Chain-138 state root + bytes32 previousBlockHash; // Previous block hash + uint256 timestamp; // Block timestamp + bytes signatures; // Collective signatures from validators + uint256 validatorCount; // Number of validators that signed + bytes32 proofHash; // Hash of the proof (for indexing) + } + + // Mapping: blockNumber => StateProof + mapping(uint256 => StateProof) public stateProofs; + + // Array of all anchored block numbers (for iteration) + uint256[] public anchoredBlocks; + + // Mapping: proofHash => bool (replay protection) + mapping(bytes32 => bool) public processed; + + // Events + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + event StateProofAnchored( + uint256 indexed blockNumber, + bytes32 indexed blockHash, + bytes32 indexed stateRoot, + uint256 timestamp, + uint256 validatorCount + ); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin) { + require(_admin != address(0), "zero admin"); + admin = _admin; + } + + /** + * @notice Anchor a state proof from Chain-138 + * @param blockNumber Chain-138 block number + * @param blockHash Chain-138 block hash + * @param stateRoot Chain-138 state root + * @param previousBlockHash Previous block hash + * @param timestamp Block timestamp + * @param signatures Collective signatures from validators + * @param validatorCount Number of validators that signed + */ + function anchorStateProof( + uint256 blockNumber, + bytes32 blockHash, + bytes32 stateRoot, + bytes32 previousBlockHash, + uint256 timestamp, + bytes calldata signatures, + uint256 validatorCount + ) external onlyAdmin whenNotPaused { + require(blockNumber > 0, "invalid block"); + require(blockHash != bytes32(0), "invalid hash"); + require(stateRoot != bytes32(0), "invalid state root"); + require(validatorCount > 0, "no validators"); + require(signatures.length > 0, "no signatures"); + + // Calculate proof hash for replay protection + bytes32 proofHash = keccak256( + abi.encodePacked( + blockNumber, + blockHash, + stateRoot, + previousBlockHash, + timestamp, + signatures + ) + ); + + require(!processed[proofHash], "already processed"); + require(stateProofs[blockNumber].blockNumber == 0, "block already anchored"); + + // Store state proof + stateProofs[blockNumber] = StateProof({ + blockNumber: blockNumber, + blockHash: blockHash, + stateRoot: stateRoot, + previousBlockHash: previousBlockHash, + timestamp: timestamp, + signatures: signatures, + validatorCount: validatorCount, + proofHash: proofHash + }); + + anchoredBlocks.push(blockNumber); + processed[proofHash] = true; + + emit StateProofAnchored( + blockNumber, + blockHash, + stateRoot, + timestamp, + validatorCount + ); + } + + /** + * @notice Get state proof for a specific block + * @param blockNumber Chain-138 block number + * @return proof State proof structure + */ + function getStateProof(uint256 blockNumber) external view returns (StateProof memory proof) { + require(stateProofs[blockNumber].blockNumber != 0, "not anchored"); + return stateProofs[blockNumber]; + } + + /** + * @notice Check if a block is anchored + * @param blockNumber Chain-138 block number + * @return true if anchored + */ + function isAnchored(uint256 blockNumber) external view returns (bool) { + return stateProofs[blockNumber].blockNumber != 0; + } + + /** + * @notice Get total number of anchored blocks + * @return count Number of anchored blocks + */ + function getAnchoredBlockCount() external view returns (uint256) { + return anchoredBlocks.length; + } + + /** + * @notice Get anchored block number at index + * @param index Index in anchoredBlocks array + * @return blockNumber Block number + */ + function getAnchoredBlock(uint256 index) external view returns (uint256) { + require(index < anchoredBlocks.length, "out of bounds"); + return anchoredBlocks[index]; + } + + /** + * @notice Admin functions + */ + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/tokenization/TokenRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/tokenization/TokenRegistry.sol new file mode 100644 index 0000000..f6b901d --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/tokenization/TokenRegistry.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "../bridge/interop/BridgeRegistry.sol"; + +/** + * @title TokenRegistry + * @notice Registry for all tokenized assets with metadata + */ +contract TokenRegistry is AccessControl, Pausable { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + + struct TokenMetadata { + address tokenAddress; + string tokenId; // Fabric token ID + string underlyingAsset; // EUR, USD, etc. + address issuer; + string backingReserve; // Reserve ID or address + uint256 totalSupply; + uint256 backedAmount; // Amount backed by reserves + TokenStatus status; + uint256 createdAt; + uint256 updatedAt; + } + + enum TokenStatus { + PENDING, + ACTIVE, + SUSPENDED, + REDEEMED + } + + mapping(address => TokenMetadata) public tokens; + mapping(string => address) public tokenIdToAddress; // Fabric tokenId -> Besu address + address[] public registeredTokens; + + event TokenRegistered( + address indexed tokenAddress, + string indexed tokenId, + string underlyingAsset, + address indexed issuer + ); + + event TokenUpdated( + address indexed tokenAddress, + TokenStatus oldStatus, + TokenStatus newStatus + ); + + event TokenSuspended(address indexed tokenAddress, string reason); + event TokenActivated(address indexed tokenAddress); + + error TokenNotFound(); + error TokenAlreadyRegistered(); + error InvalidStatus(); + error InvalidBacking(); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a tokenized asset + * @param tokenAddress ERC-20 token address + * @param tokenId Fabric token ID + * @param underlyingAsset Underlying asset type (EUR, USD, etc.) + * @param issuer Issuer address + * @param backingReserve Reserve identifier + */ + function registerToken( + address tokenAddress, + string calldata tokenId, + string calldata underlyingAsset, + address issuer, + string calldata backingReserve + ) external onlyRole(REGISTRAR_ROLE) { + if (tokens[tokenAddress].tokenAddress != address(0)) { + revert TokenAlreadyRegistered(); + } + + tokens[tokenAddress] = TokenMetadata({ + tokenAddress: tokenAddress, + tokenId: tokenId, + underlyingAsset: underlyingAsset, + issuer: issuer, + backingReserve: backingReserve, + totalSupply: 0, + backedAmount: 0, + status: TokenStatus.PENDING, + createdAt: block.timestamp, + updatedAt: block.timestamp + }); + + tokenIdToAddress[tokenId] = tokenAddress; + registeredTokens.push(tokenAddress); + + emit TokenRegistered(tokenAddress, tokenId, underlyingAsset, issuer); + } + + /** + * @notice Update token status + * @param tokenAddress Token address + * @param newStatus New status + */ + function updateTokenStatus( + address tokenAddress, + TokenStatus newStatus + ) external onlyRole(REGISTRAR_ROLE) { + TokenMetadata storage token = tokens[tokenAddress]; + if (token.tokenAddress == address(0)) revert TokenNotFound(); + + TokenStatus oldStatus = token.status; + token.status = newStatus; + token.updatedAt = block.timestamp; + + emit TokenUpdated(tokenAddress, oldStatus, newStatus); + } + + /** + * @notice Update token supply and backing + * @param tokenAddress Token address + * @param totalSupply Current total supply + * @param backedAmount Amount backed by reserves + */ + function updateTokenBacking( + address tokenAddress, + uint256 totalSupply, + uint256 backedAmount + ) external onlyRole(REGISTRAR_ROLE) { + TokenMetadata storage token = tokens[tokenAddress]; + if (token.tokenAddress == address(0)) revert TokenNotFound(); + + // Verify 1:1 backing + if (totalSupply > backedAmount) { + revert InvalidBacking(); + } + + token.totalSupply = totalSupply; + token.backedAmount = backedAmount; + token.updatedAt = block.timestamp; + } + + /** + * @notice Suspend a token + * @param tokenAddress Token address + * @param reason Reason for suspension + */ + function suspendToken( + address tokenAddress, + string calldata reason + ) external onlyRole(REGISTRAR_ROLE) { + TokenMetadata storage token = tokens[tokenAddress]; + if (token.tokenAddress == address(0)) revert TokenNotFound(); + + token.status = TokenStatus.SUSPENDED; + token.updatedAt = block.timestamp; + + emit TokenSuspended(tokenAddress, reason); + } + + /** + * @notice Activate a suspended token + * @param tokenAddress Token address + */ + function activateToken(address tokenAddress) external onlyRole(REGISTRAR_ROLE) { + TokenMetadata storage token = tokens[tokenAddress]; + if (token.tokenAddress == address(0)) revert TokenNotFound(); + + token.status = TokenStatus.ACTIVE; + token.updatedAt = block.timestamp; + + emit TokenActivated(tokenAddress); + } + + /** + * @notice Get token metadata + * @param tokenAddress Token address + * @return Token metadata + */ + function getToken(address tokenAddress) external view returns (TokenMetadata memory) { + return tokens[tokenAddress]; + } + + /** + * @notice Get token address by Fabric token ID + * @param tokenId Fabric token ID + * @return Token address + */ + function getTokenByFabricId(string calldata tokenId) external view returns (address) { + return tokenIdToAddress[tokenId]; + } + + /** + * @notice Get all registered tokens + * @return Array of token addresses + */ + function getAllTokens() external view returns (address[] memory) { + return registeredTokens; + } + + /** + * @notice Check if token is active + * @param tokenAddress Token address + * @return True if active + */ + function isTokenActive(address tokenAddress) external view returns (bool) { + TokenMetadata memory token = tokens[tokenAddress]; + return token.status == TokenStatus.ACTIVE; + } + + /** + * @notice Pause registry + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /** + * @notice Unpause registry + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/tokenization/TokenizedEUR.sol b/verification-sources/chain138-buildinfo-7678218/contracts/tokenization/TokenizedEUR.sol new file mode 100644 index 0000000..e4e3e76 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/tokenization/TokenizedEUR.sol @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "../bridge/interop/BridgeEscrowVault.sol"; + +/** + * @title TokenizedEUR + * @notice ERC-20 tokenized EUR backed 1:1 by reserves on Fabric + * @dev Mintable/burnable by Fabric attestation via authorized minter + */ +contract TokenizedEUR is ERC20, ERC20Burnable, AccessControl, Pausable { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + bytes32 public constant ATTESTOR_ROLE = keccak256("ATTESTOR_ROLE"); + + uint8 private constant DECIMALS = 18; + + struct FabricAttestation { + bytes32 fabricTxHash; + string tokenId; + uint256 amount; + address minter; + uint256 timestamp; + bytes signature; + } + + mapping(bytes32 => bool) public processedFabricTxs; + mapping(string => uint256) public fabricTokenBalances; // Fabric tokenId -> Besu balance + + event TokenizedEURMinted( + address indexed to, + uint256 amount, + string indexed fabricTokenId, + bytes32 fabricTxHash + ); + + event TokenizedEURBurned( + address indexed from, + uint256 amount, + string indexed fabricTokenId, + bytes32 fabricTxHash + ); + + event FabricAttestationReceived( + bytes32 indexed fabricTxHash, + string tokenId, + uint256 amount + ); + + error ZeroAmount(); + error ZeroAddress(); + error InvalidFabricAttestation(); + error FabricTxAlreadyProcessed(); + error InsufficientFabricBalance(); + + constructor(address admin) ERC20("Tokenized EUR", "EUR-T") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(MINTER_ROLE, admin); + _grantRole(BURNER_ROLE, admin); + _grantRole(ATTESTOR_ROLE, admin); + } + + /** + * @notice Mint tokenized EUR based on Fabric attestation + * @param to Recipient address + * @param amount Amount to mint + * @param fabricTokenId Fabric token ID + * @param fabricTxHash Fabric transaction hash + * @param attestation Attestation from Fabric + */ + function mintFromFabric( + address to, + uint256 amount, + string memory fabricTokenId, + bytes32 fabricTxHash, + FabricAttestation calldata attestation + ) external onlyRole(MINTER_ROLE) whenNotPaused { + if (to == address(0)) revert ZeroAddress(); + if (amount == 0) revert ZeroAmount(); + if (processedFabricTxs[fabricTxHash]) revert FabricTxAlreadyProcessed(); + + // Verify attestation (in production, verify signature) + if (attestation.fabricTxHash != fabricTxHash) { + revert InvalidFabricAttestation(); + } + if (attestation.amount != amount) { + revert InvalidFabricAttestation(); + } + + // Mark Fabric tx as processed + processedFabricTxs[fabricTxHash] = true; + + // Update Fabric token balance mapping + fabricTokenBalances[fabricTokenId] += amount; + + // Mint tokens + _mint(to, amount); + + emit TokenizedEURMinted(to, amount, fabricTokenId, fabricTxHash); + emit FabricAttestationReceived(fabricTxHash, fabricTokenId, amount); + } + + /** + * @notice Burn tokenized EUR to redeem on Fabric + * @param from Address to burn from + * @param amount Amount to burn + * @param fabricTokenId Fabric token ID + * @param fabricTxHash Fabric redemption transaction hash + */ + function burnForFabric( + address from, + uint256 amount, + string memory fabricTokenId, + bytes32 fabricTxHash + ) external onlyRole(BURNER_ROLE) whenNotPaused { + if (from == address(0)) revert ZeroAddress(); + if (amount == 0) revert ZeroAmount(); + if (processedFabricTxs[fabricTxHash]) revert FabricTxAlreadyProcessed(); + + // Check Fabric token balance + if (fabricTokenBalances[fabricTokenId] < amount) { + revert InsufficientFabricBalance(); + } + + // Mark Fabric tx as processed + processedFabricTxs[fabricTxHash] = true; + + // Update Fabric token balance mapping + fabricTokenBalances[fabricTokenId] -= amount; + + // Burn tokens + _burn(from, amount); + + emit TokenizedEURBurned(from, amount, fabricTokenId, fabricTxHash); + } + + /** + * @notice Get Fabric token balance on Besu + * @param fabricTokenId Fabric token ID + * @return Balance on Besu + */ + function getFabricTokenBalance(string memory fabricTokenId) external view returns (uint256) { + return fabricTokenBalances[fabricTokenId]; + } + + /** + * @notice Check if Fabric tx has been processed + * @param fabricTxHash Fabric transaction hash + * @return True if processed + */ + function isFabricTxProcessed(bytes32 fabricTxHash) external view returns (bool) { + return processedFabricTxs[fabricTxHash]; + } + + /** + * @notice Override decimals to return 18 + */ + function decimals() public pure override returns (uint8) { + return DECIMALS; + } + + /** + * @notice Pause token transfers + */ + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /** + * @notice Unpause token transfers + */ + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/tokens/CompliantFiatToken.sol b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/CompliantFiatToken.sol new file mode 100644 index 0000000..d3b228a --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/CompliantFiatToken.sol @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "../compliance/LegallyCompliantBase.sol"; + +/** + * @title CompliantFiatToken + * @notice Generic ISO-4217 compliant fiat/commodity token (ERC-20, DEX-ready) + * @dev Use for cEURC, cGBPC, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT, etc. + * Full ERC-20 for DEX liquidity pools; inherits LegallyCompliantBase. + */ +contract CompliantFiatToken is ERC20, Pausable, Ownable, LegallyCompliantBase { + uint8 private immutable _decimalsStorage; + string private _currencyCode; + + /** + * @notice Constructor + * @param name_ Token name (e.g. "Euro Coin (Compliant)") + * @param symbol_ Token symbol (e.g. "cEURC") + * @param decimals_ Token decimals (e.g. 6) + * @param currencyCode_ ISO-4217 code (e.g. "EUR") + * @param initialOwner Owner address + * @param admin Compliance admin (DEFAULT_ADMIN_ROLE) + * @param initialSupply Initial supply to mint to deployer + */ + constructor( + string memory name_, + string memory symbol_, + uint8 decimals_, + string memory currencyCode_, + address initialOwner, + address admin, + uint256 initialSupply + ) + ERC20(name_, symbol_) + Ownable(initialOwner) + LegallyCompliantBase(admin) + { + _decimalsStorage = decimals_; + _currencyCode = currencyCode_; + if (initialSupply > 0) { + _mint(msg.sender, initialSupply); + } + } + + function decimals() public view override returns (uint8) { + return _decimalsStorage; + } + + function currencyCode() external view returns (string memory) { + return _currencyCode; + } + + /** + * @notice Internal transfer with compliance tracking + */ + function _update( + address from, + address to, + uint256 amount + ) internal override whenNotPaused { + super._update(from, to, amount); + if (from != address(0) && to != address(0)) { + bytes32 legalRefHash = _generateLegalReferenceHash( + from, + to, + amount, + abi.encodePacked(symbol(), " Transfer") + ); + emit ValueTransferDeclared(from, to, amount, legalRefHash); + } + } + + function pause() public onlyOwner { + _pause(); + } + + function unpause() public onlyOwner { + _unpause(); + } + + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } + + function burn(uint256 amount) public { + _burn(msg.sender, amount); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/tokens/CompliantUSDC.sol b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/CompliantUSDC.sol new file mode 100644 index 0000000..ac581da --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/CompliantUSDC.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "../compliance/LegallyCompliantBase.sol"; + +/** + * @title CompliantUSDC + * @notice USD Coin (Compliant) - ERC20 token with full legal compliance + * @dev Inherits from LegallyCompliantBase for Travel Rules exemption and regulatory compliance exemption + */ +contract CompliantUSDC is ERC20, Pausable, Ownable, LegallyCompliantBase { + uint8 private constant DECIMALS = 6; + + /** + * @notice Constructor + * @param initialOwner Address that will own the contract + * @param admin Address that will receive DEFAULT_ADMIN_ROLE for compliance + */ + constructor( + address initialOwner, + address admin + ) + ERC20("USD Coin (Compliant)", "cUSDC") + Ownable(initialOwner) + LegallyCompliantBase(admin) + { + // Mint initial supply to deployer + _mint(msg.sender, 1000000 * 10**DECIMALS); + } + + /** + * @notice Returns the number of decimals + * @return Number of decimals (6 for USDC) + */ + function decimals() public pure override returns (uint8) { + return DECIMALS; + } + + /** + * @notice Internal transfer override with compliance tracking + * @param from Source address + * @param to Destination address + * @param amount Transfer amount + */ + function _update( + address from, + address to, + uint256 amount + ) internal override whenNotPaused { + // Perform the transfer + super._update(from, to, amount); + + // Emit compliant value transfer event + if (from != address(0) && to != address(0)) { + bytes32 legalRefHash = _generateLegalReferenceHash( + from, + to, + amount, + abi.encodePacked("cUSDC Transfer") + ); + emit ValueTransferDeclared(from, to, amount, legalRefHash); + } + } + + /** + * @notice Pause token transfers + * @dev Only owner can pause + */ + function pause() public onlyOwner { + _pause(); + } + + /** + * @notice Unpause token transfers + * @dev Only owner can unpause + */ + function unpause() public onlyOwner { + _unpause(); + } + + /** + * @notice Mint new tokens + * @param to Address to mint tokens to + * @param amount Amount of tokens to mint + * @dev Only owner can mint + */ + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } + + /** + * @notice Burn tokens from caller's balance + * @param amount Amount of tokens to burn + */ + function burn(uint256 amount) public { + _burn(msg.sender, amount); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/tokens/CompliantUSDT.sol b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/CompliantUSDT.sol new file mode 100644 index 0000000..8d81304 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/CompliantUSDT.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "../compliance/LegallyCompliantBase.sol"; + +/** + * @title CompliantUSDT + * @notice Tether USD (Compliant) - ERC20 token with full legal compliance + * @dev Inherits from LegallyCompliantBase for Travel Rules exemption and regulatory compliance exemption + */ +contract CompliantUSDT is ERC20, Pausable, Ownable, LegallyCompliantBase { + uint8 private constant DECIMALS = 6; + + /** + * @notice Constructor + * @param initialOwner Address that will own the contract + * @param admin Address that will receive DEFAULT_ADMIN_ROLE for compliance + */ + constructor( + address initialOwner, + address admin + ) + ERC20("Tether USD (Compliant)", "cUSDT") + Ownable(initialOwner) + LegallyCompliantBase(admin) + { + // Mint initial supply to deployer + _mint(msg.sender, 1000000 * 10**DECIMALS); + } + + /** + * @notice Returns the number of decimals + * @return Number of decimals (6 for USDT) + */ + function decimals() public pure override returns (uint8) { + return DECIMALS; + } + + /** + * @notice Internal transfer override with compliance tracking + * @param from Source address + * @param to Destination address + * @param amount Transfer amount + */ + function _update( + address from, + address to, + uint256 amount + ) internal override whenNotPaused { + // Perform the transfer + super._update(from, to, amount); + + // Emit compliant value transfer event + if (from != address(0) && to != address(0)) { + bytes32 legalRefHash = _generateLegalReferenceHash( + from, + to, + amount, + abi.encodePacked("cUSDT Transfer") + ); + emit ValueTransferDeclared(from, to, amount, legalRefHash); + } + } + + /** + * @notice Pause token transfers + * @dev Only owner can pause + */ + function pause() public onlyOwner { + _pause(); + } + + /** + * @notice Unpause token transfers + * @dev Only owner can unpause + */ + function unpause() public onlyOwner { + _unpause(); + } + + /** + * @notice Mint new tokens + * @param to Address to mint tokens to + * @param amount Amount of tokens to mint + * @dev Only owner can mint + */ + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } + + /** + * @notice Burn tokens from caller's balance + * @param amount Amount of tokens to burn + */ + function burn(uint256 amount) public { + _burn(msg.sender, amount); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/tokens/MockLinkToken.sol b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/MockLinkToken.sol new file mode 100644 index 0000000..19d1430 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/MockLinkToken.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Mock LINK Token + * @notice Simple ERC20 token for testing and development + * @dev Minimal ERC20 implementation for CCIP fee payments + */ +contract MockLinkToken { + string public name = "Chainlink Token"; + string public symbol = "LINK"; + uint8 public decimals = 18; + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + uint256 public totalSupply; + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + + /** + * @notice Mint tokens to an address + * @param to Address to mint tokens to + * @param amount Amount of tokens to mint + */ + function mint(address to, uint256 amount) external { + balanceOf[to] += amount; + totalSupply += amount; + emit Transfer(address(0), to, amount); + } + + /** + * @notice Transfer tokens + * @param to Address to transfer to + * @param amount Amount of tokens to transfer + * @return success True if transfer was successful + */ + function transfer(address to, uint256 amount) external returns (bool success) { + require(balanceOf[msg.sender] >= amount, "MockLinkToken: insufficient balance"); + balanceOf[msg.sender] -= amount; + balanceOf[to] += amount; + emit Transfer(msg.sender, to, amount); + return true; + } + + /** + * @notice Transfer tokens from one address to another + * @param from Address to transfer from + * @param to Address to transfer to + * @param amount Amount of tokens to transfer + * @return success True if transfer was successful + */ + function transferFrom(address from, address to, uint256 amount) external returns (bool success) { + require(balanceOf[from] >= amount, "MockLinkToken: insufficient balance"); + require(allowance[from][msg.sender] >= amount, "MockLinkToken: insufficient allowance"); + balanceOf[from] -= amount; + balanceOf[to] += amount; + allowance[from][msg.sender] -= amount; + emit Transfer(from, to, amount); + return true; + } + + /** + * @notice Approve spender to spend tokens + * @param spender Address to approve + * @param amount Amount of tokens to approve + * @return success True if approval was successful + */ + function approve(address spender, uint256 amount) external returns (bool success) { + allowance[msg.sender][spender] = amount; + emit Approval(msg.sender, spender, amount); + return true; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/tokens/WETH.sol b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/WETH.sol new file mode 100644 index 0000000..3cd2805 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/WETH.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Wrapped Ether (WETH9) + * @notice Standard implementation of WETH9 for ChainID 138 + * @dev Based on the canonical WETH9 implementation + */ +contract WETH { + string public name = "Wrapped Ether"; + string public symbol = "WETH"; + uint8 public decimals = 18; + + event Approval(address indexed src, address indexed guy, uint256 wad); + event Transfer(address indexed src, address indexed dst, uint256 wad); + event Deposit(address indexed dst, uint256 wad); + event Withdrawal(address indexed src, uint256 wad); + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + receive() external payable { + deposit(); + } + + function deposit() public payable { + balanceOf[msg.sender] += msg.value; + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint256 wad) public { + require(balanceOf[msg.sender] >= wad, "WETH: insufficient balance"); + balanceOf[msg.sender] -= wad; + payable(msg.sender).transfer(wad); + emit Withdrawal(msg.sender, wad); + } + + function totalSupply() public view returns (uint256) { + return address(this).balance; + } + + function approve(address guy, uint256 wad) public returns (bool) { + allowance[msg.sender][guy] = wad; + emit Approval(msg.sender, guy, wad); + return true; + } + + function transfer(address dst, uint256 wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom( + address src, + address dst, + uint256 wad + ) public returns (bool) { + require(balanceOf[src] >= wad, "WETH: insufficient balance"); + + if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) { + require(allowance[src][msg.sender] >= wad, "WETH: insufficient allowance"); + allowance[src][msg.sender] -= wad; + } + + balanceOf[src] -= wad; + balanceOf[dst] += wad; + + emit Transfer(src, dst, wad); + + return true; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/tokens/WETH10.sol b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/WETH10.sol new file mode 100644 index 0000000..d582252 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/tokens/WETH10.sol @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title WETH10 + * @notice Enhanced WETH implementation with ERC-3156 flash loans and withdraw-on-transfer-to-zero + * @dev Based on WETH10 specification with additional quality-of-life features + */ +interface IERC3156FlashBorrower { + function onFlashLoan( + address initiator, + address token, + uint256 amount, + uint256 fee, + bytes calldata data + ) external returns (bytes32); +} + +interface IERC3156FlashLender { + function maxFlashLoan(address token) external view returns (uint256); + function flashFee(address token, uint256 amount) external view returns (uint256); + function flashLoan( + IERC3156FlashBorrower receiver, + address token, + uint256 amount, + bytes calldata data + ) external returns (bool); +} + +contract WETH10 { + string public constant name = "Wrapped Ether"; + string public constant symbol = "WETH"; + uint8 public constant decimals = 18; + + bytes32 public constant FLASH_LOAN_CALLBACK_SUCCESS = keccak256("ERC3156FlashBorrower.onFlashLoan"); + uint256 public constant FLASH_FEE = 0; // No fee for flash loans + + event Approval(address indexed src, address indexed guy, uint256 wad); + event Transfer(address indexed src, address indexed dst, uint256 wad); + event Deposit(address indexed dst, uint256 wad); + event Withdrawal(address indexed src, uint256 wad); + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + receive() external payable { + deposit(); + } + + function deposit() public payable { + balanceOf[msg.sender] += msg.value; + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint256 wad) public { + require(balanceOf[msg.sender] >= wad, "WETH10: insufficient balance"); + balanceOf[msg.sender] -= wad; + payable(msg.sender).transfer(wad); + emit Withdrawal(msg.sender, wad); + } + + function totalSupply() public view returns (uint256) { + return address(this).balance; + } + + function approve(address guy, uint256 wad) public returns (bool) { + allowance[msg.sender][guy] = wad; + emit Approval(msg.sender, guy, wad); + return true; + } + + function transfer(address dst, uint256 wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom( + address src, + address dst, + uint256 wad + ) public returns (bool) { + require(balanceOf[src] >= wad, "WETH10: insufficient balance"); + + if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) { + require(allowance[src][msg.sender] >= wad, "WETH10: insufficient allowance"); + allowance[src][msg.sender] -= wad; + } + + balanceOf[src] -= wad; + balanceOf[dst] += wad; + + emit Transfer(src, dst, wad); + + return true; + } + + // ERC-3156 Flash Loan Implementation + function maxFlashLoan(address token) external view returns (uint256) { + return token == address(this) ? address(this).balance : 0; + } + + function flashFee(address token, uint256 amount) external view returns (uint256) { + require(token == address(this), "WETH10: unsupported token"); + return FLASH_FEE; + } + + function flashLoan( + IERC3156FlashBorrower receiver, + address token, + uint256 amount, + bytes calldata data + ) external returns (bool) { + require(token == address(this), "WETH10: unsupported token"); + require(amount > 0, "WETH10: invalid amount"); + require(address(this).balance >= amount, "WETH10: insufficient liquidity"); + + // Calculate fee (FLASH_FEE is 0) + uint256 fee = FLASH_FEE; + uint256 repayAmount = amount + fee; + + // Transfer WETH to receiver (mint) + balanceOf[address(receiver)] += amount; + emit Transfer(address(0), address(receiver), amount); + + // Callback receiver + require( + receiver.onFlashLoan(msg.sender, token, amount, fee, data) == FLASH_LOAN_CALLBACK_SUCCESS, + "WETH10: flash loan callback failed" + ); + + // Verify repayment: receiver must have enough balance to repay (amount + fee) + require( + balanceOf[address(receiver)] >= repayAmount, + "WETH10: insufficient repayment" + ); + + // Repay flash loan (burn) + balanceOf[address(receiver)] -= repayAmount; + emit Transfer(address(receiver), address(0), repayAmount); + + return true; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/upgrades/ProxyFactory.sol b/verification-sources/chain138-buildinfo-7678218/contracts/upgrades/ProxyFactory.sol new file mode 100644 index 0000000..f68a467 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/upgrades/ProxyFactory.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; +import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title ProxyFactory + * @notice Factory for deploying upgradeable proxies (UUPS and Beacon patterns) + * @dev Tracks all deployed proxies for the universal bridge system + */ +contract ProxyFactory is AccessControl { + bytes32 public constant DEPLOYER_ROLE = keccak256("DEPLOYER_ROLE"); + + struct ProxyInfo { + address proxy; + address implementation; + ProxyType proxyType; + uint256 deployedAt; + address deployer; + bool isActive; + } + + enum ProxyType { + UUPS, + Beacon, + Transparent + } + + // Storage + mapping(address => ProxyInfo) public proxies; + address[] public allProxies; + mapping(address => address[]) public proxiesByImplementation; + mapping(address => UpgradeableBeacon) public beacons; + + event ProxyDeployed( + address indexed proxy, + address indexed implementation, + ProxyType proxyType, + address deployer + ); + + event BeaconCreated( + address indexed beacon, + address indexed implementation + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(DEPLOYER_ROLE, admin); + } + + /** + * @notice Deploy UUPS proxy + */ + function deployUUPSProxy( + address implementation, + bytes calldata initData + ) external onlyRole(DEPLOYER_ROLE) returns (address proxy) { + require(implementation != address(0), "Zero implementation"); + require(implementation.code.length > 0, "Not a contract"); + + // Deploy proxy + proxy = address(new ERC1967Proxy(implementation, initData)); + + // Track proxy + _trackProxy(proxy, implementation, ProxyType.UUPS); + + emit ProxyDeployed(proxy, implementation, ProxyType.UUPS, msg.sender); + + return proxy; + } + + /** + * @notice Deploy beacon proxy + */ + function deployBeaconProxy( + address beacon, + bytes calldata initData + ) external onlyRole(DEPLOYER_ROLE) returns (address proxy) { + require(beacon != address(0), "Zero beacon"); + + // Get implementation from beacon + address implementation = UpgradeableBeacon(beacon).implementation(); + + // Deploy beacon proxy + proxy = address(new BeaconProxy(beacon, initData)); + + // Track proxy + _trackProxy(proxy, implementation, ProxyType.Beacon); + + emit ProxyDeployed(proxy, implementation, ProxyType.Beacon, msg.sender); + + return proxy; + } + + /** + * @notice Create beacon for implementation + */ + function createBeacon(address implementation) external onlyRole(DEPLOYER_ROLE) returns (address beacon) { + require(implementation != address(0), "Zero implementation"); + require(implementation.code.length > 0, "Not a contract"); + + UpgradeableBeacon newBeacon = new UpgradeableBeacon(implementation, address(this)); + beacons[implementation] = newBeacon; + + emit BeaconCreated(address(newBeacon), implementation); + + return address(newBeacon); + } + + /** + * @notice Track deployed proxy + */ + function _trackProxy( + address proxy, + address implementation, + ProxyType proxyType + ) internal { + proxies[proxy] = ProxyInfo({ + proxy: proxy, + implementation: implementation, + proxyType: proxyType, + deployedAt: block.timestamp, + deployer: msg.sender, + isActive: true + }); + + allProxies.push(proxy); + proxiesByImplementation[implementation].push(proxy); + } + + // View functions + + function getProxyInfo(address proxy) external view returns (ProxyInfo memory) { + return proxies[proxy]; + } + + function getAllProxies() external view returns (address[] memory) { + return allProxies; + } + + function getProxiesByImplementation(address implementation) external view returns (address[] memory) { + return proxiesByImplementation[implementation]; + } + + function getProxyCount() external view returns (uint256) { + return allProxies.length; + } + + function isProxy(address addr) external view returns (bool) { + return proxies[addr].isActive; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/utils/AddressMapper.sol b/verification-sources/chain138-buildinfo-7678218/contracts/utils/AddressMapper.sol new file mode 100644 index 0000000..a449baf --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/utils/AddressMapper.sol @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title AddressMapper + * @notice Maps reserved genesis.json addresses to actual deployed addresses + * @dev This contract provides a centralized mapping for addresses that were + * reserved in genesis.json but deployed to different addresses + */ +contract AddressMapper { + // Mapping from genesis address to deployed address + mapping(address => address) private _addressMap; + + // Reverse mapping for verification + mapping(address => address) private _reverseMap; + + // Owner for updates + address public owner; + + event AddressMapped(address indexed genesisAddress, address indexed deployedAddress); + event MappingRemoved(address indexed genesisAddress); + + modifier onlyOwner() { + require(msg.sender == owner, "AddressMapper: caller is not owner"); + _; + } + + constructor() { + owner = msg.sender; + + // Initialize with known mappings + // WETH9: Genesis -> Deployed + address weth9Genesis = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; + address weth9Deployed = 0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6; + _addressMap[weth9Genesis] = weth9Deployed; + _reverseMap[weth9Deployed] = weth9Genesis; + emit AddressMapped(weth9Genesis, weth9Deployed); + + // WETH10: Genesis -> Deployed + address weth10Genesis = 0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F; + address weth10Deployed = 0x105F8A15b819948a89153505762444Ee9f324684; + _addressMap[weth10Genesis] = weth10Deployed; + _reverseMap[weth10Deployed] = weth10Genesis; + emit AddressMapped(weth10Genesis, weth10Deployed); + } + + /** + * @notice Get the deployed address for a genesis address + * @param genesisAddress The address from genesis.json + * @return deployedAddress The actual deployed address, or address(0) if not mapped + */ + function getDeployedAddress(address genesisAddress) external view returns (address) { + address deployed = _addressMap[genesisAddress]; + // If not mapped, return the genesis address itself (no mapping needed) + return deployed == address(0) ? genesisAddress : deployed; + } + + /** + * @notice Get the genesis address for a deployed address + * @param deployedAddress The deployed address + * @return genesisAddress The genesis address, or address(0) if not mapped + */ + function getGenesisAddress(address deployedAddress) external view returns (address) { + return _reverseMap[deployedAddress]; + } + + /** + * @notice Check if an address is a genesis address that has been mapped + * @param addr Address to check + * @return isMapped True if the address has a mapping + */ + function isMapped(address addr) external view returns (bool) { + return _addressMap[addr] != address(0); + } + + /** + * @notice Add or update a mapping (owner only) + * @param genesisAddress The genesis address + * @param deployedAddress The deployed address + */ + function setMapping(address genesisAddress, address deployedAddress) external onlyOwner { + require(genesisAddress != address(0), "AddressMapper: genesis address cannot be zero"); + require(deployedAddress != address(0), "AddressMapper: deployed address cannot be zero"); + require(genesisAddress != deployedAddress, "AddressMapper: addresses must be different"); + + // Remove old reverse mapping if exists + address oldDeployed = _addressMap[genesisAddress]; + if (oldDeployed != address(0)) { + delete _reverseMap[oldDeployed]; + } + + // Remove old forward mapping if deployed address was mapped to something else + address oldGenesis = _reverseMap[deployedAddress]; + if (oldGenesis != address(0)) { + delete _addressMap[oldGenesis]; + } + + // Set new mappings + _addressMap[genesisAddress] = deployedAddress; + _reverseMap[deployedAddress] = genesisAddress; + + emit AddressMapped(genesisAddress, deployedAddress); + } + + /** + * @notice Remove a mapping (owner only) + * @param genesisAddress The genesis address to remove + */ + function removeMapping(address genesisAddress) external onlyOwner { + address deployed = _addressMap[genesisAddress]; + require(deployed != address(0), "AddressMapper: mapping does not exist"); + + delete _addressMap[genesisAddress]; + delete _reverseMap[deployed]; + + emit MappingRemoved(genesisAddress); + } + + /** + * @notice Transfer ownership (owner only) + * @param newOwner The new owner address + */ + function transferOwnership(address newOwner) external onlyOwner { + require(newOwner != address(0), "AddressMapper: new owner cannot be zero"); + owner = newOwner; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/utils/AddressMapperEmpty.sol b/verification-sources/chain138-buildinfo-7678218/contracts/utils/AddressMapperEmpty.sol new file mode 100644 index 0000000..c04e8b5 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/utils/AddressMapperEmpty.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title AddressMapperEmpty + * @notice Same interface as AddressMapper but with no initial mappings (for chains other than 138). + * @dev Deploy on Cronos, BSC, etc. and add mappings via setMapping() if needed. + */ +contract AddressMapperEmpty { + mapping(address => address) private _addressMap; + mapping(address => address) private _reverseMap; + address public owner; + + event AddressMapped(address indexed genesisAddress, address indexed deployedAddress); + event MappingRemoved(address indexed genesisAddress); + + modifier onlyOwner() { + require(msg.sender == owner, "AddressMapper: caller is not owner"); + _; + } + + constructor() { + owner = msg.sender; + } + + function getDeployedAddress(address genesisAddress) external view returns (address) { + address deployed = _addressMap[genesisAddress]; + return deployed == address(0) ? genesisAddress : deployed; + } + + function getGenesisAddress(address deployedAddress) external view returns (address) { + return _reverseMap[deployedAddress]; + } + + function isMapped(address addr) external view returns (bool) { + return _addressMap[addr] != address(0); + } + + function setMapping(address genesisAddress, address deployedAddress) external onlyOwner { + require(genesisAddress != address(0), "AddressMapper: genesis address cannot be zero"); + require(deployedAddress != address(0), "AddressMapper: deployed address cannot be zero"); + require(genesisAddress != deployedAddress, "AddressMapper: addresses must be different"); + address oldDeployed = _addressMap[genesisAddress]; + if (oldDeployed != address(0)) delete _reverseMap[oldDeployed]; + address oldGenesis = _reverseMap[deployedAddress]; + if (oldGenesis != address(0)) delete _addressMap[oldGenesis]; + _addressMap[genesisAddress] = deployedAddress; + _reverseMap[deployedAddress] = genesisAddress; + emit AddressMapped(genesisAddress, deployedAddress); + } + + function removeMapping(address genesisAddress) external onlyOwner { + address deployed = _addressMap[genesisAddress]; + require(deployed != address(0), "AddressMapper: mapping does not exist"); + delete _addressMap[genesisAddress]; + delete _reverseMap[deployed]; + emit MappingRemoved(genesisAddress); + } + + function transferOwnership(address newOwner) external onlyOwner { + require(newOwner != address(0), "AddressMapper: new owner cannot be zero"); + owner = newOwner; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/utils/CREATE2Factory.sol b/verification-sources/chain138-buildinfo-7678218/contracts/utils/CREATE2Factory.sol new file mode 100644 index 0000000..f0c50c2 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/utils/CREATE2Factory.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title CREATE2 Factory + * @notice Factory for deploying contracts at deterministic addresses using CREATE2 + * @dev Based on the canonical CREATE2 factory pattern + */ +contract CREATE2Factory { + event Deployed(address addr, uint256 salt); + + /** + * @notice Deploy a contract using CREATE2 + * @param bytecode Contract bytecode + * @param salt Salt for deterministic address generation + * @return addr Deployed contract address + */ + function deploy(bytes memory bytecode, uint256 salt) public returns (address addr) { + assembly { + addr := create2(0, add(bytecode, 0x20), mload(bytecode), salt) + if iszero(extcodesize(addr)) { + revert(0, 0) + } + } + emit Deployed(addr, salt); + } + + /** + * @notice Compute the address that will be created with CREATE2 + * @param bytecode Contract bytecode + * @param salt Salt for deterministic address generation + * @return addr Predicted contract address + */ + function computeAddress(bytes memory bytecode, uint256 salt) public view returns (address addr) { + bytes32 hash = keccak256( + abi.encodePacked(bytes1(0xff), address(this), salt, keccak256(bytecode)) + ); + addr = address(uint160(uint256(hash))); + } + + /** + * @notice Compute the address that will be created with CREATE2 (with deployer) + * @param deployer Deployer address + * @param bytecode Contract bytecode + * @param salt Salt for deterministic address generation + * @return addr Predicted contract address + */ + function computeAddressWithDeployer( + address deployer, + bytes memory bytecode, + uint256 salt + ) public pure returns (address addr) { + bytes32 hash = keccak256( + abi.encodePacked(bytes1(0xff), deployer, salt, keccak256(bytecode)) + ); + addr = address(uint160(uint256(hash))); + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/utils/FeeCollector.sol b/verification-sources/chain138-buildinfo-7678218/contracts/utils/FeeCollector.sol new file mode 100644 index 0000000..a5faef4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/utils/FeeCollector.sol @@ -0,0 +1,243 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title FeeCollector + * @notice Collects and distributes protocol fees + * @dev Supports multiple tokens and multiple fee recipients + */ +contract FeeCollector is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant FEE_MANAGER_ROLE = keccak256("FEE_MANAGER_ROLE"); + + /** + * @notice Fee recipient information + */ + struct FeeRecipient { + address recipient; + uint256 shareBps; // Share in basis points (10000 = 100%) + bool isActive; + } + + mapping(address => FeeRecipient[]) private _feeRecipients; // token => recipients + mapping(address => uint256) private _totalCollected; // token => total collected + mapping(address => uint256) private _totalDistributed; // token => total distributed + + event FeesCollected( + address indexed token, + address indexed from, + uint256 amount, + uint256 timestamp + ); + + event FeesDistributed( + address indexed token, + address indexed recipient, + uint256 amount, + uint256 timestamp + ); + + event FeeRecipientAdded( + address indexed token, + address indexed recipient, + uint256 shareBps, + uint256 timestamp + ); + + event FeeRecipientRemoved( + address indexed token, + address indexed recipient, + uint256 timestamp + ); + + /** + * @notice Constructor + * @param admin Address that will receive DEFAULT_ADMIN_ROLE + */ + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(FEE_MANAGER_ROLE, admin); + } + + /** + * @notice Collect fees in a token + * @param token Token address (address(0) for native ETH) + * @param amount Amount to collect + * @dev Can be called by anyone, typically called by contracts that collect fees + */ + function collectFees(address token, uint256 amount) external payable nonReentrant { + if (token == address(0)) { + // Native ETH + require(msg.value == amount, "FeeCollector: ETH amount mismatch"); + } else { + // ERC20 token + require(msg.value == 0, "FeeCollector: no ETH expected"); + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + } + + _totalCollected[token] += amount; + + emit FeesCollected(token, msg.sender, amount, block.timestamp); + } + + /** + * @notice Distribute collected fees to recipients + * @param token Token address (address(0) for native ETH) + * @dev Requires FEE_MANAGER_ROLE + */ + function distributeFees(address token) external onlyRole(FEE_MANAGER_ROLE) nonReentrant { + FeeRecipient[] memory recipients = _feeRecipients[token]; + require(recipients.length > 0, "FeeCollector: no recipients configured"); + + uint256 balance = token == address(0) + ? address(this).balance + : IERC20(token).balanceOf(address(this)); + + require(balance > 0, "FeeCollector: no fees to distribute"); + + uint256 totalDistributed = 0; + + for (uint256 i = 0; i < recipients.length; i++) { + if (!recipients[i].isActive) continue; + + uint256 amount = (balance * recipients[i].shareBps) / 10000; + + if (token == address(0)) { + // Native ETH + (bool success, ) = recipients[i].recipient.call{value: amount}(""); + require(success, "FeeCollector: ETH transfer failed"); + } else { + // ERC20 token + IERC20(token).safeTransfer(recipients[i].recipient, amount); + } + + totalDistributed += amount; + _totalDistributed[token] += amount; + + emit FeesDistributed(token, recipients[i].recipient, amount, block.timestamp); + } + + // Ensure we distributed exactly the balance (within rounding) + require(totalDistributed <= balance, "FeeCollector: distribution overflow"); + } + + /** + * @notice Add a fee recipient for a token + * @param token Token address (address(0) for native ETH) + * @param recipient Recipient address + * @param shareBps Share in basis points (10000 = 100%) + * @dev Requires FEE_MANAGER_ROLE + */ + function addFeeRecipient( + address token, + address recipient, + uint256 shareBps + ) external onlyRole(FEE_MANAGER_ROLE) { + require(recipient != address(0), "FeeCollector: zero recipient"); + require(shareBps > 0 && shareBps <= 10000, "FeeCollector: invalid share"); + + // Check if recipient already exists + FeeRecipient[] storage recipients = _feeRecipients[token]; + for (uint256 i = 0; i < recipients.length; i++) { + require(recipients[i].recipient != recipient, "FeeCollector: recipient already exists"); + } + + recipients.push(FeeRecipient({ + recipient: recipient, + shareBps: shareBps, + isActive: true + })); + + emit FeeRecipientAdded(token, recipient, shareBps, block.timestamp); + } + + /** + * @notice Remove a fee recipient + * @param token Token address + * @param recipient Recipient address to remove + * @dev Requires FEE_MANAGER_ROLE + */ + function removeFeeRecipient(address token, address recipient) external onlyRole(FEE_MANAGER_ROLE) { + FeeRecipient[] storage recipients = _feeRecipients[token]; + + for (uint256 i = 0; i < recipients.length; i++) { + if (recipients[i].recipient == recipient) { + recipients[i] = recipients[recipients.length - 1]; + recipients.pop(); + emit FeeRecipientRemoved(token, recipient, block.timestamp); + return; + } + } + + revert("FeeCollector: recipient not found"); + } + + /** + * @notice Get fee recipients for a token + * @param token Token address + * @return Array of fee recipients + */ + function getFeeRecipients(address token) external view returns (FeeRecipient[] memory) { + return _feeRecipients[token]; + } + + /** + * @notice Get total collected fees for a token + * @param token Token address + * @return Total collected amount + */ + function getTotalCollected(address token) external view returns (uint256) { + return _totalCollected[token]; + } + + /** + * @notice Get total distributed fees for a token + * @param token Token address + * @return Total distributed amount + */ + function getTotalDistributed(address token) external view returns (uint256) { + return _totalDistributed[token]; + } + + /** + * @notice Get current balance for a token + * @param token Token address (address(0) for native ETH) + * @return Current balance + */ + function getBalance(address token) external view returns (uint256) { + if (token == address(0)) { + return address(this).balance; + } else { + return IERC20(token).balanceOf(address(this)); + } + } + + /** + * @notice Emergency withdraw (admin only) + * @param token Token address (address(0) for native ETH) + * @param to Recipient address + * @param amount Amount to withdraw + * @dev Requires DEFAULT_ADMIN_ROLE + */ + function emergencyWithdraw( + address token, + address to, + uint256 amount + ) external onlyRole(DEFAULT_ADMIN_ROLE) nonReentrant { + require(to != address(0), "FeeCollector: zero recipient"); + + if (token == address(0)) { + (bool success, ) = to.call{value: amount}(""); + require(success, "FeeCollector: ETH transfer failed"); + } else { + IERC20(token).safeTransfer(to, amount); + } + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/utils/Multicall.sol b/verification-sources/chain138-buildinfo-7678218/contracts/utils/Multicall.sol new file mode 100644 index 0000000..a267e25 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/utils/Multicall.sol @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Multicall + * @notice Aggregate multiple calls in a single transaction + * @dev Based on Uniswap V3 Multicall + */ +contract Multicall { + struct Call { + address target; + bytes callData; + } + + struct Result { + bool success; + bytes returnData; + } + + /** + * @notice Aggregate multiple calls + * @param calls Array of calls to execute + * @return returnData Array of return data for each call + */ + function aggregate(Call[] memory calls) public returns (bytes[] memory returnData) { + returnData = new bytes[](calls.length); + for (uint256 i = 0; i < calls.length; i++) { + (bool success, bytes memory ret) = calls[i].target.call(calls[i].callData); + require(success, "Multicall: call failed"); + returnData[i] = ret; + } + } + + /** + * @notice Aggregate multiple calls, allowing failures + * @param requireSuccess If true, require all calls to succeed + * @param calls Array of calls to execute + * @return returnData Array of results with success flags and return data for each call + */ + function tryAggregate(bool requireSuccess, Call[] memory calls) + public + returns (Result[] memory returnData) + { + returnData = new Result[](calls.length); + for (uint256 i = 0; i < calls.length; i++) { + (bool success, bytes memory ret) = calls[i].target.call(calls[i].callData); + + if (requireSuccess) { + require(success, "Multicall: call failed"); + } + + returnData[i] = Result(success, ret); + } + } + + /** + * @notice Aggregate multiple calls with gas limit + * @param calls Array of calls to execute + * @param gasLimit Gas limit for each call + * @return returnData Array of return data for each call + */ + function aggregateWithGasLimit(Call[] memory calls, uint256 gasLimit) + public + returns (bytes[] memory returnData) + { + returnData = new bytes[](calls.length); + for (uint256 i = 0; i < calls.length; i++) { + (bool success, bytes memory ret) = calls[i].target.call{gas: gasLimit}(calls[i].callData); + require(success, "Multicall: call failed"); + returnData[i] = ret; + } + } + + /** + * @notice Get block hash for a specific block + * @param blockNumber Block number + * @return blockHash Block hash + */ + function getBlockHash(uint256 blockNumber) public view returns (bytes32 blockHash) { + blockHash = blockhash(blockNumber); + } + + /** + * @notice Get current block timestamp + * @return timestamp Current block timestamp + */ + function getCurrentBlockTimestamp() public view returns (uint256 timestamp) { + timestamp = block.timestamp; + } + + /** + * @notice Get current block difficulty + * @return difficulty Current block difficulty + */ + function getCurrentBlockDifficulty() public view returns (uint256 difficulty) { + difficulty = block.difficulty; + } + + /** + * @notice Get current block gas limit + * @return gaslimit Current block gas limit + */ + function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) { + gaslimit = block.gaslimit; + } + + /** + * @notice Get current block coinbase + * @return coinbase Current block coinbase + */ + function getCurrentBlockCoinbase() public view returns (address coinbase) { + coinbase = block.coinbase; + } + + /** + * @notice Get current block number + * @return blockNumber Current block number + */ + function getCurrentBlockNumber() public view returns (uint256 blockNumber) { + blockNumber = block.number; + } + + /** + * @notice Get current chain ID + * @return chainid Current chain ID + */ + function getChainId() public view returns (uint256 chainid) { + chainid = block.chainid; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/utils/TokenRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/utils/TokenRegistry.sol new file mode 100644 index 0000000..e054a0c --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/utils/TokenRegistry.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title TokenRegistry + * @notice Registry for all tokens on ChainID 138 + * @dev Provides a centralized registry for token addresses, metadata, and status + */ +contract TokenRegistry is AccessControl { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + + /** + * @notice Token information structure + */ + struct TokenInfo { + address tokenAddress; + string name; + string symbol; + uint8 decimals; + bool isActive; + bool isNative; + address bridgeAddress; // If bridged from another chain + uint256 registeredAt; + uint256 lastUpdated; + } + + mapping(address => TokenInfo) private _tokens; + mapping(string => address) private _tokensBySymbol; + address[] private _tokenList; + + event TokenRegistered( + address indexed tokenAddress, + string name, + string symbol, + uint8 decimals, + uint256 timestamp + ); + + event TokenUpdated( + address indexed tokenAddress, + bool isActive, + uint256 timestamp + ); + + event TokenRemoved( + address indexed tokenAddress, + uint256 timestamp + ); + + /** + * @notice Constructor + * @param admin Address that will receive DEFAULT_ADMIN_ROLE + */ + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a new token + * @param tokenAddress Address of the token contract + * @param name Token name + * @param symbol Token symbol + * @param decimals Number of decimals + * @param isNative Whether this is a native token (e.g., ETH) + * @param bridgeAddress Bridge address if this is a bridged token (address(0) if not) + * @dev Requires REGISTRAR_ROLE + */ + function registerToken( + address tokenAddress, + string calldata name, + string calldata symbol, + uint8 decimals, + bool isNative, + address bridgeAddress + ) external onlyRole(REGISTRAR_ROLE) { + require(tokenAddress != address(0), "TokenRegistry: zero address"); + require(_tokens[tokenAddress].tokenAddress == address(0), "TokenRegistry: token already registered"); + require(_tokensBySymbol[symbol] == address(0), "TokenRegistry: symbol already used"); + + // Verify token contract exists (if not native) + if (!isNative) { + require(tokenAddress.code.length > 0, "TokenRegistry: invalid token contract"); + } + + _tokens[tokenAddress] = TokenInfo({ + tokenAddress: tokenAddress, + name: name, + symbol: symbol, + decimals: decimals, + isActive: true, + isNative: isNative, + bridgeAddress: bridgeAddress, + registeredAt: block.timestamp, + lastUpdated: block.timestamp + }); + + _tokensBySymbol[symbol] = tokenAddress; + _tokenList.push(tokenAddress); + + emit TokenRegistered(tokenAddress, name, symbol, decimals, block.timestamp); + } + + /** + * @notice Update token status + * @param tokenAddress Address of the token + * @param isActive New active status + * @dev Requires REGISTRAR_ROLE + */ + function updateTokenStatus(address tokenAddress, bool isActive) external onlyRole(REGISTRAR_ROLE) { + require(_tokens[tokenAddress].tokenAddress != address(0), "TokenRegistry: token not registered"); + + _tokens[tokenAddress].isActive = isActive; + _tokens[tokenAddress].lastUpdated = block.timestamp; + + emit TokenUpdated(tokenAddress, isActive, block.timestamp); + } + + /** + * @notice Remove a token from the registry + * @param tokenAddress Address of the token + * @dev Requires REGISTRAR_ROLE + */ + function removeToken(address tokenAddress) external onlyRole(REGISTRAR_ROLE) { + require(_tokens[tokenAddress].tokenAddress != address(0), "TokenRegistry: token not registered"); + + // Remove from symbol mapping + delete _tokensBySymbol[_tokens[tokenAddress].symbol]; + + // Remove from list (swap with last element and pop) + for (uint256 i = 0; i < _tokenList.length; i++) { + if (_tokenList[i] == tokenAddress) { + _tokenList[i] = _tokenList[_tokenList.length - 1]; + _tokenList.pop(); + break; + } + } + + delete _tokens[tokenAddress]; + + emit TokenRemoved(tokenAddress, block.timestamp); + } + + /** + * @notice Get token information + * @param tokenAddress Address of the token + * @return Token information struct + */ + function getTokenInfo(address tokenAddress) external view returns (TokenInfo memory) { + return _tokens[tokenAddress]; + } + + /** + * @notice Get token address by symbol + * @param symbol Token symbol + * @return Token address (address(0) if not found) + */ + function getTokenBySymbol(string calldata symbol) external view returns (address) { + address tokenAddr = _tokensBySymbol[symbol]; + return tokenAddr; + } + + /** + * @notice Check if a token is registered + * @param tokenAddress Address of the token + * @return True if registered, false otherwise + */ + function isTokenRegistered(address tokenAddress) external view returns (bool) { + return _tokens[tokenAddress].tokenAddress != address(0); + } + + /** + * @notice Check if a token is active + * @param tokenAddress Address of the token + * @return True if active, false otherwise + */ + function isTokenActive(address tokenAddress) external view returns (bool) { + TokenInfo memory token = _tokens[tokenAddress]; + return token.tokenAddress != address(0) && token.isActive; + } + + /** + * @notice Get all registered tokens + * @return Array of token addresses + */ + function getAllTokens() external view returns (address[] memory) { + return _tokenList; + } + + /** + * @notice Get count of registered tokens + * @return Number of registered tokens + */ + function getTokenCount() external view returns (uint256) { + return _tokenList.length; + } +} + diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/BridgeVaultExtension.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/BridgeVaultExtension.sol new file mode 100644 index 0000000..a6b4bce --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/BridgeVaultExtension.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; + +/** + * @title BridgeVaultExtension + * @notice Extension to vault for tracking bridge operations + * @dev Can be attached to existing vault contracts + */ +contract BridgeVaultExtension is AccessControl { + bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE"); + + enum BridgeStatus { + Initiated, + Confirmed, + Completed, + Failed + } + + struct BridgeRecord { + bytes32 messageId; + address token; + uint256 amount; + uint64 destinationChain; + address recipient; + uint256 timestamp; + BridgeStatus status; + } + + // Storage + mapping(bytes32 => BridgeRecord) public bridgeRecords; + bytes32[] public bridgeHistory; + mapping(address => bytes32[]) public userBridgeHistory; + + event BridgeRecorded( + bytes32 indexed messageId, + address indexed token, + uint256 amount, + uint64 destinationChain + ); + + event BridgeStatusUpdated( + bytes32 indexed messageId, + BridgeStatus status + ); + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(BRIDGE_OPERATOR_ROLE, admin); + } + + /** + * @notice Record bridge operation + */ + function recordBridgeOperation( + bytes32 messageId, + address token, + uint256 amount, + uint64 destinationChain, + address recipient + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + require(messageId != bytes32(0), "Invalid message ID"); + require(bridgeRecords[messageId].timestamp == 0, "Already recorded"); + + bridgeRecords[messageId] = BridgeRecord({ + messageId: messageId, + token: token, + amount: amount, + destinationChain: destinationChain, + recipient: recipient, + timestamp: block.timestamp, + status: BridgeStatus.Initiated + }); + + bridgeHistory.push(messageId); + userBridgeHistory[recipient].push(messageId); + + emit BridgeRecorded(messageId, token, amount, destinationChain); + } + + /** + * @notice Update bridge status + */ + function updateBridgeStatus( + bytes32 messageId, + BridgeStatus status + ) external onlyRole(BRIDGE_OPERATOR_ROLE) { + require(bridgeRecords[messageId].timestamp > 0, "Not found"); + + bridgeRecords[messageId].status = status; + + emit BridgeStatusUpdated(messageId, status); + } + + // View functions + + function getBridgeRecord(bytes32 messageId) external view returns (BridgeRecord memory) { + return bridgeRecords[messageId]; + } + + function getBridgeHistory(address user) external view returns (BridgeRecord[] memory) { + bytes32[] memory userHistory = userBridgeHistory[user]; + BridgeRecord[] memory records = new BridgeRecord[](userHistory.length); + + for (uint256 i = 0; i < userHistory.length; i++) { + records[i] = bridgeRecords[userHistory[i]]; + } + + return records; + } + + function getAllBridgeHistory() external view returns (BridgeRecord[] memory) { + BridgeRecord[] memory records = new BridgeRecord[](bridgeHistory.length); + + for (uint256 i = 0; i < bridgeHistory.length; i++) { + records[i] = bridgeRecords[bridgeHistory[i]]; + } + + return records; + } + + function getBridgeCount() external view returns (uint256) { + return bridgeHistory.length; + } + + function getUserBridgeCount(address user) external view returns (uint256) { + return userBridgeHistory[user].length; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/Ledger.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/Ledger.sol new file mode 100644 index 0000000..8aedddb --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/Ledger.sol @@ -0,0 +1,302 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./interfaces/ILedger.sol"; +import "./interfaces/IXAUOracle.sol"; +import "./interfaces/IRateAccrual.sol"; + +/** + * @title Ledger + * @notice Core ledger for tracking collateral and debt balances + * @dev Single source of truth for all vault accounting + * + * COMPLIANCE NOTES: + * - All valuations are normalized to XAU (gold) as the universal unit of account + * - eMoney tokens are XAU-denominated (1 eMoney = 1 XAU equivalent) + * - GRU (Global Reserve Unit) is a NON-ISO 4217 synthetic unit of account, NOT legal tender + * - All currency conversions MUST go through XAU triangulation + * - ISO 4217 currency codes are validated where applicable + */ +contract Ledger is ILedger, AccessControl { + bytes32 public constant VAULT_ROLE = keccak256("VAULT_ROLE"); + bytes32 public constant PARAM_MANAGER_ROLE = keccak256("PARAM_MANAGER_ROLE"); + + // Collateral balances: vault => asset => amount + mapping(address => mapping(address => uint256)) public override collateral; + + // Debt balances: vault => currency => amount + mapping(address => mapping(address => uint256)) public override debt; + + // Risk parameters per asset + mapping(address => uint256) public override debtCeiling; + mapping(address => uint256) public override liquidationRatio; // in basis points + mapping(address => uint256) public override creditMultiplier; // in basis points (50000 = 5x) + mapping(address => uint256) public override rateAccumulator; // debt interest accumulator + + // System contracts + IXAUOracle public xauOracle; + IRateAccrual public rateAccrual; + + // Track registered assets + mapping(address => bool) public isRegisteredAsset; + + constructor(address admin, address xauOracle_, address rateAccrual_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(PARAM_MANAGER_ROLE, admin); + xauOracle = IXAUOracle(xauOracle_); + rateAccrual = IRateAccrual(rateAccrual_); + } + + /** + * @notice Modify collateral balance for a vault + * @param vault Vault address + * @param asset Collateral asset address + * @param delta Amount to add (positive) or subtract (negative) + */ + function modifyCollateral(address vault, address asset, int256 delta) external override onlyRole(VAULT_ROLE) { + require(isRegisteredAsset[asset], "Ledger: asset not registered"); + + uint256 currentBalance = collateral[vault][asset]; + + if (delta > 0) { + collateral[vault][asset] = currentBalance + uint256(delta); + } else if (delta < 0) { + uint256 decrease = uint256(-delta); + require(currentBalance >= decrease, "Ledger: insufficient collateral"); + collateral[vault][asset] = currentBalance - decrease; + } + + emit CollateralModified(vault, asset, delta); + } + + /** + * @notice Modify debt balance for a vault + * @param vault Vault address + * @param currency Debt currency address (eMoney token) + * @param delta Amount to add (positive) or subtract (negative) + */ + function modifyDebt(address vault, address currency, int256 delta) external override onlyRole(VAULT_ROLE) { + // Accrue interest before modifying debt + rateAccrual.accrueInterest(currency); + uint256 accumulator = rateAccrual.getRateAccumulator(currency); + rateAccumulator[currency] = accumulator; + + uint256 currentDebt = debt[vault][currency]; + + if (delta > 0) { + uint256 addAmount = uint256(delta); + debt[vault][currency] = currentDebt + addAmount; + _totalDebtForCurrency[currency] += addAmount; + _trackCurrency(currency); + } else if (delta < 0) { + uint256 decrease = uint256(-delta); + require(currentDebt >= decrease, "Ledger: insufficient debt"); + debt[vault][currency] = currentDebt - decrease; + _totalDebtForCurrency[currency] -= decrease; + } + + emit DebtModified(vault, currency, delta); + } + + /** + * @notice Get vault health (collateralization ratio in XAU) + * @param vault Vault address + * @return healthRatio Collateralization ratio in basis points (10000 = 100%) + * @return collateralValue Total collateral value in XAU (18 decimals) + * @return debtValue Total debt value in XAU (18 decimals) + */ + function getVaultHealth(address vault) external view override returns ( + uint256 healthRatio, + uint256 collateralValue, + uint256 debtValue + ) { + collateralValue = _calculateCollateralValue(vault); + debtValue = _calculateDebtValue(vault); + + if (debtValue == 0) { + // No debt = infinite health + healthRatio = type(uint256).max; + } else { + // healthRatio = (collateralValue / debtValue) * 10000 + healthRatio = (collateralValue * 10000) / debtValue; + } + } + + /** + * @notice Check if a vault can borrow a specific amount + * @param vault Vault address + * @param currency Debt currency address + * @param amount Amount to borrow (in currency units) + * @return canBorrow True if borrow is allowed + * @return reasonCode Reason code if borrow is not allowed + */ + function canBorrow(address vault, address currency, uint256 amount) external view override returns ( + bool canBorrow, + bytes32 reasonCode + ) { + // Get current collateral and debt values in XAU + uint256 collateralValue = _calculateCollateralValue(vault); + uint256 currentDebtValue = _calculateDebtValue(vault); + + // Calculate new debt value in XAU + // eMoney is XAU-denominated by design: 1 eMoney = 1 XAU equivalent + // MANDATORY: If non-XAU currencies are used, they MUST be triangulated through XAU + uint256 newDebtValue = currentDebtValue + amount; + + // Check debt ceiling + uint256 totalDebt = _getTotalDebtForCurrency(currency); + if (totalDebt + amount > debtCeiling[currency]) { + return (false, keccak256("DEBT_CEILING_EXCEEDED")); + } + + // Check collateralization ratio + // Apply credit multiplier: maxBorrowValue = collateralValue * creditMultiplier / 10000 + uint256 maxBorrowValue = (collateralValue * creditMultiplier[currency]) / 10000; + + if (newDebtValue > maxBorrowValue) { + return (false, keccak256("INSUFFICIENT_COLLATERAL")); + } + + // Check minimum collateralization ratio + uint256 healthRatio = (collateralValue * 10000) / newDebtValue; + uint256 minRatio = liquidationRatio[currency] + 100; // Add 1% buffer above liquidation ratio + + if (healthRatio < minRatio) { + return (false, keccak256("BELOW_MIN_COLLATERALIZATION")); + } + + return (true, bytes32(0)); + } + + /** + * @notice Set risk parameters for an asset + * @param asset Asset address + * @param debtCeiling_ Debt ceiling + * @param liquidationRatio_ Liquidation ratio in basis points + * @param creditMultiplier_ Credit multiplier in basis points + */ + function setRiskParameters( + address asset, + uint256 debtCeiling_, + uint256 liquidationRatio_, + uint256 creditMultiplier_ + ) external onlyRole(PARAM_MANAGER_ROLE) { + require(liquidationRatio_ > 0 && liquidationRatio_ <= 10000, "Ledger: invalid liquidation ratio"); + require(creditMultiplier_ > 0 && creditMultiplier_ <= 100000, "Ledger: invalid credit multiplier"); // Max 10x + + isRegisteredAsset[asset] = true; + debtCeiling[asset] = debtCeiling_; + liquidationRatio[asset] = liquidationRatio_; + creditMultiplier[asset] = creditMultiplier_; + + emit RiskParametersSet(asset, debtCeiling_, liquidationRatio_, creditMultiplier_); + } + + /** + * @notice Calculate total collateral value in XAU for a vault + * @param vault Vault address + * @return value Total value in XAU (18 decimals) + */ + function _calculateCollateralValue(address vault) internal view returns (uint256 value) { + // For ETH collateral, get price from oracle + // In production, would iterate over all collateral assets + // For now, assume only ETH is supported + + // Get ETH balance + uint256 ethBalance = collateral[vault][address(0)]; // address(0) represents ETH + + if (ethBalance == 0) { + return 0; + } + + // Get ETH/XAU price from oracle + (uint256 ethPriceInXAU, ) = xauOracle.getETHPriceInXAU(); + + // Calculate value: ethBalance * ethPriceInXAU / 1e18 + value = (ethBalance * ethPriceInXAU) / 1e18; + } + + // Track currencies with debt for iteration + address[] private _currenciesWithDebt; + mapping(address => bool) private _isTrackedCurrency; + + // Total debt per currency (for debt ceiling check) + mapping(address => uint256) private _totalDebtForCurrency; + + /** + * @notice Calculate total debt value in XAU for a vault + * @param vault Vault address + * @return value Total debt value in XAU (18 decimals) + * @dev MANDATORY COMPLIANCE: eMoney tokens are XAU-denominated + * All debt is normalized to XAU terms for consistent valuation + * If non-XAU currencies are used, they MUST be triangulated through XAU + */ + function _calculateDebtValue(address vault) internal view returns (uint256 value) { + // eMoney tokens are XAU-denominated by design: 1 eMoney = 1 XAU equivalent + // This ensures all debt valuations are consistent in XAU terms + // If other currencies are used, they MUST be converted via XAU triangulation + + // Iterate over tracked currencies + for (uint256 i = 0; i < _currenciesWithDebt.length; i++) { + address currency = _currenciesWithDebt[i]; + uint256 debtAmount = debt[vault][currency]; + + if (debtAmount > 0) { + // Apply interest accrual + uint256 accumulator = rateAccrual.getRateAccumulator(currency); + uint256 debtWithInterest = (debtAmount * accumulator) / 1e27; + + // eMoney is XAU-denominated: 1:1 conversion + // For other currencies, XAU triangulation would be applied here + value += debtWithInterest; + } + } + } + + /** + * @notice Get total debt for a currency across all vaults + * @param currency Currency address + * @return total Total debt + */ + function _getTotalDebtForCurrency(address currency) internal view returns (uint256 total) { + return _totalDebtForCurrency[currency]; + } + + /** + * @notice Track a currency when debt is created + * @param currency Currency address + */ + function _trackCurrency(address currency) internal { + if (!_isTrackedCurrency[currency]) { + _currenciesWithDebt.push(currency); + _isTrackedCurrency[currency] = true; + } + } + + /** + * @notice Set XAU Oracle address + * @param xauOracle_ New oracle address + */ + function setXAUOracle(address xauOracle_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(xauOracle_ != address(0), "Ledger: zero address"); + xauOracle = IXAUOracle(xauOracle_); + } + + /** + * @notice Set Rate Accrual address + * @param rateAccrual_ New rate accrual address + */ + function setRateAccrual(address rateAccrual_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(rateAccrual_ != address(0), "Ledger: zero address"); + rateAccrual = IRateAccrual(rateAccrual_); + } + + /** + * @notice Grant VAULT_ROLE to an address (for factory use) + * @param account Address to grant role to + */ + function grantVaultRole(address account) external onlyRole(DEFAULT_ADMIN_ROLE) { + _grantRole(VAULT_ROLE, account); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/Liquidation.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/Liquidation.sol new file mode 100644 index 0000000..3fc4984 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/Liquidation.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "./interfaces/ILiquidation.sol"; +import "./interfaces/ILedger.sol"; +import "./interfaces/ICollateralAdapter.sol"; +import "./interfaces/IeMoneyJoin.sol"; + +/** + * @title Liquidation + * @notice Handles liquidation of undercollateralized vaults + * @dev Permissioned liquidators only, no public auctions + */ +contract Liquidation is ILiquidation, AccessControl, ReentrancyGuard { + bytes32 public constant LIQUIDATOR_ROLE = keccak256("LIQUIDATOR_ROLE"); + + ILedger public ledger; + ICollateralAdapter public collateralAdapter; + IeMoneyJoin public eMoneyJoin; + + uint256 public constant BASIS_POINTS = 10000; + uint256 public override liquidationBonus = 500; // 5% bonus in basis points + + constructor( + address admin, + address ledger_, + address collateralAdapter_, + address eMoneyJoin_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(LIQUIDATOR_ROLE, admin); + ledger = ILedger(ledger_); + collateralAdapter = ICollateralAdapter(collateralAdapter_); + eMoneyJoin = IeMoneyJoin(eMoneyJoin_); + } + + /** + * @notice Liquidate an undercollateralized vault + * @param vault Vault address to liquidate + * @param currency Debt currency address + * @param maxDebt Maximum debt to liquidate + * @return seizedCollateral Amount of collateral seized + * @return repaidDebt Amount of debt repaid + */ + function liquidate( + address vault, + address currency, + uint256 maxDebt + ) external override nonReentrant onlyRole(LIQUIDATOR_ROLE) returns (uint256 seizedCollateral, uint256 repaidDebt) { + (bool canLiquidate, ) = this.canLiquidate(vault); + require(canLiquidate, "Liquidation: vault not liquidatable"); + + // Get current debt + uint256 currentDebt = ledger.debt(vault, currency); + require(currentDebt > 0, "Liquidation: no debt"); + + // Calculate debt to repay (min of maxDebt and currentDebt) + repaidDebt = maxDebt < currentDebt ? maxDebt : currentDebt; + + // Get liquidation ratio for the currency + uint256 liqRatio = ledger.liquidationRatio(currency); + + // Calculate collateral value needed: repaidDebt * (1 + bonus) * liquidationRatio / 10000 + // In XAU terms + uint256 collateralValueNeeded = (repaidDebt * (BASIS_POINTS + liquidationBonus) * liqRatio) / (BASIS_POINTS * BASIS_POINTS); + + // For simplicity, assume ETH collateral (address(0)) + // In production, would determine which collateral to seize + address collateralAsset = address(0); + uint256 collateralBalance = ledger.collateral(vault, collateralAsset); + + // Calculate how much collateral to seize based on ETH/XAU price + // This is simplified - in production would use oracle + seizedCollateral = collateralValueNeeded; // Simplified: assume 1:1 for now + + // Ensure we don't seize more than available + if (seizedCollateral > collateralBalance) { + seizedCollateral = collateralBalance; + // Recalculate repaidDebt based on actual seized collateral + repaidDebt = (seizedCollateral * BASIS_POINTS * BASIS_POINTS) / ((BASIS_POINTS + liquidationBonus) * liqRatio); + } + + // Burn eMoney from liquidator (they provide eMoney to repay debt) + eMoneyJoin.burn(currency, msg.sender, repaidDebt); + + // Update debt + ledger.modifyDebt(vault, currency, -int256(repaidDebt)); + + // Seize collateral + collateralAdapter.seize(vault, collateralAsset, seizedCollateral, msg.sender); + + emit VaultLiquidated(vault, currency, seizedCollateral, repaidDebt, msg.sender); + } + + /** + * @notice Check if a vault can be liquidated + * @param vault Vault address + * @return canLiquidate True if vault can be liquidated + * @return healthRatio Current health ratio in basis points + */ + function canLiquidate(address vault) external view override returns (bool canLiquidate, uint256 healthRatio) { + (healthRatio, , ) = ledger.getVaultHealth(vault); + + // Vault is liquidatable if health ratio is below liquidation ratio + // Need to check for each currency - simplified here + // In production, would check all currencies + + // For now, assume vault is liquidatable if health < 110% (liquidation ratio + buffer) + canLiquidate = healthRatio < 11000; // 110% in basis points + } + + /** + * @notice Set liquidation bonus + * @param bonus New liquidation bonus in basis points + */ + function setLiquidationBonus(uint256 bonus) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(bonus <= 1000, "Liquidation: bonus too high"); // Max 10% + liquidationBonus = bonus; + } + + /** + * @notice Set ledger address + * @param ledger_ New ledger address + */ + function setLedger(address ledger_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(ledger_ != address(0), "Liquidation: zero address"); + ledger = ILedger(ledger_); + } + + /** + * @notice Set collateral adapter address + * @param collateralAdapter_ New adapter address + */ + function setCollateralAdapter(address collateralAdapter_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(collateralAdapter_ != address(0), "Liquidation: zero address"); + collateralAdapter = ICollateralAdapter(collateralAdapter_); + } + + /** + * @notice Set eMoney join address + * @param eMoneyJoin_ New join address + */ + function setEMoneyJoin(address eMoneyJoin_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(eMoneyJoin_ != address(0), "Liquidation: zero address"); + eMoneyJoin = IeMoneyJoin(eMoneyJoin_); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/RateAccrual.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/RateAccrual.sol new file mode 100644 index 0000000..75ceef0 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/RateAccrual.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./interfaces/IRateAccrual.sol"; + +/** + * @title RateAccrual + * @notice Applies time-based interest to outstanding debt using continuous compounding + * @dev Similar to Aave's interest rate model + */ +contract RateAccrual is IRateAccrual, AccessControl { + bytes32 public constant RATE_MANAGER_ROLE = keccak256("RATE_MANAGER_ROLE"); + + uint256 public constant BASIS_POINTS = 10000; + uint256 public constant SECONDS_PER_YEAR = 365 days; + uint256 public constant RAY = 1e27; // Used for precision in calculations + + // Asset => interest rate (in basis points, e.g., 500 = 5% annual) + mapping(address => uint256) private _interestRates; + + // Asset => rate accumulator (starts at RAY, increases over time) + mapping(address => uint256) private _rateAccumulators; + + // Asset => last update timestamp + mapping(address => uint256) private _lastUpdate; + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(RATE_MANAGER_ROLE, admin); + } + + /** + * @notice Accrue interest for an asset + * @param asset Asset address + * @return newAccumulator Updated rate accumulator + */ + function accrueInterest(address asset) external override returns (uint256 newAccumulator) { + uint256 oldAccumulator = _rateAccumulators[asset]; + uint256 lastUpdate = _lastUpdate[asset]; + + if (lastUpdate == 0) { + // Initialize accumulator + _rateAccumulators[asset] = RAY; + _lastUpdate[asset] = block.timestamp; + return RAY; + } + + if (block.timestamp == lastUpdate) { + return oldAccumulator; + } + + uint256 rate = _interestRates[asset]; + if (rate == 0) { + return oldAccumulator; + } + + // Calculate time elapsed in years + uint256 timeElapsed = block.timestamp - lastUpdate; + uint256 timeInYears = (timeElapsed * RAY) / SECONDS_PER_YEAR; + + // Continuous compounding: newAccumulator = oldAccumulator * e^(rate * time) + // Approximation: e^(r*t) ≈ 1 + r*t + (r*t)^2/2! + ... + // For small rates: e^(r*t) ≈ 1 + r*t (first order approximation) + // More accurate: use compound interest formula with high precision + + // Convert rate from basis points to RAY: rateInRay = (rate * RAY) / BASIS_POINTS + uint256 rateInRay = (rate * RAY) / BASIS_POINTS; + + // Calculate exponent: rateInRay * timeInYears / RAY + uint256 exponent = (rateInRay * timeInYears) / RAY; + + // newAccumulator = oldAccumulator * (1 + exponent) + // For better precision, we use: newAccumulator = oldAccumulator + (oldAccumulator * exponent) / RAY + newAccumulator = oldAccumulator + (oldAccumulator * exponent) / RAY; + + _rateAccumulators[asset] = newAccumulator; + _lastUpdate[asset] = block.timestamp; + + emit InterestAccrued(asset, oldAccumulator, newAccumulator); + } + + /** + * @notice Get current rate accumulator for an asset (accrues interest if needed) + * @param asset Asset address + * @return accumulator Current rate accumulator + */ + function getRateAccumulator(address asset) external view override returns (uint256 accumulator) { + accumulator = _rateAccumulators[asset]; + uint256 lastUpdate = _lastUpdate[asset]; + + if (lastUpdate == 0) { + return RAY; // Initial value + } + + if (block.timestamp == lastUpdate) { + return accumulator; + } + + uint256 rate = _interestRates[asset]; + if (rate == 0) { + return accumulator; + } + + // Calculate accrued interest (same logic as accrueInterest but view-only) + uint256 timeElapsed = block.timestamp - lastUpdate; + uint256 timeInYears = (timeElapsed * RAY) / SECONDS_PER_YEAR; + uint256 rateInRay = (rate * RAY) / BASIS_POINTS; + uint256 exponent = (rateInRay * timeInYears) / RAY; + accumulator = accumulator + (accumulator * exponent) / RAY; + } + + /** + * @notice Set interest rate for an asset + * @param asset Asset address + * @param rate Annual interest rate in basis points (e.g., 500 = 5%) + */ + function setInterestRate(address asset, uint256 rate) external onlyRole(RATE_MANAGER_ROLE) { + require(rate <= BASIS_POINTS * 100, "RateAccrual: rate too high"); // Max 100% annual + + // Accrue interest before updating rate + if (_lastUpdate[asset] > 0) { + this.accrueInterest(asset); + } else { + _rateAccumulators[asset] = RAY; + _lastUpdate[asset] = block.timestamp; + } + + _interestRates[asset] = rate; + + emit InterestRateSet(asset, rate); + } + + /** + * @notice Get interest rate for an asset + * @param asset Asset address + * @return rate Annual interest rate in basis points + */ + function interestRate(address asset) external view override returns (uint256) { + return _interestRates[asset]; + } + + /** + * @notice Calculate debt with accrued interest + * @param asset Asset address + * @param principal Principal debt amount + * @return debtWithInterest Debt amount with accrued interest + */ + function calculateDebtWithInterest(address asset, uint256 principal) external view override returns (uint256 debtWithInterest) { + uint256 accumulator = this.getRateAccumulator(asset); + // debtWithInterest = principal * accumulator / RAY + debtWithInterest = (principal * accumulator) / RAY; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/RegulatedEntityRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/RegulatedEntityRegistry.sol new file mode 100644 index 0000000..a3d0e99 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/RegulatedEntityRegistry.sol @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./interfaces/IRegulatedEntityRegistry.sol"; + +/** + * @title RegulatedEntityRegistry + * @notice Registry for tracking regulated financial entities eligible for vault operations + * @dev Separate from eMoney ComplianceRegistry (used for transfers) + */ +contract RegulatedEntityRegistry is IRegulatedEntityRegistry, AccessControl { + bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + struct Entity { + bool registered; + bool suspended; + bytes32 jurisdictionHash; + address[] authorizedWallets; + mapping(address => bool) isAuthorizedWallet; + mapping(address => bool) isOperator; + uint256 registeredAt; + } + + mapping(address => Entity) private _entities; + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(REGISTRAR_ROLE, admin); + } + + /** + * @notice Register a regulated entity + * @param entity Entity address + * @param jurisdictionHash Hash of jurisdiction identifier + * @param authorizedWallets Initial authorized wallets + */ + function registerEntity( + address entity, + bytes32 jurisdictionHash, + address[] calldata authorizedWallets + ) external onlyRole(REGISTRAR_ROLE) { + require(entity != address(0), "RegulatedEntityRegistry: zero address"); + require(!_entities[entity].registered, "RegulatedEntityRegistry: already registered"); + + Entity storage entityData = _entities[entity]; + entityData.registered = true; + entityData.jurisdictionHash = jurisdictionHash; + entityData.registeredAt = block.timestamp; + + for (uint256 i = 0; i < authorizedWallets.length; i++) { + require(authorizedWallets[i] != address(0), "RegulatedEntityRegistry: zero wallet"); + entityData.authorizedWallets.push(authorizedWallets[i]); + entityData.isAuthorizedWallet[authorizedWallets[i]] = true; + } + + emit EntityRegistered(entity, jurisdictionHash, block.timestamp); + } + + /** + * @notice Check if an entity is registered and eligible + * @param entity Entity address + * @return isEligible True if entity is registered and not suspended + */ + function isEligible(address entity) external view override returns (bool) { + Entity storage entityData = _entities[entity]; + return entityData.registered && !entityData.suspended; + } + + /** + * @notice Check if a wallet is authorized for an entity + * @param entity Entity address + * @param wallet Wallet address + * @return isAuthorized True if wallet is authorized + */ + function isAuthorized(address entity, address wallet) external view override returns (bool) { + return _entities[entity].isAuthorizedWallet[wallet]; + } + + /** + * @notice Check if an address is an operator for an entity + * @param entity Entity address + * @param operator Operator address + * @return isOperator True if address is an operator + */ + function isOperator(address entity, address operator) external view override returns (bool) { + return _entities[entity].isOperator[operator]; + } + + /** + * @notice Add authorized wallet to an entity + * @param entity Entity address + * @param wallet Wallet address to authorize + */ + function addAuthorizedWallet(address entity, address wallet) external override { + require(_entities[entity].registered, "RegulatedEntityRegistry: entity not registered"); + require( + hasRole(REGISTRAR_ROLE, msg.sender) || + _entities[entity].isAuthorizedWallet[msg.sender] || + _entities[entity].isOperator[msg.sender], + "RegulatedEntityRegistry: not authorized" + ); + require(wallet != address(0), "RegulatedEntityRegistry: zero wallet"); + require(!_entities[entity].isAuthorizedWallet[wallet], "RegulatedEntityRegistry: already authorized"); + + _entities[entity].authorizedWallets.push(wallet); + _entities[entity].isAuthorizedWallet[wallet] = true; + + emit AuthorizedWalletAdded(entity, wallet); + } + + /** + * @notice Remove authorized wallet from an entity + * @param entity Entity address + * @param wallet Wallet address to remove + */ + function removeAuthorizedWallet(address entity, address wallet) external override { + require(_entities[entity].registered, "RegulatedEntityRegistry: entity not registered"); + require( + hasRole(REGISTRAR_ROLE, msg.sender) || + _entities[entity].isAuthorizedWallet[msg.sender] || + _entities[entity].isOperator[msg.sender], + "RegulatedEntityRegistry: not authorized" + ); + require(_entities[entity].isAuthorizedWallet[wallet], "RegulatedEntityRegistry: not authorized"); + + _entities[entity].isAuthorizedWallet[wallet] = false; + + // Remove from array + address[] storage wallets = _entities[entity].authorizedWallets; + for (uint256 i = 0; i < wallets.length; i++) { + if (wallets[i] == wallet) { + wallets[i] = wallets[wallets.length - 1]; + wallets.pop(); + break; + } + } + + emit AuthorizedWalletRemoved(entity, wallet); + } + + /** + * @notice Set operator status for an entity + * @param entity Entity address + * @param operator Operator address + * @param status True to grant operator status, false to revoke + */ + function setOperator(address entity, address operator, bool status) external override { + require(_entities[entity].registered, "RegulatedEntityRegistry: entity not registered"); + require( + hasRole(REGISTRAR_ROLE, msg.sender) || + _entities[entity].isAuthorizedWallet[msg.sender], + "RegulatedEntityRegistry: not authorized" + ); + require(operator != address(0), "RegulatedEntityRegistry: zero operator"); + + _entities[entity].isOperator[operator] = status; + + emit OperatorSet(entity, operator, status); + } + + /** + * @notice Suspend an entity + * @param entity Entity address + */ + function suspendEntity(address entity) external onlyRole(REGISTRAR_ROLE) { + require(_entities[entity].registered, "RegulatedEntityRegistry: entity not registered"); + require(!_entities[entity].suspended, "RegulatedEntityRegistry: already suspended"); + + _entities[entity].suspended = true; + + emit EntitySuspended(entity, block.timestamp); + } + + /** + * @notice Unsuspend an entity + * @param entity Entity address + */ + function unsuspendEntity(address entity) external onlyRole(REGISTRAR_ROLE) { + require(_entities[entity].registered, "RegulatedEntityRegistry: entity not registered"); + require(_entities[entity].suspended, "RegulatedEntityRegistry: not suspended"); + + _entities[entity].suspended = false; + + emit EntityUnsuspended(entity, block.timestamp); + } + + /** + * @notice Get entity information + * @param entity Entity address + * @return registered True if entity is registered + * @return suspended True if entity is suspended + * @return jurisdictionHash Jurisdiction hash + * @return authorizedWallets List of authorized wallets + */ + function getEntity(address entity) external view override returns ( + bool registered, + bool suspended, + bytes32 jurisdictionHash, + address[] memory authorizedWallets + ) { + Entity storage entityData = _entities[entity]; + return ( + entityData.registered, + entityData.suspended, + entityData.jurisdictionHash, + entityData.authorizedWallets + ); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/Vault.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/Vault.sol new file mode 100644 index 0000000..b332b4a --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/Vault.sol @@ -0,0 +1,226 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "./interfaces/IVault.sol"; +import "./interfaces/ILedger.sol"; +import "./interfaces/IRegulatedEntityRegistry.sol"; +import "./interfaces/ICollateralAdapter.sol"; +import "./interfaces/IeMoneyJoin.sol"; +import "./tokens/DepositToken.sol"; +import "./tokens/DebtToken.sol"; + +/** + * @title Vault + * @notice Aave-style vault for deposit, borrow, repay, withdraw operations + * @dev Each vault is owned by a regulated entity + */ +contract Vault is IVault, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + address public override owner; + address public entity; // Regulated entity address + + ILedger public ledger; + IRegulatedEntityRegistry public entityRegistry; + ICollateralAdapter public collateralAdapter; + IeMoneyJoin public eMoneyJoin; + + // Token mappings + mapping(address => address) public depositTokens; // asset => DepositToken + mapping(address => address) public debtTokens; // currency => DebtToken + + constructor( + address owner_, + address entity_, + address ledger_, + address entityRegistry_, + address collateralAdapter_, + address eMoneyJoin_ + ) { + owner = owner_; + entity = entity_; + ledger = ILedger(ledger_); + entityRegistry = IRegulatedEntityRegistry(entityRegistry_); + collateralAdapter = ICollateralAdapter(collateralAdapter_); + eMoneyJoin = IeMoneyJoin(eMoneyJoin_); + + _grantRole(DEFAULT_ADMIN_ROLE, owner_); + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); // Factory can set tokens during creation + } + + /** + * @notice Set deposit token for an asset + * @param asset Asset address + * @param depositToken Deposit token address + */ + function setDepositToken(address asset, address depositToken) external onlyRole(DEFAULT_ADMIN_ROLE) { + depositTokens[asset] = depositToken; + } + + /** + * @notice Set debt token for a currency + * @param currency Currency address + * @param debtToken Debt token address + */ + function setDebtToken(address currency, address debtToken) external onlyRole(DEFAULT_ADMIN_ROLE) { + debtTokens[currency] = debtToken; + } + + /** + * @notice Deposit M0 collateral into vault + * @param asset Collateral asset address (address(0) for native ETH) + * @param amount Amount to deposit + */ + function deposit(address asset, uint256 amount) external payable override nonReentrant { + require(amount > 0, "Vault: zero amount"); + require( + entityRegistry.isEligible(entity) && + (entityRegistry.isAuthorized(entity, msg.sender) || + entityRegistry.isOperator(entity, msg.sender) || + msg.sender == owner), + "Vault: not authorized" + ); + + if (asset == address(0)) { + require(msg.value == amount, "Vault: value mismatch"); + } else { + require(msg.value == 0, "Vault: unexpected ETH"); + IERC20(asset).safeTransferFrom(msg.sender, address(collateralAdapter), amount); + } + + // Deposit via adapter + collateralAdapter.deposit{value: asset == address(0) ? amount : 0}(address(this), asset, amount); + + // Mint deposit token + address depositToken = depositTokens[asset]; + if (depositToken != address(0)) { + DepositToken(depositToken).mint(msg.sender, amount); + } + + emit Deposited(asset, amount, msg.sender); + } + + /** + * @notice Borrow eMoney against collateral + * @param currency eMoney currency address + * @param amount Amount to borrow + */ + function borrow(address currency, uint256 amount) external override nonReentrant { + require(amount > 0, "Vault: zero amount"); + require( + entityRegistry.isEligible(entity) && + (entityRegistry.isAuthorized(entity, msg.sender) || + entityRegistry.isOperator(entity, msg.sender) || + msg.sender == owner), + "Vault: not authorized" + ); + + // Check if borrow is allowed + (bool canBorrow, bytes32 reasonCode) = ledger.canBorrow(address(this), currency, amount); + require(canBorrow, string(abi.encodePacked("Vault: borrow not allowed: ", reasonCode))); + + // Update debt in ledger + ledger.modifyDebt(address(this), currency, int256(amount)); + + // Mint debt token + address debtToken = debtTokens[currency]; + if (debtToken != address(0)) { + DebtToken(debtToken).mint(msg.sender, amount); + } + + // Mint eMoney to borrower + eMoneyJoin.mint(currency, msg.sender, amount); + + emit Borrowed(currency, amount, msg.sender); + } + + /** + * @notice Repay borrowed eMoney + * @param currency eMoney currency address + * @param amount Amount to repay + */ + function repay(address currency, uint256 amount) external override nonReentrant { + require(amount > 0, "Vault: zero amount"); + + uint256 currentDebt = ledger.debt(address(this), currency); + require(currentDebt > 0, "Vault: no debt"); + + // Burn eMoney from repayer + eMoneyJoin.burn(currency, msg.sender, amount); + + // Update debt in ledger + uint256 repayAmount = amount > currentDebt ? currentDebt : amount; + ledger.modifyDebt(address(this), currency, -int256(repayAmount)); + + // Burn debt token + address debtToken = debtTokens[currency]; + if (debtToken != address(0)) { + uint256 debtTokenBalance = DebtToken(debtToken).balanceOf(msg.sender); + uint256 burnAmount = repayAmount > debtTokenBalance ? debtTokenBalance : repayAmount; + DebtToken(debtToken).burn(msg.sender, burnAmount); + } + + emit Repaid(currency, repayAmount, msg.sender); + } + + /** + * @notice Withdraw collateral from vault + * @param asset Collateral asset address + * @param amount Amount to withdraw + */ + function withdraw(address asset, uint256 amount) external override nonReentrant { + require(amount > 0, "Vault: zero amount"); + require( + entityRegistry.isEligible(entity) && + (entityRegistry.isAuthorized(entity, msg.sender) || + entityRegistry.isOperator(entity, msg.sender) || + msg.sender == owner), + "Vault: not authorized" + ); + + // Check vault health after withdrawal + uint256 collateralBalance = ledger.collateral(address(this), asset); + require(collateralBalance >= amount, "Vault: insufficient collateral"); + + // Check if withdrawal would make vault unsafe + // Simplified check - in production would calculate health after withdrawal + (uint256 healthRatio, , ) = ledger.getVaultHealth(address(this)); + require(healthRatio >= 11000, "Vault: withdrawal would make vault unsafe"); // 110% minimum + + // Burn deposit token + address depositToken = depositTokens[asset]; + if (depositToken != address(0)) { + uint256 depositTokenBalance = DepositToken(depositToken).balanceOf(msg.sender); + require(depositTokenBalance >= amount, "Vault: insufficient deposit tokens"); + DepositToken(depositToken).burn(msg.sender, amount); + } + + // Withdraw via adapter + collateralAdapter.withdraw(address(this), asset, amount); + + emit Withdrawn(asset, amount, msg.sender); + } + + /** + * @notice Get vault health + * @return healthRatio Collateralization ratio in basis points + * @return collateralValue Total collateral value in XAU + * @return debtValue Total debt value in XAU + */ + function getHealth() external view override returns ( + uint256 healthRatio, + uint256 collateralValue, + uint256 debtValue + ) { + return ledger.getVaultHealth(address(this)); + } + + /// @notice Accept ETH from CollateralAdapter withdraw + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/VaultFactory.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/VaultFactory.sol new file mode 100644 index 0000000..887c00f --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/VaultFactory.sol @@ -0,0 +1,253 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import "./Vault.sol"; +import "./tokens/DepositToken.sol"; +import "./tokens/DebtToken.sol"; +import "./interfaces/ILedger.sol"; + +/** + * @title VaultFactory + * @notice Factory for creating vault instances with associated tokens + * @dev Creates Vault, DepositToken, and DebtToken instances + */ +contract VaultFactory is AccessControl { + bytes32 public constant VAULT_DEPLOYER_ROLE = keccak256("VAULT_DEPLOYER_ROLE"); + + address public immutable vaultImplementation; + address public immutable depositTokenImplementation; + address public immutable debtTokenImplementation; + + ILedger public ledger; + address public entityRegistry; + address public collateralAdapter; + address public eMoneyJoin; + + mapping(address => address[]) public vaultsByEntity; // entity => vaults[] + mapping(address => address) public vaultToEntity; // vault => entity + + event VaultCreated( + address indexed vault, + address indexed entity, + address indexed owner, + address depositToken, + address debtToken + ); + + constructor( + address admin, + address vaultImplementation_, + address depositTokenImplementation_, + address debtTokenImplementation_, + address ledger_, + address entityRegistry_, + address collateralAdapter_, + address eMoneyJoin_ + ) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(VAULT_DEPLOYER_ROLE, admin); + + vaultImplementation = vaultImplementation_; + depositTokenImplementation = depositTokenImplementation_; + debtTokenImplementation = debtTokenImplementation_; + ledger = ILedger(ledger_); + entityRegistry = entityRegistry_; + collateralAdapter = collateralAdapter_; + eMoneyJoin = eMoneyJoin_; + } + + /** + * @notice Create a new vault for a regulated entity + * @param owner Vault owner address + * @param entity Regulated entity address + * @param asset Collateral asset address (for deposit token) + * @param currency eMoney currency address (for debt token) + * @return vault Address of created vault + * @return depositToken Address of deposit token + * @return debtToken Address of debt token + */ + function createVault( + address owner, + address entity, + address asset, + address currency + ) external onlyRole(VAULT_DEPLOYER_ROLE) returns ( + address vault, + address depositToken, + address debtToken + ) { + require(owner != address(0), "VaultFactory: zero owner"); + require(entity != address(0), "VaultFactory: zero entity"); + + // Deploy vault directly (not using proxy for simplicity) + // In production, could use proxy pattern for upgradeability + Vault vaultContract = new Vault( + owner, + entity, + address(ledger), + entityRegistry, + collateralAdapter, + eMoneyJoin + ); + vault = address(vaultContract); + + // Deploy deposit token (factory as admin so it can grant MINTER/BURNER to vault) + bytes memory depositTokenInitData = abi.encodeWithSelector( + DepositToken.initialize.selector, + string(abi.encodePacked("Deposit ", _getAssetSymbol(asset))), + string(abi.encodePacked("d", _getAssetSymbol(asset))), + vault, + asset, + address(this) + ); + + ERC1967Proxy depositTokenProxy = new ERC1967Proxy(depositTokenImplementation, depositTokenInitData); + depositToken = address(depositTokenProxy); + + // Grant minter/burner roles to vault + DepositToken(depositToken).grantRole(keccak256("MINTER_ROLE"), vault); + DepositToken(depositToken).grantRole(keccak256("BURNER_ROLE"), vault); + + // Deploy debt token (factory as admin so it can grant MINTER/BURNER to vault) + bytes memory debtTokenInitData = abi.encodeWithSelector( + DebtToken.initialize.selector, + string(abi.encodePacked("Debt ", _getCurrencySymbol(currency))), + string(abi.encodePacked("debt", _getCurrencySymbol(currency))), + vault, + currency, + address(this) + ); + + ERC1967Proxy debtTokenProxy = new ERC1967Proxy(debtTokenImplementation, debtTokenInitData); + debtToken = address(debtTokenProxy); + + // Grant minter/burner roles to vault + DebtToken(debtToken).grantRole(keccak256("MINTER_ROLE"), vault); + DebtToken(debtToken).grantRole(keccak256("BURNER_ROLE"), vault); + + // Configure vault with tokens (cast via payable since Vault has receive()) + Vault(payable(vault)).setDepositToken(asset, depositToken); + Vault(payable(vault)).setDebtToken(currency, debtToken); + + // Grant vault role in ledger + ledger.grantVaultRole(vault); + + // Track vault + vaultsByEntity[entity].push(vault); + vaultToEntity[vault] = entity; + + emit VaultCreated(vault, entity, owner, depositToken, debtToken); + } + + /** + * @notice Create a vault with explicit decimals and debt transferability (DEX-ready) + * @param depositDecimals Deposit token decimals (e.g. 6 for stablecoins; 0 = 18) + * @param debtDecimals Debt token decimals (0 = 18) + * @param debtTransferable If true, debt token is freely transferable (DEX-ready) + */ + function createVaultWithDecimals( + address owner, + address entity, + address asset, + address currency, + uint8 depositDecimals, + uint8 debtDecimals, + bool debtTransferable + ) external onlyRole(VAULT_DEPLOYER_ROLE) returns ( + address vault, + address depositToken, + address debtToken + ) { + require(owner != address(0), "VaultFactory: zero owner"); + require(entity != address(0), "VaultFactory: zero entity"); + + Vault vaultContract = new Vault( + owner, + entity, + address(ledger), + entityRegistry, + collateralAdapter, + eMoneyJoin + ); + vault = address(vaultContract); + + uint8 dDec = depositDecimals > 0 ? depositDecimals : 18; + bytes memory depositTokenInitData = abi.encodeWithSelector( + DepositToken.initializeWithDecimals.selector, + string(abi.encodePacked("Deposit ", _getAssetSymbol(asset))), + string(abi.encodePacked("d", _getAssetSymbol(asset))), + vault, + asset, + address(this), + dDec + ); + + ERC1967Proxy depositTokenProxy = new ERC1967Proxy(depositTokenImplementation, depositTokenInitData); + depositToken = address(depositTokenProxy); + + DepositToken(depositToken).grantRole(keccak256("MINTER_ROLE"), vault); + DepositToken(depositToken).grantRole(keccak256("BURNER_ROLE"), vault); + + uint8 debtDec = debtDecimals > 0 ? debtDecimals : 18; + bytes memory debtTokenInitData = abi.encodeWithSelector( + DebtToken.initializeFull.selector, + string(abi.encodePacked("Debt ", _getCurrencySymbol(currency))), + string(abi.encodePacked("debt", _getCurrencySymbol(currency))), + vault, + currency, + address(this), + debtDec, + debtTransferable + ); + + ERC1967Proxy debtTokenProxy = new ERC1967Proxy(debtTokenImplementation, debtTokenInitData); + debtToken = address(debtTokenProxy); + + DebtToken(debtToken).grantRole(keccak256("MINTER_ROLE"), vault); + DebtToken(debtToken).grantRole(keccak256("BURNER_ROLE"), vault); + + Vault(payable(vault)).setDepositToken(asset, depositToken); + Vault(payable(vault)).setDebtToken(currency, debtToken); + + ledger.grantVaultRole(vault); + + vaultsByEntity[entity].push(vault); + vaultToEntity[vault] = entity; + + emit VaultCreated(vault, entity, owner, depositToken, debtToken); + } + + /** + * @notice Get asset symbol (helper) + * @param asset Asset address + * @return symbol Asset symbol + */ + function _getAssetSymbol(address asset) internal pure returns (string memory symbol) { + if (asset == address(0)) { + return "ETH"; + } + // In production, would fetch from ERC20 + return "ASSET"; + } + + /** + * @notice Get currency symbol (helper) + * @param currency Currency address + * @return symbol Currency symbol + */ + function _getCurrencySymbol(address currency) internal pure returns (string memory symbol) { + // In production, would fetch from eMoney token + return "CURRENCY"; + } + + /** + * @notice Get vaults for an entity + * @param entity Entity address + * @return vaults Array of vault addresses + */ + function getVaultsByEntity(address entity) external view returns (address[] memory vaults) { + return vaultsByEntity[entity]; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/XAUOracle.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/XAUOracle.sol new file mode 100644 index 0000000..be56788 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/XAUOracle.sol @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "./interfaces/IXAUOracle.sol"; +import "../oracle/IAggregator.sol"; + +/** + * @title XAUOracle + * @notice Multi-source oracle aggregator for ETH/XAU pricing with safety margins + * @dev Aggregates prices from multiple Aggregator feeds + * + * COMPLIANCE NOTES: + * - XAU (Gold) is the ISO 4217 commodity code used as universal unit of account + * - All currency conversions in the system MUST triangulate through XAU + * - XAU is NOT legal tender, but serves as the normalization standard + */ +contract XAUOracle is IXAUOracle, AccessControl, Pausable { + bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); + bytes32 public constant FEED_MANAGER_ROLE = keccak256("FEED_MANAGER_ROLE"); + + struct PriceFeed { + address feed; + uint256 weight; // in basis points (10000 = 100%) + bool active; + } + + PriceFeed[] private _priceFeeds; + mapping(address => uint256) private _feedIndex; // feed address => index + 1 (0 means not found) + mapping(address => bool) private _isFeed; + + uint256 public constant BASIS_POINTS = 10000; + uint256 public constant SAFETY_MARGIN_BPS = 500; // 5% safety margin for liquidations + uint256 public constant PRICE_DECIMALS = 18; + + uint256 private _lastPrice; + uint256 private _lastUpdate; + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(ADMIN_ROLE, admin); + _grantRole(FEED_MANAGER_ROLE, admin); + } + + /** + * @notice Get ETH price in XAU + * @return price ETH price in XAU (18 decimals) + * @return timestamp Last update timestamp + */ + function getETHPriceInXAU() external view override returns (uint256 price, uint256 timestamp) { + require(!paused(), "XAUOracle: paused"); + require(_lastUpdate > 0, "XAUOracle: no price data"); + + return (_lastPrice, _lastUpdate); + } + + /** + * @notice Get liquidation price for a vault (with safety margin) + * @param vault Vault address (not used in current implementation, reserved for future use) + * @return price Liquidation threshold price in XAU + */ + function getLiquidationPrice(address vault) external view override returns (uint256 price) { + require(!paused(), "XAUOracle: paused"); + require(_lastUpdate > 0, "XAUOracle: no price data"); + + // Apply safety margin: liquidation price = current price * (1 - safety margin) + price = (_lastPrice * (BASIS_POINTS - SAFETY_MARGIN_BPS)) / BASIS_POINTS; + } + + /** + * @notice Update price from aggregated feeds + * @dev Can be called by anyone, but typically called by keeper + */ + function updatePrice() external whenNotPaused { + require(_priceFeeds.length > 0, "XAUOracle: no feeds"); + + uint256 totalWeight = 0; + uint256 weightedSum = 0; + + for (uint256 i = 0; i < _priceFeeds.length; i++) { + if (!_priceFeeds[i].active) continue; + + IAggregator feed = IAggregator(_priceFeeds[i].feed); + (, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData(); + + require(answer > 0, "XAUOracle: invalid price"); + require(updatedAt > 0, "XAUOracle: stale price"); + + // Check price staleness (30 seconds) + require(block.timestamp - updatedAt <= 30, "XAUOracle: stale price"); + + uint256 price = uint256(answer); + // Convert from feed decimals to 18 decimals + uint8 feedDecimals = feed.decimals(); + if (feedDecimals < PRICE_DECIMALS) { + price = price * (10 ** (PRICE_DECIMALS - feedDecimals)); + } else if (feedDecimals > PRICE_DECIMALS) { + price = price / (10 ** (feedDecimals - PRICE_DECIMALS)); + } + + weightedSum += price * _priceFeeds[i].weight; + totalWeight += _priceFeeds[i].weight; + } + + require(totalWeight > 0, "XAUOracle: no active feeds"); + + uint256 aggregatedPrice = weightedSum / totalWeight; + _lastPrice = aggregatedPrice; + _lastUpdate = block.timestamp; + + emit PriceUpdated(aggregatedPrice, block.timestamp); + } + + /** + * @notice Add a price feed source + * @param feed Price feed address (must implement Aggregator interface) + * @param weight Weight for this feed (in basis points) + */ + function addPriceFeed(address feed, uint256 weight) external onlyRole(FEED_MANAGER_ROLE) { + require(feed != address(0), "XAUOracle: zero feed"); + require(weight > 0 && weight <= BASIS_POINTS, "XAUOracle: invalid weight"); + require(!_isFeed[feed], "XAUOracle: feed already exists"); + + _priceFeeds.push(PriceFeed({ + feed: feed, + weight: weight, + active: true + })); + _feedIndex[feed] = _priceFeeds.length; // index + 1 + _isFeed[feed] = true; + + emit PriceFeedAdded(feed, weight); + } + + /** + * @notice Remove a price feed source + * @param feed Price feed address to remove + */ + function removePriceFeed(address feed) external onlyRole(FEED_MANAGER_ROLE) { + require(_isFeed[feed], "XAUOracle: feed not found"); + + uint256 index = _feedIndex[feed] - 1; + _priceFeeds[index].active = false; + _isFeed[feed] = false; + _feedIndex[feed] = 0; + + emit PriceFeedRemoved(feed); + } + + /** + * @notice Update feed weight + * @param feed Price feed address + * @param weight New weight + */ + function updateFeedWeight(address feed, uint256 weight) external onlyRole(FEED_MANAGER_ROLE) { + require(_isFeed[feed], "XAUOracle: feed not found"); + require(weight > 0 && weight <= BASIS_POINTS, "XAUOracle: invalid weight"); + + uint256 index = _feedIndex[feed] - 1; + uint256 oldWeight = _priceFeeds[index].weight; + _priceFeeds[index].weight = weight; + + emit FeedWeightUpdated(feed, oldWeight, weight); + } + + /** + * @notice Freeze oracle (emergency) + */ + function freeze() external onlyRole(ADMIN_ROLE) { + _pause(); + emit OracleFrozen(block.timestamp); + } + + /** + * @notice Unfreeze oracle + */ + function unfreeze() external onlyRole(ADMIN_ROLE) { + _unpause(); + emit OracleUnfrozen(block.timestamp); + } + + /** + * @notice Check if oracle is frozen + * @return frozen True if frozen + */ + function isFrozen() external view override returns (bool) { + return paused(); + } + + /** + * @notice Get all price feeds + * @return feeds Array of price feed structs + */ + function getPriceFeeds() external view returns (PriceFeed[] memory feeds) { + return _priceFeeds; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/adapters/CollateralAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/adapters/CollateralAdapter.sol new file mode 100644 index 0000000..f21a55a --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/adapters/CollateralAdapter.sol @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../interfaces/ICollateralAdapter.sol"; +import "../interfaces/ILedger.sol"; + +/** + * @title CollateralAdapter + * @notice Handles M0 collateral deposits and withdrawals + * @dev Only callable by Vaults, only accepts approved assets + */ +contract CollateralAdapter is ICollateralAdapter, AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant VAULT_ROLE = keccak256("VAULT_ROLE"); + bytes32 public constant LIQUIDATOR_ROLE = keccak256("LIQUIDATOR_ROLE"); + + ILedger public ledger; + mapping(address => bool) public approvedAssets; + + constructor(address admin, address ledger_) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + ledger = ILedger(ledger_); + } + + /** + * @notice Deposit M0 collateral + * @param vault Vault address + * @param asset Collateral asset address (address(0) for native ETH) + * @param amount Amount to deposit + */ + function deposit(address vault, address asset, uint256 amount) external payable override nonReentrant onlyRole(VAULT_ROLE) { + require(approvedAssets[asset] || asset == address(0), "CollateralAdapter: asset not approved"); + require(amount > 0, "CollateralAdapter: zero amount"); + + if (asset == address(0)) { + // Native ETH deposit + require(msg.value == amount, "CollateralAdapter: value mismatch"); + // ETH is held by this contract + } else { + // ERC20 token deposit + require(msg.value == 0, "CollateralAdapter: unexpected ETH"); + IERC20(asset).safeTransferFrom(msg.sender, address(this), amount); + } + + // Update ledger + ledger.modifyCollateral(vault, asset, int256(amount)); + + emit CollateralDeposited(vault, asset, amount); + } + + /** + * @notice Withdraw M0 collateral + * @param vault Vault address + * @param asset Collateral asset address + * @param amount Amount to withdraw + */ + function withdraw(address vault, address asset, uint256 amount) external override nonReentrant onlyRole(VAULT_ROLE) { + require(amount > 0, "CollateralAdapter: zero amount"); + + // Update ledger (will revert if insufficient collateral) + ledger.modifyCollateral(vault, asset, -int256(amount)); + + if (asset == address(0)) { + // Native ETH withdrawal + (bool success, ) = payable(vault).call{value: amount}(""); + require(success, "CollateralAdapter: ETH transfer failed"); + } else { + // ERC20 token withdrawal + IERC20(asset).safeTransfer(vault, amount); + } + + emit CollateralWithdrawn(vault, asset, amount); + } + + /** + * @notice Seize collateral during liquidation + * @param vault Vault address + * @param asset Collateral asset address + * @param amount Amount to seize + * @param liquidator Liquidator address + */ + function seize(address vault, address asset, uint256 amount, address liquidator) external override nonReentrant onlyRole(LIQUIDATOR_ROLE) { + require(amount > 0, "CollateralAdapter: zero amount"); + require(liquidator != address(0), "CollateralAdapter: zero liquidator"); + + // Update ledger + ledger.modifyCollateral(vault, asset, -int256(amount)); + + if (asset == address(0)) { + // Native ETH seizure + (bool success, ) = payable(liquidator).call{value: amount}(""); + require(success, "CollateralAdapter: ETH transfer failed"); + } else { + // ERC20 token seizure + IERC20(asset).safeTransfer(liquidator, amount); + } + + emit CollateralSeized(vault, asset, amount, liquidator); + } + + /** + * @notice Approve an asset for collateral + * @param asset Asset address + */ + function approveAsset(address asset) external onlyRole(DEFAULT_ADMIN_ROLE) { + approvedAssets[asset] = true; + } + + /** + * @notice Revoke asset approval + * @param asset Asset address + */ + function revokeAsset(address asset) external onlyRole(DEFAULT_ADMIN_ROLE) { + approvedAssets[asset] = false; + } + + /** + * @notice Set ledger address + * @param ledger_ New ledger address + */ + function setLedger(address ledger_) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(ledger_ != address(0), "CollateralAdapter: zero address"); + ledger = ILedger(ledger_); + } + + // Allow contract to receive ETH + receive() external payable {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/adapters/PMMPriceProvider.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/adapters/PMMPriceProvider.sol new file mode 100644 index 0000000..c5bb062 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/adapters/PMMPriceProvider.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "../../dex/DODOPMMIntegration.sol"; + +/** + * @title PMMPriceProvider + * @notice Provides asset price in quote token using DODO PMM pool (oracle-backed when configured) + * @dev Used for vault collateral valuation or off-chain reporting when asset is a PMM pair token. + * Ledger uses XAUOracle for primary valuation; this adapter can be used by a future + * Ledger extension or by keepers/UIs to get PMM-based price (e.g. cUSDT/cUSDC in USD terms). + */ +contract PMMPriceProvider { + DODOPMMIntegration public immutable pmmIntegration; + + constructor(address pmmIntegration_) { + require(pmmIntegration_ != address(0), "PMMPriceProvider: zero address"); + pmmIntegration = DODOPMMIntegration(pmmIntegration_); + } + + /** + * @notice Get price of asset in terms of quoteToken (18 decimals: quoteToken per 1 unit of asset) + * @param asset Asset to price (e.g. cUSDT) + * @param quoteToken Quote token (e.g. USDT or cUSDC) + * @return price Price in 18 decimals (1e18 = 1:1 for stablecoins); 0 if no pool + */ + function getPrice(address asset, address quoteToken) external view returns (uint256 price) { + if (asset == quoteToken) return 1e18; + + address pool = pmmIntegration.pools(asset, quoteToken); + if (pool == address(0)) { + pool = pmmIntegration.pools(quoteToken, asset); + if (pool == address(0)) return 0; + // asset is quote, quoteToken is base: price = 1e36 / basePerQuote + uint256 basePerQuote = pmmIntegration.getPoolPriceOrOracle(pool); + if (basePerQuote == 0) return 0; + return (1e36) / basePerQuote; + } + // asset is base, quoteToken is quote + return pmmIntegration.getPoolPriceOrOracle(pool); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/adapters/eMoneyJoin.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/adapters/eMoneyJoin.sol new file mode 100644 index 0000000..1eb11d7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/adapters/eMoneyJoin.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../interfaces/IeMoneyJoin.sol"; +import "../../emoney/interfaces/IeMoneyToken.sol"; + +/** + * @title eMoneyJoin + * @notice Adapter for minting and burning eMoney tokens + * @dev Mint/burn restricted to this adapter, transfer restricted via Compliance Registry + */ +contract eMoneyJoin is IeMoneyJoin, AccessControl, ReentrancyGuard { + bytes32 public constant VAULT_ROLE = keccak256("VAULT_ROLE"); + + mapping(address => bool) public approvedCurrencies; + + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + /** + * @notice Mint eMoney to a borrower + * @param currency eMoney currency address + * @param to Recipient address + * @param amount Amount to mint + */ + function mint(address currency, address to, uint256 amount) external override nonReentrant onlyRole(VAULT_ROLE) { + require(approvedCurrencies[currency], "eMoneyJoin: currency not approved"); + require(to != address(0), "eMoneyJoin: zero address"); + require(amount > 0, "eMoneyJoin: zero amount"); + + IeMoneyToken token = IeMoneyToken(currency); + token.mint(to, amount, keccak256("VAULT_BORROW")); + + emit eMoneyMinted(currency, to, amount); + } + + /** + * @notice Burn eMoney from a repayer + * @param currency eMoney currency address + * @param from Source address + * @param amount Amount to burn + */ + function burn(address currency, address from, uint256 amount) external override nonReentrant onlyRole(VAULT_ROLE) { + require(approvedCurrencies[currency], "eMoneyJoin: currency not approved"); + require(amount > 0, "eMoneyJoin: zero amount"); + + IeMoneyToken token = IeMoneyToken(currency); + token.burn(from, amount, keccak256("VAULT_REPAY")); + + emit eMoneyBurned(currency, from, amount); + } + + /** + * @notice Approve a currency for eMoney operations + * @param currency Currency address + */ + function approveCurrency(address currency) external onlyRole(DEFAULT_ADMIN_ROLE) { + approvedCurrencies[currency] = true; + } + + /** + * @notice Revoke currency approval + * @param currency Currency address + */ + function revokeCurrency(address currency) external onlyRole(DEFAULT_ADMIN_ROLE) { + approvedCurrencies[currency] = false; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/errors/VaultErrors.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/errors/VaultErrors.sol new file mode 100644 index 0000000..327f1ad --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/errors/VaultErrors.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @notice Custom errors for vault system + */ +error ZeroAddress(); +error ZeroAmount(); +error AssetNotRegistered(); +error AssetNotApproved(); +error CurrencyNotApproved(); +error InsufficientCollateral(); +error InsufficientDebt(); +error InsufficientDepositTokens(); +error BorrowNotAllowed(bytes32 reasonCode); +error VaultNotLiquidatable(); +error EntityNotRegistered(); +error EntitySuspended(); +error NotAuthorized(); +error NotEligible(); +error BelowMinCollateralization(); +error DebtCeilingExceeded(); +error InvalidLiquidationRatio(); +error InvalidCreditMultiplier(); +error InvalidWeight(); +error FeedNotFound(); +error StalePrice(); +error InvalidPrice(); +error Paused(); diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/ICollateralAdapter.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/ICollateralAdapter.sol new file mode 100644 index 0000000..367ab94 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/ICollateralAdapter.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ICollateralAdapter + * @notice Interface for Collateral Adapter + * @dev Handles M0 collateral deposits and withdrawals + */ +interface ICollateralAdapter { + /** + * @notice Deposit M0 collateral + * @param vault Vault address + * @param asset Collateral asset address + * @param amount Amount to deposit + */ + function deposit(address vault, address asset, uint256 amount) external payable; + + /** + * @notice Withdraw M0 collateral + * @param vault Vault address + * @param asset Collateral asset address + * @param amount Amount to withdraw + */ + function withdraw(address vault, address asset, uint256 amount) external; + + /** + * @notice Seize collateral during liquidation + * @param vault Vault address + * @param asset Collateral asset address + * @param amount Amount to seize + * @param liquidator Liquidator address + */ + function seize(address vault, address asset, uint256 amount, address liquidator) external; + + event CollateralDeposited(address indexed vault, address indexed asset, uint256 amount); + event CollateralWithdrawn(address indexed vault, address indexed asset, uint256 amount); + event CollateralSeized(address indexed vault, address indexed asset, uint256 amount, address indexed liquidator); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/ILedger.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/ILedger.sol new file mode 100644 index 0000000..413c8f6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/ILedger.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ILedger + * @notice Interface for the Core Ledger contract + * @dev Single source of truth for collateral and debt balances + */ +interface ILedger { + /** + * @notice Modify collateral balance for a vault + * @param vault Vault address + * @param asset Collateral asset address + * @param delta Amount to add (positive) or subtract (negative) + */ + function modifyCollateral(address vault, address asset, int256 delta) external; + + /** + * @notice Modify debt balance for a vault + * @param vault Vault address + * @param currency Debt currency address (eMoney token) + * @param delta Amount to add (positive) or subtract (negative) + */ + function modifyDebt(address vault, address currency, int256 delta) external; + + /** + * @notice Get vault health (collateralization ratio in XAU) + * @param vault Vault address + * @return healthRatio Collateralization ratio in basis points (10000 = 100%) + * @return collateralValue Total collateral value in XAU (18 decimals) + * @return debtValue Total debt value in XAU (18 decimals) + */ + function getVaultHealth(address vault) external view returns ( + uint256 healthRatio, + uint256 collateralValue, + uint256 debtValue + ); + + /** + * @notice Check if a vault can borrow a specific amount + * @param vault Vault address + * @param currency Debt currency address + * @param amount Amount to borrow (in currency units) + * @return canBorrow True if borrow is allowed + * @return reasonCode Reason code if borrow is not allowed + */ + function canBorrow(address vault, address currency, uint256 amount) external view returns ( + bool canBorrow, + bytes32 reasonCode + ); + + /** + * @notice Get collateral balance for a vault + * @param vault Vault address + * @param asset Collateral asset address + * @return balance Collateral balance + */ + function collateral(address vault, address asset) external view returns (uint256); + + /** + * @notice Get debt balance for a vault + * @param vault Vault address + * @param currency Debt currency address + * @return balance Debt balance + */ + function debt(address vault, address currency) external view returns (uint256); + + /** + * @notice Get debt ceiling for an asset + * @param asset Asset address + * @return ceiling Debt ceiling + */ + function debtCeiling(address asset) external view returns (uint256); + + /** + * @notice Get liquidation ratio for an asset + * @param asset Asset address + * @return ratio Liquidation ratio in basis points + */ + function liquidationRatio(address asset) external view returns (uint256); + + /** + * @notice Get credit multiplier for an asset + * @param asset Asset address + * @return multiplier Credit multiplier in basis points (50000 = 5x) + */ + function creditMultiplier(address asset) external view returns (uint256); + + /** + * @notice Get rate accumulator for an asset + * @param asset Asset address + * @return accumulator Rate accumulator + */ + function rateAccumulator(address asset) external view returns (uint256); + + /** + * @notice Set risk parameters for an asset + * @param asset Asset address + * @param debtCeiling_ Debt ceiling + * @param liquidationRatio_ Liquidation ratio in basis points + * @param creditMultiplier_ Credit multiplier in basis points + */ + function setRiskParameters( + address asset, + uint256 debtCeiling_, + uint256 liquidationRatio_, + uint256 creditMultiplier_ + ) external; + + /** + * @notice Grant VAULT_ROLE to an address (for factory use) + * @param account Address to grant role to + */ + function grantVaultRole(address account) external; + + event CollateralModified(address indexed vault, address indexed asset, int256 delta); + event DebtModified(address indexed vault, address indexed currency, int256 delta); + event RiskParametersSet(address indexed asset, uint256 debtCeiling, uint256 liquidationRatio, uint256 creditMultiplier); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/ILiquidation.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/ILiquidation.sol new file mode 100644 index 0000000..529011b --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/ILiquidation.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title ILiquidation + * @notice Interface for Liquidation Module + * @dev Handles liquidation of undercollateralized vaults + */ +interface ILiquidation { + /** + * @notice Liquidate an undercollateralized vault + * @param vault Vault address to liquidate + * @param currency Debt currency address + * @param maxDebt Maximum debt to liquidate + * @return seizedCollateral Amount of collateral seized + * @return repaidDebt Amount of debt repaid + */ + function liquidate( + address vault, + address currency, + uint256 maxDebt + ) external returns (uint256 seizedCollateral, uint256 repaidDebt); + + /** + * @notice Check if a vault can be liquidated + * @param vault Vault address + * @return canLiquidate True if vault can be liquidated + * @return healthRatio Current health ratio in basis points + */ + function canLiquidate(address vault) external view returns (bool canLiquidate, uint256 healthRatio); + + /** + * @notice Get liquidation bonus (penalty) + * @return bonus Liquidation bonus in basis points + */ + function liquidationBonus() external view returns (uint256); + + event VaultLiquidated( + address indexed vault, + address indexed currency, + uint256 seizedCollateral, + uint256 repaidDebt, + address indexed liquidator + ); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IRateAccrual.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IRateAccrual.sol new file mode 100644 index 0000000..7dc3680 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IRateAccrual.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IRateAccrual + * @notice Interface for Rate & Accrual Module + * @dev Applies time-based interest to outstanding debt + */ +interface IRateAccrual { + /** + * @notice Accrue interest for an asset + * @param asset Asset address + * @return newAccumulator Updated rate accumulator + */ + function accrueInterest(address asset) external returns (uint256 newAccumulator); + + /** + * @notice Get current rate accumulator for an asset + * @param asset Asset address + * @return accumulator Current rate accumulator + */ + function getRateAccumulator(address asset) external view returns (uint256 accumulator); + + /** + * @notice Set interest rate for an asset + * @param asset Asset address + * @param rate Annual interest rate in basis points (e.g., 500 = 5%) + */ + function setInterestRate(address asset, uint256 rate) external; + + /** + * @notice Get interest rate for an asset + * @param asset Asset address + * @return rate Annual interest rate in basis points + */ + function interestRate(address asset) external view returns (uint256); + + /** + * @notice Calculate debt with accrued interest + * @param asset Asset address + * @param principal Principal debt amount + * @return debtWithInterest Debt amount with accrued interest + */ + function calculateDebtWithInterest(address asset, uint256 principal) external view returns (uint256 debtWithInterest); + + event InterestAccrued(address indexed asset, uint256 oldAccumulator, uint256 newAccumulator); + event InterestRateSet(address indexed asset, uint256 rate); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IRegulatedEntityRegistry.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IRegulatedEntityRegistry.sol new file mode 100644 index 0000000..5fb0cc7 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IRegulatedEntityRegistry.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IRegulatedEntityRegistry + * @notice Interface for Regulated Entity Registry + * @dev Tracks regulated financial entities eligible for vault operations + */ +interface IRegulatedEntityRegistry { + /** + * @notice Register a regulated entity + * @param entity Entity address + * @param jurisdictionHash Hash of jurisdiction identifier + * @param authorizedWallets Initial authorized wallets + */ + function registerEntity( + address entity, + bytes32 jurisdictionHash, + address[] calldata authorizedWallets + ) external; + + /** + * @notice Check if an entity is registered and eligible + * @param entity Entity address + * @return isEligible True if entity is registered and not suspended + */ + function isEligible(address entity) external view returns (bool); + + /** + * @notice Check if a wallet is authorized for an entity + * @param entity Entity address + * @param wallet Wallet address + * @return isAuthorized True if wallet is authorized + */ + function isAuthorized(address entity, address wallet) external view returns (bool); + + /** + * @notice Check if an address is an operator for an entity + * @param entity Entity address + * @param operator Operator address + * @return isOperator True if address is an operator + */ + function isOperator(address entity, address operator) external view returns (bool); + + /** + * @notice Add authorized wallet to an entity + * @param entity Entity address + * @param wallet Wallet address to authorize + */ + function addAuthorizedWallet(address entity, address wallet) external; + + /** + * @notice Remove authorized wallet from an entity + * @param entity Entity address + * @param wallet Wallet address to remove + */ + function removeAuthorizedWallet(address entity, address wallet) external; + + /** + * @notice Set operator status for an entity + * @param entity Entity address + * @param operator Operator address + * @param status True to grant operator status, false to revoke + */ + function setOperator(address entity, address operator, bool status) external; + + /** + * @notice Suspend an entity + * @param entity Entity address + */ + function suspendEntity(address entity) external; + + /** + * @notice Unsuspend an entity + * @param entity Entity address + */ + function unsuspendEntity(address entity) external; + + /** + * @notice Get entity information + * @param entity Entity address + * @return registered True if entity is registered + * @return suspended True if entity is suspended + * @return jurisdictionHash Jurisdiction hash + * @return authorizedWallets List of authorized wallets + */ + function getEntity(address entity) external view returns ( + bool registered, + bool suspended, + bytes32 jurisdictionHash, + address[] memory authorizedWallets + ); + + event EntityRegistered(address indexed entity, bytes32 jurisdictionHash, uint256 timestamp); + event EntitySuspended(address indexed entity, uint256 timestamp); + event EntityUnsuspended(address indexed entity, uint256 timestamp); + event AuthorizedWalletAdded(address indexed entity, address indexed wallet); + event AuthorizedWalletRemoved(address indexed entity, address indexed wallet); + event OperatorSet(address indexed entity, address indexed operator, bool status); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IVault.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IVault.sol new file mode 100644 index 0000000..f9aa5ec --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IVault.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IVault + * @notice Interface for Vault contract + * @dev Aave-style vault operations (deposit, borrow, repay, withdraw) + */ +interface IVault { + /** + * @notice Deposit M0 collateral into vault + * @param asset Collateral asset address + * @param amount Amount to deposit + */ + function deposit(address asset, uint256 amount) external payable; + + /** + * @notice Borrow eMoney against collateral + * @param currency eMoney currency address + * @param amount Amount to borrow + */ + function borrow(address currency, uint256 amount) external; + + /** + * @notice Repay borrowed eMoney + * @param currency eMoney currency address + * @param amount Amount to repay + */ + function repay(address currency, uint256 amount) external; + + /** + * @notice Withdraw collateral from vault + * @param asset Collateral asset address + * @param amount Amount to withdraw + */ + function withdraw(address asset, uint256 amount) external; + + /** + * @notice Get vault owner + * @return owner Vault owner address + */ + function owner() external view returns (address); + + /** + * @notice Get vault health + * @return healthRatio Collateralization ratio in basis points + * @return collateralValue Total collateral value in XAU + * @return debtValue Total debt value in XAU + */ + function getHealth() external view returns ( + uint256 healthRatio, + uint256 collateralValue, + uint256 debtValue + ); + + event Deposited(address indexed asset, uint256 amount, address indexed depositor); + event Borrowed(address indexed currency, uint256 amount, address indexed borrower); + event Repaid(address indexed currency, uint256 amount, address indexed repayer); + event Withdrawn(address indexed asset, uint256 amount, address indexed withdrawer); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IVaultStrategy.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IVaultStrategy.sol new file mode 100644 index 0000000..190790b --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IVaultStrategy.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IVaultStrategy + * @notice Interface for vault strategies (deferred implementation) + * @dev Defined now for forward compatibility + */ +interface IVaultStrategy { + function onDeposit(address token, uint256 amount) external; + function onWithdraw(address token, uint256 amount) external; + function onBridgePending(address token, uint256 amount, uint256 estimatedWait) external; + function execute(bytes calldata strategyData) external; + function getStrategyType() external pure returns (string memory); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IXAUOracle.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IXAUOracle.sol new file mode 100644 index 0000000..e91b68d --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IXAUOracle.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IXAUOracle + * @notice Interface for XAU Oracle Module + * @dev Multi-source oracle aggregator for ETH/XAU pricing + */ +interface IXAUOracle { + /** + * @notice Get ETH price in XAU + * @return price ETH price in XAU (18 decimals) + * @return timestamp Last update timestamp + */ + function getETHPriceInXAU() external view returns (uint256 price, uint256 timestamp); + + /** + * @notice Get liquidation price for a vault + * @param vault Vault address + * @return price Liquidation threshold price in XAU + */ + function getLiquidationPrice(address vault) external view returns (uint256 price); + + /** + * @notice Add a price feed source + * @param feed Price feed address (must implement Aggregator interface) + * @param weight Weight for this feed (sum of all weights should be 10000) + */ + function addPriceFeed(address feed, uint256 weight) external; + + /** + * @notice Remove a price feed source + * @param feed Price feed address to remove + */ + function removePriceFeed(address feed) external; + + /** + * @notice Update feed weight + * @param feed Price feed address + * @param weight New weight + */ + function updateFeedWeight(address feed, uint256 weight) external; + + /** + * @notice Freeze oracle (emergency) + */ + function freeze() external; + + /** + * @notice Unfreeze oracle + */ + function unfreeze() external; + + /** + * @notice Check if oracle is frozen + * @return frozen True if frozen + */ + function isFrozen() external view returns (bool); + + event PriceFeedAdded(address indexed feed, uint256 weight); + event PriceFeedRemoved(address indexed feed); + event FeedWeightUpdated(address indexed feed, uint256 oldWeight, uint256 newWeight); + event OracleFrozen(uint256 timestamp); + event OracleUnfrozen(uint256 timestamp); + event PriceUpdated(uint256 price, uint256 timestamp); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IeMoneyJoin.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IeMoneyJoin.sol new file mode 100644 index 0000000..3992e85 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/interfaces/IeMoneyJoin.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IeMoneyJoin + * @notice Interface for eMoney Join Adapter + * @dev Handles minting and burning of eMoney tokens + */ +interface IeMoneyJoin { + /** + * @notice Mint eMoney to a borrower + * @param currency eMoney currency address + * @param to Recipient address + * @param amount Amount to mint + */ + function mint(address currency, address to, uint256 amount) external; + + /** + * @notice Burn eMoney from a repayer + * @param currency eMoney currency address + * @param from Source address + * @param amount Amount to burn + */ + function burn(address currency, address from, uint256 amount) external; + + event eMoneyMinted(address indexed currency, address indexed to, uint256 amount); + event eMoneyBurned(address indexed currency, address indexed from, uint256 amount); +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/CurrencyValidation.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/CurrencyValidation.sol new file mode 100644 index 0000000..44f7e1b --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/CurrencyValidation.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title CurrencyValidation + * @notice Library for validating currency codes and types according to ISO 4217 compliance + * @dev Ensures all currency references are either ISO 4217 compliant or explicitly identified as non-ISO + */ +library CurrencyValidation { + /** + * @notice Currency type enumeration + */ + enum CurrencyType { + ISO4217_FIAT, // Standard ISO 4217 fiat currency (USD, EUR, etc.) + ISO4217_CRYPTO, // ISO 4217 cryptocurrency code (if applicable) + NON_ISO_SYNTHETIC, // Non-ISO synthetic unit of account (e.g., GRU) + NON_ISO_INTERNAL, // Non-ISO internal accounting unit + COMMODITY // Commodity code (XAU, XAG, etc.) + } + + /** + * @notice Validate ISO 4217 currency code format + * @dev ISO 4217 codes are exactly 3 uppercase letters + * @param code Currency code to validate + * @return isValid True if code matches ISO 4217 format + */ + function isValidISO4217Format(string memory code) internal pure returns (bool isValid) { + bytes memory codeBytes = bytes(code); + if (codeBytes.length != 3) { + return false; + } + + for (uint256 i = 0; i < 3; i++) { + uint8 char = uint8(codeBytes[i]); + if (char < 65 || char > 90) { // Not A-Z + return false; + } + } + + return true; + } + + /** + * @notice Check if currency code is a recognized ISO 4217 code + * @dev This is a simplified check - in production, maintain a full registry + * @param code Currency code + * @return isISO4217 True if code is recognized ISO 4217 + */ + function isISO4217Currency(string memory code) internal pure returns (bool isISO4217) { + if (!isValidISO4217Format(code)) { + return false; + } + + // Common ISO 4217 codes (extend as needed) + bytes32 codeHash = keccak256(bytes(code)); + + // Major currencies + if (codeHash == keccak256("USD") || // US Dollar + codeHash == keccak256("EUR") || // Euro + codeHash == keccak256("GBP") || // British Pound + codeHash == keccak256("JPY") || // Japanese Yen + codeHash == keccak256("CNY") || // Chinese Yuan + codeHash == keccak256("CHF") || // Swiss Franc + codeHash == keccak256("CAD") || // Canadian Dollar + codeHash == keccak256("AUD") || // Australian Dollar + codeHash == keccak256("NZD") || // New Zealand Dollar + codeHash == keccak256("SGD")) { // Singapore Dollar + return true; + } + + // In production, maintain a full registry or use oracle/external validation + return false; + } + + /** + * @notice Check if code is GRU (Global Reserve Unit) + * @dev GRU is a non-ISO 4217 synthetic unit of account + * @param code Currency code + * @return isGRU True if code is GRU + */ + function isGRU(string memory code) internal pure returns (bool isGRU) { + bytes32 codeHash = keccak256(bytes(code)); + return codeHash == keccak256("GRU") || + codeHash == keccak256("M00") || + codeHash == keccak256("M0") || + codeHash == keccak256("M1"); + } + + /** + * @notice Check if code is XAU (Gold) + * @dev XAU is the ISO 4217 commodity code for gold + * @param code Currency code + * @return isXAU True if code is XAU + */ + function isXAU(string memory code) internal pure returns (bool isXAU) { + return keccak256(bytes(code)) == keccak256("XAU"); + } + + /** + * @notice Get currency type + * @param code Currency code + * @return currencyType Type of currency + */ + function getCurrencyType(string memory code) internal pure returns (CurrencyType currencyType) { + if (isXAU(code)) { + return CurrencyType.COMMODITY; + } + + if (isGRU(code)) { + return CurrencyType.NON_ISO_SYNTHETIC; + } + + if (isISO4217Currency(code)) { + return CurrencyType.ISO4217_FIAT; + } + + // If format is valid but not recognized, treat as potentially valid ISO 4217 + if (isValidISO4217Format(code)) { + return CurrencyType.ISO4217_FIAT; // Assume valid but not in our list + } + + return CurrencyType.NON_ISO_INTERNAL; + } + + /** + * @notice Validate that currency is legal tender (ISO 4217 fiat) + * @param code Currency code + * @return isLegalTender True if currency is ISO 4217 legal tender + */ + function isLegalTender(string memory code) internal pure returns (bool isLegalTender) { + CurrencyType currencyType = getCurrencyType(code); + return currencyType == CurrencyType.ISO4217_FIAT; + } + + /** + * @notice Require currency to be legal tender or revert + * @param code Currency code + */ + function requireLegalTender(string memory code) internal pure { + require(isLegalTender(code), "CurrencyValidation: not legal tender - must be ISO 4217"); + } + + /** + * @notice Require currency to NOT be legal tender (for synthetic units) + * @param code Currency code + */ + function requireNonLegalTender(string memory code) internal pure { + require(!isLegalTender(code), "CurrencyValidation: must be non-legal tender"); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/GRUConstants.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/GRUConstants.sol new file mode 100644 index 0000000..0a5deb4 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/GRUConstants.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title GRUConstants + * @notice Constants and utilities for Global Reserve Unit (GRU) + * @dev GRU is a NON-ISO 4217 synthetic unit of account, NOT legal tender + * + * MANDATORY COMPLIANCE: + * - GRU SHALL NOT be treated as fiat currency + * - GRU SHALL be explicitly identified as synthetic unit of account + * - All GRU triangulations MUST be conducted through XAU + * - GRU relationships MUST be enforced exactly: 1 M00 GRU = 5 M0 GRU = 25 M1 GRU + */ +library GRUConstants { + /** + * @notice GRU is NOT an ISO 4217 currency + * @dev This constant explicitly identifies GRU as non-ISO + */ + string public constant GRU_CURRENCY_CODE = "GRU"; // Non-ISO 4217 synthetic unit of account + + /** + * @notice GRU monetary layers + */ + string public constant GRU_M00 = "M00"; // Base layer (non-ISO) + string public constant GRU_M0 = "M0"; // Collateral layer (non-ISO) + string public constant GRU_M1 = "M1"; // Credit layer (non-ISO) + + /** + * @notice GRU conversion ratios (MANDATORY - must be enforced exactly) + * @dev 1 M00 GRU = 5 M0 GRU = 25 M1 GRU + */ + uint256 public constant M00_TO_M0_RATIO = 5; // 1 M00 = 5 M0 + uint256 public constant M00_TO_M1_RATIO = 25; // 1 M00 = 25 M1 + uint256 public constant M0_TO_M1_RATIO = 5; // 1 M0 = 5 M1 + + /** + * @notice Decimals for GRU calculations (18 decimals for precision) + */ + uint256 public constant GRU_DECIMALS = 1e18; + + /** + * @notice Convert M00 GRU to M0 GRU + * @param m00Amount Amount in M00 GRU (18 decimals) + * @return m0Amount Amount in M0 GRU (18 decimals) + */ + function m00ToM0(uint256 m00Amount) internal pure returns (uint256 m0Amount) { + return (m00Amount * M00_TO_M0_RATIO * GRU_DECIMALS) / GRU_DECIMALS; + } + + /** + * @notice Convert M00 GRU to M1 GRU + * @param m00Amount Amount in M00 GRU (18 decimals) + * @return m1Amount Amount in M1 GRU (18 decimals) + */ + function m00ToM1(uint256 m00Amount) internal pure returns (uint256 m1Amount) { + return (m00Amount * M00_TO_M1_RATIO * GRU_DECIMALS) / GRU_DECIMALS; + } + + /** + * @notice Convert M0 GRU to M1 GRU + * @param m0Amount Amount in M0 GRU (18 decimals) + * @return m1Amount Amount in M1 GRU (18 decimals) + */ + function m0ToM1(uint256 m0Amount) internal pure returns (uint256 m1Amount) { + return (m0Amount * M0_TO_M1_RATIO * GRU_DECIMALS) / GRU_DECIMALS; + } + + /** + * @notice Convert M0 GRU to M00 GRU + * @param m0Amount Amount in M0 GRU (18 decimals) + * @return m00Amount Amount in M00 GRU (18 decimals) + */ + function m0ToM00(uint256 m0Amount) internal pure returns (uint256 m00Amount) { + return (m0Amount * GRU_DECIMALS) / (M00_TO_M0_RATIO * GRU_DECIMALS); + } + + /** + * @notice Convert M1 GRU to M00 GRU + * @param m1Amount Amount in M1 GRU (18 decimals) + * @return m00Amount Amount in M00 GRU (18 decimals) + */ + function m1ToM00(uint256 m1Amount) internal pure returns (uint256 m00Amount) { + return (m1Amount * GRU_DECIMALS) / (M00_TO_M1_RATIO * GRU_DECIMALS); + } + + /** + * @notice Convert M1 GRU to M0 GRU + * @param m1Amount Amount in M1 GRU (18 decimals) + * @return m0Amount Amount in M0 GRU (18 decimals) + */ + function m1ToM0(uint256 m1Amount) internal pure returns (uint256 m0Amount) { + return (m1Amount * GRU_DECIMALS) / (M0_TO_M1_RATIO * GRU_DECIMALS); + } + + /** + * @notice Validate GRU layer code + * @param layerCode Layer code to validate + * @return isValid True if valid GRU layer + */ + function isValidGRULayer(string memory layerCode) internal pure returns (bool isValid) { + bytes32 codeHash = keccak256(bytes(layerCode)); + return codeHash == keccak256(bytes(GRU_M00)) || + codeHash == keccak256(bytes(GRU_M0)) || + codeHash == keccak256(bytes(GRU_M1)) || + codeHash == keccak256(bytes(GRU_CURRENCY_CODE)); + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/MonetaryFormulas.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/MonetaryFormulas.sol new file mode 100644 index 0000000..4f45f71 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/MonetaryFormulas.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title MonetaryFormulas + * @notice Implementation of mandatory monetary formulas + * @dev All formulas MUST be applied exactly as specified without modification + * + * Formulas: + * - Money Supply: M = C + D and M = MB × m + * - Money Velocity: V = PQ / M + * - Money Multiplier: m = 1 / r and m = (1 + c) / (r + c) + */ +library MonetaryFormulas { + /** + * @notice Calculate money supply: M = C + D + * @dev M = Money Supply, C = Currency, D = Deposits + * @param currency Currency component (C) + * @param deposits Deposits component (D) + * @return moneySupply Money supply (M) + */ + function calculateMoneySupply(uint256 currency, uint256 deposits) internal pure returns (uint256 moneySupply) { + return currency + deposits; + } + + /** + * @notice Calculate money supply: M = MB × m + * @dev M = Money Supply, MB = Monetary Base, m = Money Multiplier + * @param monetaryBase Monetary base (MB) + * @param moneyMultiplier Money multiplier (m) + * @return moneySupply Money supply (M) + */ + function calculateMoneySupplyFromMultiplier(uint256 monetaryBase, uint256 moneyMultiplier) internal pure returns (uint256 moneySupply) { + return (monetaryBase * moneyMultiplier) / 1e18; // Assuming multiplier in 18 decimals + } + + /** + * @notice Calculate money velocity: V = PQ / M + * @dev V = Velocity, P = Price Level, Q = Quantity of Goods, M = Money Supply + * @param priceLevel Price level (P) + * @param quantityOfGoods Quantity of goods (Q) + * @param moneySupply Money supply (M) + * @return velocity Money velocity (V) + */ + function calculateMoneyVelocity(uint256 priceLevel, uint256 quantityOfGoods, uint256 moneySupply) internal pure returns (uint256 velocity) { + if (moneySupply == 0) { + return 0; + } + return (priceLevel * quantityOfGoods) / moneySupply; + } + + /** + * @notice Calculate simple money multiplier: m = 1 / r + * @dev m = Money Multiplier, r = Reserve Ratio + * @param reserveRatio Reserve ratio (r) in basis points (e.g., 1000 = 10%) + * @return moneyMultiplier Money multiplier (m) in 18 decimals + */ + function calculateSimpleMoneyMultiplier(uint256 reserveRatio) internal pure returns (uint256 moneyMultiplier) { + require(reserveRatio > 0, "MonetaryFormulas: reserve ratio must be positive"); + require(reserveRatio <= 10000, "MonetaryFormulas: reserve ratio cannot exceed 100%"); + + // m = 1 / r, where r is in basis points + // Convert to 18 decimals: m = (1e18 * 10000) / reserveRatio + return (1e18 * 10000) / reserveRatio; + } + + /** + * @notice Calculate money multiplier with currency ratio: m = (1 + c) / (r + c) + * @dev m = Money Multiplier, r = Reserve Ratio, c = Currency Ratio + * @param reserveRatio Reserve ratio (r) in basis points + * @param currencyRatio Currency ratio (c) in basis points + * @return moneyMultiplier Money multiplier (m) in 18 decimals + */ + function calculateMoneyMultiplierWithCurrency(uint256 reserveRatio, uint256 currencyRatio) internal pure returns (uint256 moneyMultiplier) { + require(reserveRatio > 0, "MonetaryFormulas: reserve ratio must be positive"); + require(reserveRatio <= 10000, "MonetaryFormulas: reserve ratio cannot exceed 100%"); + require(currencyRatio <= 10000, "MonetaryFormulas: currency ratio cannot exceed 100%"); + + // m = (1 + c) / (r + c), where r and c are in basis points + // Convert to 18 decimals: m = (1e18 * (10000 + currencyRatio)) / (reserveRatio + currencyRatio) + uint256 numerator = 1e18 * (10000 + currencyRatio); + uint256 denominator = reserveRatio + currencyRatio; + + require(denominator > 0, "MonetaryFormulas: invalid denominator"); + return numerator / denominator; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/XAUTriangulation.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/XAUTriangulation.sol new file mode 100644 index 0000000..438bdd6 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/libraries/XAUTriangulation.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title XAUTriangulation + * @notice Library for enforcing XAU triangulation for all currency conversions + * @dev MANDATORY: All currency conversions MUST go through XAU (gold) + * + * Triangulation formula: + * CurrencyA → XAU → CurrencyB + * + * Steps: + * 1. Convert CurrencyA to XAU: xauAmount = currencyAAmount / xauRateA + * 2. Convert XAU to CurrencyB: currencyBAmount = xauAmount * xauRateB + */ +library XAUTriangulation { + /** + * @notice Triangulate from Currency A to Currency B via XAU + * @dev All conversions MUST go through XAU - this is mandatory + * @param currencyAAmount Amount in Currency A (18 decimals) + * @param xauRateA Rate: 1 oz XAU = xauRateA units of Currency A (18 decimals) + * @param xauRateB Rate: 1 oz XAU = xauRateB units of Currency B (18 decimals) + * @return currencyBAmount Amount in Currency B (18 decimals) + */ + function triangulate( + uint256 currencyAAmount, + uint256 xauRateA, + uint256 xauRateB + ) internal pure returns (uint256 currencyBAmount) { + require(xauRateA > 0, "XAUTriangulation: invalid XAU rate A"); + require(xauRateB > 0, "XAUTriangulation: invalid XAU rate B"); + + // Step 1: Convert Currency A to XAU + // xauAmount = currencyAAmount / xauRateA + uint256 xauAmount = (currencyAAmount * 1e18) / xauRateA; + + // Step 2: Convert XAU to Currency B + // currencyBAmount = xauAmount * xauRateB / 1e18 + currencyBAmount = (xauAmount * xauRateB) / 1e18; + } + + /** + * @notice Convert amount to XAU + * @param amount Amount to convert (18 decimals) + * @param xauRate Rate: 1 oz XAU = xauRate units (18 decimals) + * @return xauAmount Amount in XAU (18 decimals) + */ + function toXAU(uint256 amount, uint256 xauRate) internal pure returns (uint256 xauAmount) { + require(xauRate > 0, "XAUTriangulation: invalid XAU rate"); + xauAmount = (amount * 1e18) / xauRate; + } + + /** + * @notice Convert XAU amount to currency + * @param xauAmount Amount in XAU (18 decimals) + * @param xauRate Rate: 1 oz XAU = xauRate units (18 decimals) + * @return currencyAmount Amount in currency (18 decimals) + */ + function fromXAU(uint256 xauAmount, uint256 xauRate) internal pure returns (uint256 currencyAmount) { + require(xauRate > 0, "XAUTriangulation: invalid XAU rate"); + currencyAmount = (xauAmount * xauRate) / 1e18; + } +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/tokens/DebtToken.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/tokens/DebtToken.sol new file mode 100644 index 0000000..2d70779 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/tokens/DebtToken.sol @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../../emoney/interfaces/IeMoneyToken.sol"; + +/** + * @title DebtToken + * @notice Token representing outstanding debt obligation (dToken equivalent) + * @dev Minted when borrow occurs, burned on repayment + * Interest-accruing, non-freely transferable + * Extends eMoneyToken pattern + */ +contract DebtToken is Initializable, ERC20Upgradeable, AccessControlUpgradeable, UUPSUpgradeable { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + + address public vault; + address public currency; // eMoney currency address + uint8 private _decimalsStorage; + bool private _transferable; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /** + * @notice Initialize the debt token (5-arg for backward compatibility; decimals=18, not transferable) + */ + function initialize( + string memory name, + string memory symbol, + address vault_, + address currency_, + address admin + ) external initializer { + _initializeFull(name, symbol, vault_, currency_, admin, 18, false); + } + + /** + * @notice Initialize with decimals and transferability (ERC-20; optionally DEX-transferable) + * @param decimals_ Token decimals (e.g. 6 for stablecoins; 0 = use 18) + * @param transferable_ If true, full ERC-20 transfers allowed (DEX-ready) + */ + function initializeFull( + string memory name, + string memory symbol, + address vault_, + address currency_, + address admin, + uint8 decimals_, + bool transferable_ + ) external initializer { + _initializeFull(name, symbol, vault_, currency_, admin, decimals_ > 0 ? decimals_ : 18, transferable_); + } + + function _initializeFull( + string memory name, + string memory symbol, + address vault_, + address currency_, + address admin, + uint8 decimals_, + bool transferable_ + ) internal { + __ERC20_init(name, symbol); + __AccessControl_init(); + __UUPSUpgradeable_init(); + vault = vault_; + currency = currency_; + _decimalsStorage = decimals_; + _transferable = transferable_; + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + /** + * @notice Returns token decimals (matches underlying for DEX compatibility) + */ + function decimals() public view override returns (uint8) { + return _decimalsStorage; + } + + function isTransferable() external view returns (bool) { + return _transferable; + } + + /** + * @notice Mint debt tokens (only by vault) + * @param to Recipient address + * @param amount Amount to mint + */ + function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) { + _mint(to, amount); + } + + /** + * @notice Burn debt tokens (only by vault) + * @param from Source address + * @param amount Amount to burn + */ + function burn(address from, uint256 amount) external onlyRole(BURNER_ROLE) { + _burn(from, amount); + } + + /** + * @notice Override transfer: when transferable, full ERC-20; else mint/burn/vault only + */ + function _update(address from, address to, uint256 amount) internal virtual override { + if (from == address(0) || to == address(0)) { + super._update(from, to, amount); + return; + } + if (_transferable) { + super._update(from, to, amount); + return; + } + if (from == vault || to == vault) { + super._update(from, to, amount); + return; + } + revert("DebtToken: transfers not allowed"); + } + + /** + * @notice Authorize upgrade (UUPS) + */ + function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/contracts/vault/tokens/DepositToken.sol b/verification-sources/chain138-buildinfo-7678218/contracts/vault/tokens/DepositToken.sol new file mode 100644 index 0000000..064416d --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/contracts/vault/tokens/DepositToken.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../../emoney/interfaces/IeMoneyToken.sol"; + +/** + * @title DepositToken + * @notice Token representing supplied collateral position (aToken equivalent) + * @dev Minted when M0 collateral is deposited, burned on withdrawal + * Extends eMoneyToken pattern but simpler - no policy manager, just mint/burn control + */ +contract DepositToken is Initializable, ERC20Upgradeable, AccessControlUpgradeable, UUPSUpgradeable { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + + address public vault; + address public collateralAsset; + uint8 private _decimalsStorage; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /** + * @notice Initialize the deposit token (5-arg for backward compatibility; decimals = 18) + */ + function initialize( + string memory name, + string memory symbol, + address vault_, + address collateralAsset_, + address admin + ) external initializer { + _initializeWithDecimals(name, symbol, vault_, collateralAsset_, admin, 18); + } + + /** + * @notice Initialize with explicit decimals (ERC-20 DEX-ready; decimals match underlying) + * @param decimals_ Token decimals (e.g. 6 for stablecoins) + */ + function initializeWithDecimals( + string memory name, + string memory symbol, + address vault_, + address collateralAsset_, + address admin, + uint8 decimals_ + ) external initializer { + _initializeWithDecimals(name, symbol, vault_, collateralAsset_, admin, decimals_ > 0 ? decimals_ : 18); + } + + function _initializeWithDecimals( + string memory name, + string memory symbol, + address vault_, + address collateralAsset_, + address admin, + uint8 decimals_ + ) internal { + __ERC20_init(name, symbol); + __AccessControl_init(); + __UUPSUpgradeable_init(); + vault = vault_; + collateralAsset = collateralAsset_; + _decimalsStorage = decimals_; + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + /** + * @notice Returns token decimals (matches underlying for DEX compatibility) + */ + function decimals() public view override returns (uint8) { + return _decimalsStorage; + } + + /** + * @notice Mint deposit tokens (only by vault) + * @param to Recipient address + * @param amount Amount to mint + */ + function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) { + _mint(to, amount); + } + + /** + * @notice Burn deposit tokens (only by vault) + * @param from Source address + * @param amount Amount to burn + */ + function burn(address from, uint256 amount) external onlyRole(BURNER_ROLE) { + _burn(from, amount); + } + + /** + * @notice Authorize upgrade (UUPS) + */ + function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/verification-sources/chain138-buildinfo-7678218/foundry.toml b/verification-sources/chain138-buildinfo-7678218/foundry.toml new file mode 100644 index 0000000..b399b24 --- /dev/null +++ b/verification-sources/chain138-buildinfo-7678218/foundry.toml @@ -0,0 +1,11 @@ +[profile.default] +src = "." +out = "out" +cache_path = "cache" +libs = [] +solc = "0.8.20" +optimizer = true +optimizer_runs = 200 +via_ir = true +evm_version = "paris" +auto_detect_remappings = false diff --git a/verification-sources/chain138-ccip-weth10-1511f33/contracts/ccip/CCIPWETH10Bridge.sol b/verification-sources/chain138-ccip-weth10-1511f33/contracts/ccip/CCIPWETH10Bridge.sol new file mode 100644 index 0000000..6c68f31 --- /dev/null +++ b/verification-sources/chain138-ccip-weth10-1511f33/contracts/ccip/CCIPWETH10Bridge.sol @@ -0,0 +1,301 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title CCIP WETH10 Bridge + * @notice Cross-chain WETH10 transfer bridge using Chainlink CCIP + * @dev Enables users to send WETH10 tokens across chains via CCIP + */ +contract CCIPWETH10Bridge { + + IRouterClient public immutable ccipRouter; + address public immutable weth10; // WETH10 contract address + address public feeToken; // LINK token address + address public admin; + + // Destination chain configurations + struct DestinationChain { + uint64 chainSelector; + address receiverBridge; // Address of corresponding bridge on destination chain + bool enabled; + } + + mapping(uint64 => DestinationChain) public destinations; + uint64[] public destinationChains; + + // Track cross-chain transfers for replay protection + mapping(bytes32 => bool) public processedTransfers; + mapping(address => uint256) public nonces; + + event CrossChainTransferInitiated( + bytes32 indexed messageId, + address indexed sender, + uint64 indexed destinationChainSelector, + address recipient, + uint256 amount, + uint256 nonce + ); + + event CrossChainTransferCompleted( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed recipient, + uint256 amount + ); + + event DestinationAdded(uint64 chainSelector, address receiverBridge); + event DestinationRemoved(uint64 chainSelector); + event DestinationUpdated(uint64 chainSelector, address receiverBridge); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPWETH10Bridge: only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(ccipRouter), "CCIPWETH10Bridge: only router"); + _; + } + + constructor(address _ccipRouter, address _weth10, address _feeToken) { + require(_ccipRouter != address(0), "CCIPWETH10Bridge: zero router"); + require(_weth10 != address(0), "CCIPWETH10Bridge: zero WETH10"); + require(_feeToken != address(0), "CCIPWETH10Bridge: zero fee token"); + + ccipRouter = IRouterClient(_ccipRouter); + weth10 = _weth10; + feeToken = _feeToken; + admin = msg.sender; + } + + /** + * @notice Send WETH10 tokens to another chain via CCIP + * @param destinationChainSelector The chain selector of the destination chain + * @param recipient The recipient address on the destination chain + * @param amount The amount of WETH10 to send + * @return messageId The CCIP message ID + */ + function sendCrossChain( + uint64 destinationChainSelector, + address recipient, + uint256 amount + ) external returns (bytes32 messageId) { + require(amount > 0, "CCIPWETH10Bridge: invalid amount"); + require(recipient != address(0), "CCIPWETH10Bridge: zero recipient"); + + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH10Bridge: destination not enabled"); + + // Transfer WETH10 from user + require(IERC20(weth10).transferFrom(msg.sender, address(this), amount), "CCIPWETH10Bridge: transfer failed"); + + // Increment nonce for replay protection + nonces[msg.sender]++; + uint256 currentNonce = nonces[msg.sender]; + + // Encode transfer data (recipient, amount, sender, nonce) + bytes memory data = abi.encode( + recipient, + amount, + msg.sender, + currentNonce + ); + + // Prepare CCIP message with WETH10 tokens + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + // Set token amount (WETH10) + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth10, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + // Calculate fee + uint256 fee = ccipRouter.getFee(destinationChainSelector, message); + + // Approve and pay fee + if (fee > 0) { + require(IERC20(feeToken).transferFrom(msg.sender, address(this), fee), "CCIPWETH10Bridge: fee transfer failed"); + require(IERC20(feeToken).approve(address(ccipRouter), fee), "CCIPWETH10Bridge: fee approval failed"); + } + + // Send via CCIP + (messageId, ) = ccipRouter.ccipSend(destinationChainSelector, message); + + emit CrossChainTransferInitiated( + messageId, + msg.sender, + destinationChainSelector, + recipient, + amount, + currentNonce + ); + + return messageId; + } + + /** + * @notice Receive WETH10 tokens from another chain via CCIP + * @param message The CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRouter { + // Replay protection: check if message already processed + require(!processedTransfers[message.messageId], "CCIPWETH10Bridge: transfer already processed"); + + // Mark as processed + processedTransfers[message.messageId] = true; + + // Validate token amounts + require(message.tokenAmounts.length > 0, "CCIPWETH10Bridge: no tokens"); + require(message.tokenAmounts[0].token == weth10, "CCIPWETH10Bridge: invalid token"); + + uint256 amount = message.tokenAmounts[0].amount; + require(amount > 0, "CCIPWETH10Bridge: invalid amount"); + + // Decode transfer data (recipient, amount, sender, nonce) + (address recipient, , , ) = abi.decode( + message.data, + (address, uint256, address, uint256) + ); + + require(recipient != address(0), "CCIPWETH10Bridge: zero recipient"); + + // Transfer WETH10 to recipient + require(IERC20(weth10).transfer(recipient, amount), "CCIPWETH10Bridge: transfer failed"); + + emit CrossChainTransferCompleted( + message.messageId, + message.sourceChainSelector, + recipient, + amount + ); + } + + /** + * @notice Calculate fee for cross-chain transfer + * @param destinationChainSelector The chain selector of the destination chain + * @param amount The amount of WETH10 to send + * @return fee The fee required for the transfer + */ + function calculateFee( + uint64 destinationChainSelector, + uint256 amount + ) external view returns (uint256 fee) { + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH10Bridge: destination not enabled"); + + bytes memory data = abi.encode(address(0), amount, address(0), 0); + + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth10, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + return ccipRouter.getFee(destinationChainSelector, message); + } + + /** + * @notice Add destination chain + */ + function addDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(receiverBridge != address(0), "CCIPWETH10Bridge: zero address"); + require(!destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination already exists"); + + destinations[chainSelector] = DestinationChain({ + chainSelector: chainSelector, + receiverBridge: receiverBridge, + enabled: true + }); + destinationChains.push(chainSelector); + + emit DestinationAdded(chainSelector, receiverBridge); + } + + /** + * @notice Remove destination chain + */ + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination not found"); + destinations[chainSelector].enabled = false; + + // Remove from array + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + + emit DestinationRemoved(chainSelector); + } + + /** + * @notice Update destination receiver bridge + */ + function updateDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination not found"); + require(receiverBridge != address(0), "CCIPWETH10Bridge: zero address"); + + destinations[chainSelector].receiverBridge = receiverBridge; + emit DestinationUpdated(chainSelector, receiverBridge); + } + + /** + * @notice Update fee token + */ + function updateFeeToken(address newFeeToken) external onlyAdmin { + require(newFeeToken != address(0), "CCIPWETH10Bridge: zero address"); + feeToken = newFeeToken; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPWETH10Bridge: zero address"); + admin = newAdmin; + } + + /** + * @notice Get destination chains + */ + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } + + /** + * @notice Get user nonce + */ + function getUserNonce(address user) external view returns (uint256) { + return nonces[user]; + } +} + diff --git a/verification-sources/chain138-ccip-weth10-1511f33/foundry.toml b/verification-sources/chain138-ccip-weth10-1511f33/foundry.toml new file mode 100644 index 0000000..d36295b --- /dev/null +++ b/verification-sources/chain138-ccip-weth10-1511f33/foundry.toml @@ -0,0 +1,15 @@ +[profile.default] +src = "contracts" +out = "out" +cache_path = "cache" +libs = ["../../lib", "../../node_modules"] +solc = "0.8.22" +optimizer = true +optimizer_runs = 200 +via_ir = true +evm_version = "paris" +auto_detect_remappings = false +remappings = [ + "@openzeppelin/=../../node_modules/@openzeppelin/", + "forge-std/=../../lib/forge-std/src/" +] diff --git a/verification-sources/chain138-ccip-weth10-8dc7562/contracts/ccip/CCIPWETH10Bridge.sol b/verification-sources/chain138-ccip-weth10-8dc7562/contracts/ccip/CCIPWETH10Bridge.sol new file mode 100644 index 0000000..09ae3c9 --- /dev/null +++ b/verification-sources/chain138-ccip-weth10-8dc7562/contracts/ccip/CCIPWETH10Bridge.sol @@ -0,0 +1,308 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./IRouterClient.sol"; + +// Minimal IERC20 interface for ERC20 tokens (WETH10 and LINK) +interface IERC20 { + function transferFrom(address from, address to, uint256 amount) external returns (bool); + function transfer(address to, uint256 amount) external returns (bool); + function approve(address spender, uint256 amount) external returns (bool); + function balanceOf(address account) external view returns (uint256); +} + +/** + * @title CCIP WETH10 Bridge + * @notice Cross-chain WETH10 transfer bridge using Chainlink CCIP + * @dev Enables users to send WETH10 tokens across chains via CCIP + */ +contract CCIPWETH10Bridge { + + IRouterClient public immutable ccipRouter; + address public immutable weth10; // WETH10 contract address + address public feeToken; // LINK token address + address public admin; + + // Destination chain configurations + struct DestinationChain { + uint64 chainSelector; + address receiverBridge; // Address of corresponding bridge on destination chain + bool enabled; + } + + mapping(uint64 => DestinationChain) public destinations; + uint64[] public destinationChains; + + // Track cross-chain transfers for replay protection + mapping(bytes32 => bool) public processedTransfers; + mapping(address => uint256) public nonces; + + event CrossChainTransferInitiated( + bytes32 indexed messageId, + address indexed sender, + uint64 indexed destinationChainSelector, + address recipient, + uint256 amount, + uint256 nonce + ); + + event CrossChainTransferCompleted( + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed recipient, + uint256 amount + ); + + event DestinationAdded(uint64 chainSelector, address receiverBridge); + event DestinationRemoved(uint64 chainSelector); + event DestinationUpdated(uint64 chainSelector, address receiverBridge); + + modifier onlyAdmin() { + require(msg.sender == admin, "CCIPWETH10Bridge: only admin"); + _; + } + + modifier onlyRouter() { + require(msg.sender == address(ccipRouter), "CCIPWETH10Bridge: only router"); + _; + } + + constructor(address _ccipRouter, address _weth10, address _feeToken) { + require(_ccipRouter != address(0), "CCIPWETH10Bridge: zero router"); + require(_weth10 != address(0), "CCIPWETH10Bridge: zero WETH10"); + require(_feeToken != address(0), "CCIPWETH10Bridge: zero fee token"); + + ccipRouter = IRouterClient(_ccipRouter); + weth10 = _weth10; + feeToken = _feeToken; + admin = msg.sender; + } + + /** + * @notice Send WETH10 tokens to another chain via CCIP + * @param destinationChainSelector The chain selector of the destination chain + * @param recipient The recipient address on the destination chain + * @param amount The amount of WETH10 to send + * @return messageId The CCIP message ID + */ + function sendCrossChain( + uint64 destinationChainSelector, + address recipient, + uint256 amount + ) external returns (bytes32 messageId) { + require(amount > 0, "CCIPWETH10Bridge: invalid amount"); + require(recipient != address(0), "CCIPWETH10Bridge: zero recipient"); + + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH10Bridge: destination not enabled"); + + // Transfer WETH10 from user + require(IERC20(weth10).transferFrom(msg.sender, address(this), amount), "CCIPWETH10Bridge: transfer failed"); + + // Increment nonce for replay protection + nonces[msg.sender]++; + uint256 currentNonce = nonces[msg.sender]; + + // Encode transfer data (recipient, amount, sender, nonce) + bytes memory data = abi.encode( + recipient, + amount, + msg.sender, + currentNonce + ); + + // Prepare CCIP message with WETH10 tokens + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + // Set token amount (WETH10) + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth10, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + // Calculate fee + uint256 fee = ccipRouter.getFee(destinationChainSelector, message); + + // Approve and pay fee + if (fee > 0) { + require(IERC20(feeToken).transferFrom(msg.sender, address(this), fee), "CCIPWETH10Bridge: fee transfer failed"); + require(IERC20(feeToken).approve(address(ccipRouter), fee), "CCIPWETH10Bridge: fee approval failed"); + } + + // Send via CCIP + (messageId, ) = ccipRouter.ccipSend(destinationChainSelector, message); + + emit CrossChainTransferInitiated( + messageId, + msg.sender, + destinationChainSelector, + recipient, + amount, + currentNonce + ); + + return messageId; + } + + /** + * @notice Receive WETH10 tokens from another chain via CCIP + * @param message The CCIP message + */ + function ccipReceive( + IRouterClient.Any2EVMMessage calldata message + ) external onlyRouter { + // Replay protection: check if message already processed + require(!processedTransfers[message.messageId], "CCIPWETH10Bridge: transfer already processed"); + + // Mark as processed + processedTransfers[message.messageId] = true; + + // Validate token amounts + require(message.tokenAmounts.length > 0, "CCIPWETH10Bridge: no tokens"); + require(message.tokenAmounts[0].token == weth10, "CCIPWETH10Bridge: invalid token"); + + uint256 amount = message.tokenAmounts[0].amount; + require(amount > 0, "CCIPWETH10Bridge: invalid amount"); + + // Decode transfer data (recipient, amount, sender, nonce) + (address recipient, , , ) = abi.decode( + message.data, + (address, uint256, address, uint256) + ); + + require(recipient != address(0), "CCIPWETH10Bridge: zero recipient"); + + // Transfer WETH10 to recipient + require(IERC20(weth10).transfer(recipient, amount), "CCIPWETH10Bridge: transfer failed"); + + emit CrossChainTransferCompleted( + message.messageId, + message.sourceChainSelector, + recipient, + amount + ); + } + + /** + * @notice Calculate fee for cross-chain transfer + * @param destinationChainSelector The chain selector of the destination chain + * @param amount The amount of WETH10 to send + * @return fee The fee required for the transfer + */ + function calculateFee( + uint64 destinationChainSelector, + uint256 amount + ) external view returns (uint256 fee) { + DestinationChain memory dest = destinations[destinationChainSelector]; + require(dest.enabled, "CCIPWETH10Bridge: destination not enabled"); + + bytes memory data = abi.encode(address(0), amount, address(0), 0); + + IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ + receiver: abi.encode(dest.receiverBridge), + data: data, + tokenAmounts: new IRouterClient.TokenAmount[](1), + feeToken: feeToken, + extraArgs: "" + }); + + message.tokenAmounts[0] = IRouterClient.TokenAmount({ + token: weth10, + amount: amount, + amountType: IRouterClient.TokenAmountType.Fiat + }); + + return ccipRouter.getFee(destinationChainSelector, message); + } + + /** + * @notice Add destination chain + */ + function addDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(receiverBridge != address(0), "CCIPWETH10Bridge: zero address"); + require(!destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination already exists"); + + destinations[chainSelector] = DestinationChain({ + chainSelector: chainSelector, + receiverBridge: receiverBridge, + enabled: true + }); + destinationChains.push(chainSelector); + + emit DestinationAdded(chainSelector, receiverBridge); + } + + /** + * @notice Remove destination chain + */ + function removeDestination(uint64 chainSelector) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination not found"); + destinations[chainSelector].enabled = false; + + // Remove from array + for (uint256 i = 0; i < destinationChains.length; i++) { + if (destinationChains[i] == chainSelector) { + destinationChains[i] = destinationChains[destinationChains.length - 1]; + destinationChains.pop(); + break; + } + } + + emit DestinationRemoved(chainSelector); + } + + /** + * @notice Update destination receiver bridge + */ + function updateDestination( + uint64 chainSelector, + address receiverBridge + ) external onlyAdmin { + require(destinations[chainSelector].enabled, "CCIPWETH10Bridge: destination not found"); + require(receiverBridge != address(0), "CCIPWETH10Bridge: zero address"); + + destinations[chainSelector].receiverBridge = receiverBridge; + emit DestinationUpdated(chainSelector, receiverBridge); + } + + /** + * @notice Update fee token + */ + function updateFeeToken(address newFeeToken) external onlyAdmin { + require(newFeeToken != address(0), "CCIPWETH10Bridge: zero address"); + feeToken = newFeeToken; + } + + /** + * @notice Change admin + */ + function changeAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "CCIPWETH10Bridge: zero address"); + admin = newAdmin; + } + + /** + * @notice Get destination chains + */ + function getDestinationChains() external view returns (uint64[] memory) { + return destinationChains; + } + + /** + * @notice Get user nonce + */ + function getUserNonce(address user) external view returns (uint256) { + return nonces[user]; + } +} + diff --git a/verification-sources/chain138-ccip-weth10-8dc7562/foundry.toml b/verification-sources/chain138-ccip-weth10-8dc7562/foundry.toml new file mode 100644 index 0000000..d36295b --- /dev/null +++ b/verification-sources/chain138-ccip-weth10-8dc7562/foundry.toml @@ -0,0 +1,15 @@ +[profile.default] +src = "contracts" +out = "out" +cache_path = "cache" +libs = ["../../lib", "../../node_modules"] +solc = "0.8.22" +optimizer = true +optimizer_runs = 200 +via_ir = true +evm_version = "paris" +auto_detect_remappings = false +remappings = [ + "@openzeppelin/=../../node_modules/@openzeppelin/", + "forge-std/=../../lib/forge-std/src/" +] diff --git a/verification-sources/chain138-dodo-deployment-host/README.md b/verification-sources/chain138-dodo-deployment-host/README.md new file mode 100644 index 0000000..4cfd479 --- /dev/null +++ b/verification-sources/chain138-dodo-deployment-host/README.md @@ -0,0 +1,25 @@ +# Chain 138 DODO Deployment-Host Source Variants + +This folder archives the DODO source variants recovered from the deployment host: + +- Host: `192.168.11.11` +- Source root: `/root/projects/proxmox/smom-dbis-138` +- Archived files: + - `contracts/dex/DODOPMMIntegration.sol` + - `contracts/liquidity/providers/DODOPMMProvider.sol` + +These files are retained as verification evidence for the remaining Chain 138 exact-source blockers: + +| Contract | Address | Required metadata CID | Archived source SHA-256 | +|:---|:---|:---|:---| +| `DODOPMMProvider` | `0x3f729632e9553ebaccde2e9b4c8f2b285b014f2e` | `QmZSHGCTCdP2QukQMufRKZ84TxkNnQcT7Q76B1zmfwqKf3` | `6470022fe1a7a43c12e3723cc43eb9e059ecd47e843b19f1abdb042617affe1e` | +| `DODOPMMIntegration` | `0x86ADA6Ef91A3B450F89f2b751e93B1b7A3218895` | `QmacBbT3sZ7jytzUUKdDy7KHGcfDJ3tjdfmg4TXBtr94un` | `d5af9bf3d74056b750e44e93b9c541341f181e16c72464969abd672ffa8ab58a` | + +The variants compile, but they are not the deployed exact source: + +- `solc 0.8.20`, optimizer `200`, `via_ir=false`, `evm_version=paris` emitted metadata CIDs: + - `DODOPMMProvider`: `QmdVKkhX4GfPzvvNVKJRyDoYvHcJ61TkqL8UZFo61RKyfL` + - `DODOPMMIntegration`: `QmaUM81sMrDjVAYKeA4LTW67ctzGwx2d93y6k2o56k3bLH` +- Matrix checks across `solc 0.8.20` / `0.8.22`, `via_ir=false/true`, and `evm_version=paris/london/cancun` did not match the stripped deployed runtime bytecode. + +Do not resubmit these sources as final Blockscout verification inputs for the live Stack A DODO contracts unless a later metadata/source recovery proves an exact bytecode match. diff --git a/verification-sources/chain138-dodo-deployment-host/contracts/dex/DODOPMMIntegration.sol b/verification-sources/chain138-dodo-deployment-host/contracts/dex/DODOPMMIntegration.sol new file mode 100644 index 0000000..1b18a7f --- /dev/null +++ b/verification-sources/chain138-dodo-deployment-host/contracts/dex/DODOPMMIntegration.sol @@ -0,0 +1,455 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title DODO PMM Pool Interface + * @notice Simplified interface for DODO Proactive Market Maker pools + * @dev Actual DODO interfaces may vary - this is a simplified version + */ +interface IDODOPMMPool { + function _BASE_TOKEN_() external view returns (address); + function _QUOTE_TOKEN_() external view returns (address); + function sellBase(uint256 amount) external returns (uint256); + function sellQuote(uint256 amount) external returns (uint256); + function buyShares(address to) external returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare); + function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve); + function getMidPrice() external view returns (uint256); + function _QUOTE_RESERVE_() external view returns (uint256); + function _BASE_RESERVE_() external view returns (uint256); +} + +/** + * @title DODO Vending Machine Interface + * @notice Interface for creating DODO Vending Machine (DVM) pools + */ +interface IDODOVendingMachine { + function createDVM( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 i, + uint256 k, + bool isOpenTWAP + ) external returns (address dvm); +} + +/** + * @title DODOPMMIntegration + * @notice Integration contract for DODO PMM pools with CompliantUSDT/USDC + * @dev Manages liquidity pools on DODO and provides swap functionality between + * compliant tokens (cUSDT/cUSDC) and official tokens (USDT/USDC) + * + * This contract facilitates exchangeability between compliant and official tokens + * through DODO's Proactive Market Maker algorithm, which maintains price stability + * and provides efficient liquidity. + */ +contract DODOPMMIntegration is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + bytes32 public constant SWAP_OPERATOR_ROLE = keccak256("SWAP_OPERATOR_ROLE"); + + // DODO contracts + address public immutable dodoVendingMachine; + address public immutable dodoApprove; // DODO's approval contract for gas optimization + + // Token addresses + address public immutable officialUSDT; // Official USDT on destination chain + address public immutable officialUSDC; // Official USDC on destination chain + address public immutable compliantUSDT; // cUSDT on Chain 138 + address public immutable compliantUSDC; // cUSDC on Chain 138 + + // Pool mappings + mapping(address => mapping(address => address)) public pools; // token0 => token1 => pool + mapping(address => bool) public isRegisteredPool; + + // Pool configuration + struct PoolConfig { + address pool; + address baseToken; + address quoteToken; + uint256 lpFeeRate; // Basis points (100 = 1%) + uint256 i; // Initial price (1e18 = $1 for stablecoins) + uint256 k; // Slippage factor (0.5 = 500000000000000000, lower = less slippage) + bool isOpenTWAP; // Enable TWAP oracle for price discovery + uint256 createdAt; + } + + mapping(address => PoolConfig) public poolConfigs; + address[] public allPools; + + event PoolCreated( + address indexed pool, + address indexed baseToken, + address indexed quoteToken, + address creator + ); + event LiquidityAdded( + address indexed pool, + address indexed provider, + uint256 baseAmount, + uint256 quoteAmount, + uint256 lpShares + ); + event SwapExecuted( + address indexed pool, + address indexed tokenIn, + address indexed tokenOut, + uint256 amountIn, + uint256 amountOut, + address trader + ); + event PoolRemoved(address indexed pool); + + constructor( + address admin, + address dodoVendingMachine_, + address dodoApprove_, + address officialUSDT_, + address officialUSDC_, + address compliantUSDT_, + address compliantUSDC_ + ) { + require(admin != address(0), "DODOPMMIntegration: zero admin"); + require(dodoVendingMachine_ != address(0), "DODOPMMIntegration: zero DVM"); + require(officialUSDT_ != address(0), "DODOPMMIntegration: zero USDT"); + require(officialUSDC_ != address(0), "DODOPMMIntegration: zero USDC"); + require(compliantUSDT_ != address(0), "DODOPMMIntegration: zero cUSDT"); + require(compliantUSDC_ != address(0), "DODOPMMIntegration: zero cUSDC"); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + _grantRole(SWAP_OPERATOR_ROLE, admin); + + dodoVendingMachine = dodoVendingMachine_; + dodoApprove = dodoApprove_; + officialUSDT = officialUSDT_; + officialUSDC = officialUSDC_; + compliantUSDT = compliantUSDT_; + compliantUSDC = compliantUSDC_; + } + + /** + * @notice Create DODO PMM pool for cUSDT/USDT pair + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage, higher = more slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTUSDTPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][officialUSDT] == address(0), "DODOPMMIntegration: pool exists"); + + // Create DVM pool using DODO Vending Machine + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + officialUSDT, // quoteToken (USDT) + lpFeeRate, // LP fee rate + initialPrice, // Initial price + k, // Slippage factor + isOpenTWAP // Enable TWAP + ); + + // Register pool + pools[compliantUSDT][officialUSDT] = pool; + pools[officialUSDT][compliantUSDT] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDT, + quoteToken: officialUSDT, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDT, officialUSDT, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDC/USDC pair + * @param lpFeeRate Liquidity provider fee rate (basis points) + * @param initialPrice Initial price (1e18 = $1) + * @param k Slippage factor + * @param isOpenTWAP Enable TWAP oracle + */ + function createCUSDCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDC][officialUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDC, + officialUSDC, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[compliantUSDC][officialUSDC] = pool; + pools[officialUSDC][compliantUSDC] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDC, + quoteToken: officialUSDC, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDC, officialUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for any base/quote token pair (generic) + * @param baseToken Base token address + * @param quoteToken Quote token address + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoins) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createPool( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(baseToken != address(0), "DODOPMMIntegration: zero base"); + require(quoteToken != address(0), "DODOPMMIntegration: zero quote"); + require(baseToken != quoteToken, "DODOPMMIntegration: same token"); + require(pools[baseToken][quoteToken] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + baseToken, + quoteToken, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[baseToken][quoteToken] = pool; + pools[quoteToken][baseToken] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: baseToken, + quoteToken: quoteToken, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, baseToken, quoteToken, msg.sender); + } + + /** + * @notice Add liquidity to a DODO PMM pool + * @param pool Pool address + * @param baseAmount Amount of base token to deposit + * @param quoteAmount Amount of quote token to deposit + */ + function addLiquidity( + address pool, + uint256 baseAmount, + uint256 quoteAmount + ) external nonReentrant returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(baseAmount > 0 && quoteAmount > 0, "DODOPMMIntegration: zero amount"); + + PoolConfig memory config = poolConfigs[pool]; + + // Transfer tokens to pool (DODO pools handle their own token management) + IERC20(config.baseToken).safeTransferFrom(msg.sender, pool, baseAmount); + IERC20(config.quoteToken).safeTransferFrom(msg.sender, pool, quoteAmount); + + // Call buyShares on DODO pool to add liquidity + (baseShare, quoteShare, lpShare) = IDODOPMMPool(pool).buyShares(msg.sender); + + emit LiquidityAdded(pool, msg.sender, baseAmount, quoteAmount, lpShare); + } + + /** + * @notice Swap cUSDT for official USDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDT to sell + * @param minAmountOut Minimum amount of USDT to receive (slippage protection) + */ + function swapCUSDTForUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer cUSDT to pool + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell base token) + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDT, officialUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDT for cUSDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDT to sell + * @param minAmountOut Minimum amount of cUSDT to receive + */ + function swapUSDTForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer USDT to pool + IERC20(officialUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell quote token) + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDT, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for official USDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDC to sell + * @param minAmountOut Minimum amount of USDC to receive + */ + function swapCUSDCForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDC, officialUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDC for cUSDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDC to sell + * @param minAmountOut Minimum amount of cUSDC to receive + */ + function swapUSDCForCUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(officialUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDC, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Get current pool price + * @param pool Pool address + * @return price Current mid price (1e18 = $1 for stablecoins) + */ + function getPoolPrice(address pool) external view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + price = IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get pool reserves + * @param pool Pool address + * @return baseReserve Base token reserve + * @return quoteReserve Quote token reserve + */ + function getPoolReserves(address pool) external view returns (uint256 baseReserve, uint256 quoteReserve) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + (baseReserve, quoteReserve) = IDODOPMMPool(pool).getVaultReserve(); + } + + /** + * @notice Get pool configuration + * @param pool Pool address + * @return config Pool configuration struct + */ + function getPoolConfig(address pool) external view returns (PoolConfig memory config) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + config = poolConfigs[pool]; + } + + /** + * @notice Get all registered pools + * @return List of all pool addresses + */ + function getAllPools() external view returns (address[] memory) { + return allPools; + } + + /** + * @notice Remove pool (emergency only) + * @param pool Pool address to remove + */ + function removePool(address pool) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + + PoolConfig memory config = poolConfigs[pool]; + pools[config.baseToken][config.quoteToken] = address(0); + pools[config.quoteToken][config.baseToken] = address(0); + isRegisteredPool[pool] = false; + + delete poolConfigs[pool]; + + emit PoolRemoved(pool); + } +} + diff --git a/verification-sources/chain138-dodo-deployment-host/contracts/liquidity/interfaces/ILiquidityProvider.sol b/verification-sources/chain138-dodo-deployment-host/contracts/liquidity/interfaces/ILiquidityProvider.sol new file mode 100644 index 0000000..4d63902 --- /dev/null +++ b/verification-sources/chain138-dodo-deployment-host/contracts/liquidity/interfaces/ILiquidityProvider.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +interface ILiquidityProvider { + function getQuote(address tokenIn, address tokenOut, uint256 amountIn) + external view returns (uint256 amountOut, uint256 slippageBps); + function executeSwap(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut) + external returns (uint256 amountOut); + function supportsTokenPair(address tokenIn, address tokenOut) external view returns (bool); + function providerName() external pure returns (string memory); + function estimateGas(address tokenIn, address tokenOut, uint256 amountIn) external view returns (uint256); +} diff --git a/verification-sources/chain138-dodo-deployment-host/contracts/liquidity/providers/DODOPMMProvider.sol b/verification-sources/chain138-dodo-deployment-host/contracts/liquidity/providers/DODOPMMProvider.sol new file mode 100644 index 0000000..3d7bb88 --- /dev/null +++ b/verification-sources/chain138-dodo-deployment-host/contracts/liquidity/providers/DODOPMMProvider.sol @@ -0,0 +1,195 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "../interfaces/ILiquidityProvider.sol"; +import "../../dex/DODOPMMIntegration.sol"; + +/** + * @title DODOPMMProvider + * @notice Wrapper for DODO PMM with extended functionality + * @dev Implements ILiquidityProvider for multi-provider liquidity system + */ +contract DODOPMMProvider is ILiquidityProvider, AccessControl { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + + DODOPMMIntegration public dodoIntegration; + + // Pool tracking + mapping(address => mapping(address => address)) public pools; // tokenIn => tokenOut => pool + mapping(address => bool) public isKnownPool; + + event PoolCreated(address indexed tokenIn, address indexed tokenOut, address pool); + event PoolOptimized(address indexed pool, uint256 newK, uint256 newI); + + constructor(address _dodoIntegration, address admin) { + require(_dodoIntegration != address(0), "Zero address"); + + dodoIntegration = DODOPMMIntegration(_dodoIntegration); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + } + + /** + * @notice Get quote from DODO PMM + */ + function getQuote( + address tokenIn, + address tokenOut, + uint256 amountIn + ) external view override returns (uint256 amountOut, uint256 slippageBps) { + address pool = pools[tokenIn][tokenOut]; + + if (pool == address(0)) { + return (0, 10000); // No pool, 100% slippage + } + + try dodoIntegration.getPoolPrice(pool) returns (uint256 price) { + // Simple calculation (in production, would use actual DODO math) + amountOut = (amountIn * price) / 1e18; + slippageBps = 30; // 0.3% typical for stablecoin pools + return (amountOut, slippageBps); + } catch { + return (0, 10000); + } + } + + /** + * @notice Execute swap via DODO PMM + */ + function executeSwap( + address tokenIn, + address tokenOut, + uint256 amountIn, + uint256 minAmountOut + ) external override returns (uint256 amountOut) { + // Get pool for token pair + address pool = pools[tokenIn][tokenOut]; + require(pool != address(0), "Pool not found"); + + // Transfer tokens from caller + IERC20(tokenIn).safeTransferFrom(msg.sender, address(this), amountIn); + + // Route to appropriate swap method based on token pair + // This is a simplified version - in production, you'd want a more generic approach + if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.officialUSDT()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapCUSDTForUSDT(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.officialUSDT() && tokenOut == dodoIntegration.compliantUSDT()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapUSDTForCUSDT(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.officialUSDC()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapCUSDCForUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.officialUSDC() && tokenOut == dodoIntegration.compliantUSDC()) { + IERC20(tokenIn).approve(pool, amountIn); + amountOut = dodoIntegration.swapUSDCForCUSDC(pool, amountIn, minAmountOut); + } else { + revert("Unsupported token pair"); + } + + // Transfer output tokens to caller + IERC20(tokenOut).safeTransfer(msg.sender, amountOut); + + return amountOut; + } + + /** + * @notice Check if provider supports token pair + */ + function supportsTokenPair( + address tokenIn, + address tokenOut + ) external view override returns (bool) { + return pools[tokenIn][tokenOut] != address(0); + } + + /** + * @notice Get provider name + */ + function providerName() external pure override returns (string memory) { + return "DODO PMM"; + } + + /** + * @notice Estimate gas for swap + */ + function estimateGas( + address, + address, + uint256 + ) external pure override returns (uint256) { + return 150000; // Typical gas for DODO swap + } + + /** + * @notice Ensure pool exists for token pair + */ + function ensurePoolExists(address tokenIn, address tokenOut) external onlyRole(POOL_MANAGER_ROLE) { + if (pools[tokenIn][tokenOut] == address(0)) { + _createOptimalPool(tokenIn, tokenOut); + } + } + + /// @dev Default params for stablecoin pairs: 0.03% fee, 1:1 price, k=0.5e18 + uint256 private constant DEFAULT_LP_FEE = 3; + uint256 private constant DEFAULT_I = 1e18; + uint256 private constant DEFAULT_K = 0.5e18; + + /** + * @notice Create optimal DODO pool via DODOPMMIntegration + * @dev Requires DODOPMMIntegration to grant POOL_MANAGER_ROLE to this contract + */ + function _createOptimalPool(address tokenIn, address tokenOut) internal { + address pool = dodoIntegration.createPool( + tokenIn, + tokenOut, + DEFAULT_LP_FEE, + DEFAULT_I, + DEFAULT_K, + false // isOpenTWAP - disable for stablecoins + ); + pools[tokenIn][tokenOut] = pool; + pools[tokenOut][tokenIn] = pool; + isKnownPool[pool] = true; + emit PoolCreated(tokenIn, tokenOut, pool); + } + + /** + * @notice Register existing pool + */ + function registerPool( + address tokenIn, + address tokenOut, + address pool + ) external onlyRole(POOL_MANAGER_ROLE) { + require(pool != address(0), "Zero address"); + + pools[tokenIn][tokenOut] = pool; + isKnownPool[pool] = true; + + emit PoolCreated(tokenIn, tokenOut, pool); + } + + /** + * @notice Optimize pool parameters (K, I) + * @dev DODO PMM parameters are typically oracle-driven; DVM pools may expose + * setK/setI. Emits for off-chain monitoring. If the pool supports + * parameter updates, extend this to call the pool's update functions. + */ + function optimizePoolParameters( + address pool, + uint256 newK, + uint256 newI + ) external onlyRole(POOL_MANAGER_ROLE) { + require(isKnownPool[pool], "Unknown pool"); + // DODO DVM/PMM: parameters set at creation; oracle-driven rebalancing. + // Emit for observability; integrate pool.setK/setI when supported. + emit PoolOptimized(pool, newK, newI); + } +} diff --git a/verification-sources/chain138-dodo-deployment-host/contracts/reserve/IReserveSystem.sol b/verification-sources/chain138-dodo-deployment-host/contracts/reserve/IReserveSystem.sol new file mode 100644 index 0000000..c23f819 --- /dev/null +++ b/verification-sources/chain138-dodo-deployment-host/contracts/reserve/IReserveSystem.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IReserveSystem + * @notice Interface for the GRU Reserve System + * @dev Defines the core functionality for reserve management, conversion, and redemption + */ +interface IReserveSystem { + // ============ Events ============ + + event ReserveDeposited( + address indexed asset, + uint256 amount, + address indexed depositor, + bytes32 indexed reserveId + ); + + event ReserveWithdrawn( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed reserveId + ); + + event ConversionExecuted( + address indexed sourceAsset, + address indexed targetAsset, + uint256 sourceAmount, + uint256 targetAmount, + bytes32 indexed conversionId, + uint256 fees + ); + + event RedemptionExecuted( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed redemptionId + ); + + event PriceFeedUpdated( + address indexed asset, + uint256 price, + uint256 timestamp + ); + + // ============ Reserve Management ============ + + /** + * @notice Deposit assets into the reserve system + * @param asset Address of the asset to deposit + * @param amount Amount to deposit + * @return reserveId Unique identifier for this reserve deposit + */ + function depositReserve( + address asset, + uint256 amount + ) external returns (bytes32 reserveId); + + /** + * @notice Withdraw assets from the reserve system + * @param asset Address of the asset to withdraw + * @param amount Amount to withdraw + * @param recipient Address to receive the withdrawn assets + * @return reserveId Unique identifier for this reserve withdrawal + */ + function withdrawReserve( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 reserveId); + + /** + * @notice Get the total reserve balance for an asset + * @param asset Address of the asset + * @return balance Total reserve balance + */ + function getReserveBalance(address asset) external view returns (uint256 balance); + + /** + * @notice Get reserve balance for a specific reserve ID + * @param reserveId Unique identifier for the reserve + * @return asset Address of the asset + * @return balance Reserve balance + */ + function getReserveById(bytes32 reserveId) external view returns (address asset, uint256 balance); + + // ============ Conversion ============ + + /** + * @notice Convert assets using optimal path (XAU triangulation) + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return conversionId Unique identifier for this conversion + * @return targetAmount Amount received after conversion + * @return fees Total fees charged + */ + function convertAssets( + address sourceAsset, + address targetAsset, + uint256 amount + ) external returns ( + bytes32 conversionId, + uint256 targetAmount, + uint256 fees + ); + + /** + * @notice Calculate conversion amount without executing + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return targetAmount Expected amount after conversion + * @return fees Expected fees + * @return path Optimal conversion path + */ + function calculateConversion( + address sourceAsset, + address targetAsset, + uint256 amount + ) external view returns ( + uint256 targetAmount, + uint256 fees, + address[] memory path + ); + + // ============ Redemption ============ + + /** + * @notice Redeem assets from the reserve system + * @param asset Address of the asset to redeem + * @param amount Amount to redeem + * @param recipient Address to receive the redeemed assets + * @return redemptionId Unique identifier for this redemption + */ + function redeem( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 redemptionId); + + // ============ Price Feeds ============ + + /** + * @notice Update price feed for an asset + * @param asset Address of the asset + * @param price Current price + * @param timestamp Price timestamp + */ + function updatePriceFeed( + address asset, + uint256 price, + uint256 timestamp + ) external; + + /** + * @notice Get current price for an asset + * @param asset Address of the asset + * @return price Current price + * @return timestamp Price timestamp + */ + function getPrice(address asset) external view returns (uint256 price, uint256 timestamp); + + /** + * @notice Get price for conversion between two assets + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @return price Conversion price (target per source) + */ + function getConversionPrice( + address sourceAsset, + address targetAsset + ) external view returns (uint256 price); +} + diff --git a/verification-sources/chain138-dodo-deployment-host/foundry.toml b/verification-sources/chain138-dodo-deployment-host/foundry.toml new file mode 100644 index 0000000..bac13a8 --- /dev/null +++ b/verification-sources/chain138-dodo-deployment-host/foundry.toml @@ -0,0 +1,15 @@ +[profile.default] +src = "contracts" +out = "out" +cache_path = "cache" +libs = ["../../lib", "../../node_modules"] +solc = "0.8.20" +optimizer = true +optimizer_runs = 200 +via_ir = false +evm_version = "paris" +auto_detect_remappings = false +remappings = [ + "@openzeppelin/=../../node_modules/@openzeppelin/", + "forge-std/=../../lib/forge-std/src/" +] diff --git a/verification-sources/chain138-dodo-historical/contracts/dex/DODOPMMIntegration.sol b/verification-sources/chain138-dodo-historical/contracts/dex/DODOPMMIntegration.sol new file mode 100644 index 0000000..8ee82f2 --- /dev/null +++ b/verification-sources/chain138-dodo-historical/contracts/dex/DODOPMMIntegration.sol @@ -0,0 +1,608 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../reserve/IReserveSystem.sol"; + +/** + * @title DODO PMM Pool Interface + * @notice Simplified interface for DODO Proactive Market Maker pools + * @dev Actual DODO interfaces may vary - this is a simplified version + */ +interface IDODOPMMPool { + function _BASE_TOKEN_() external view returns (address); + function _QUOTE_TOKEN_() external view returns (address); + function sellBase(uint256 amount) external returns (uint256); + function sellQuote(uint256 amount) external returns (uint256); + function buyShares(address to) external returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare); + function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve); + function getMidPrice() external view returns (uint256); + function _QUOTE_RESERVE_() external view returns (uint256); + function _BASE_RESERVE_() external view returns (uint256); +} + +/** + * @title DODO Vending Machine Interface + * @notice Interface for creating DODO Vending Machine (DVM) pools + */ +interface IDODOVendingMachine { + function createDVM( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 i, + uint256 k, + bool isOpenTWAP + ) external returns (address dvm); +} + +/** + * @title DODOPMMIntegration + * @notice Integration contract for DODO PMM pools with CompliantUSDT/USDC + * @dev Manages liquidity pools on DODO and provides swap functionality between + * compliant tokens (cUSDT/cUSDC) and official tokens (USDT/USDC) + * + * This contract facilitates exchangeability between compliant and official tokens + * through DODO's Proactive Market Maker algorithm, which maintains price stability + * and provides efficient liquidity. + */ +contract DODOPMMIntegration is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + bytes32 public constant SWAP_OPERATOR_ROLE = keccak256("SWAP_OPERATOR_ROLE"); + + // DODO contracts + address public immutable dodoVendingMachine; + address public immutable dodoApprove; // DODO's approval contract for gas optimization + + // Token addresses + address public immutable officialUSDT; // Official USDT on destination chain + address public immutable officialUSDC; // Official USDC on destination chain + address public immutable compliantUSDT; // cUSDT on Chain 138 + address public immutable compliantUSDC; // cUSDC on Chain 138 + + // Pool mappings + mapping(address => mapping(address => address)) public pools; // token0 => token1 => pool + mapping(address => bool) public isRegisteredPool; + + // Pool configuration + struct PoolConfig { + address pool; + address baseToken; + address quoteToken; + uint256 lpFeeRate; // Basis points (100 = 1%) + uint256 i; // Initial price (1e18 = $1 for stablecoins) + uint256 k; // Slippage factor (0.5 = 500000000000000000, lower = less slippage) + bool isOpenTWAP; // Enable TWAP oracle for price discovery + uint256 createdAt; + } + + mapping(address => PoolConfig) public poolConfigs; + address[] public allPools; + + /// @notice Optional ReserveSystem for oracle-backed mid price (base/quote in reserve system) + IReserveSystem public reserveSystem; + + event PoolCreated( + address indexed pool, + address indexed baseToken, + address indexed quoteToken, + address creator + ); + event LiquidityAdded( + address indexed pool, + address indexed provider, + uint256 baseAmount, + uint256 quoteAmount, + uint256 lpShares + ); + event SwapExecuted( + address indexed pool, + address indexed tokenIn, + address indexed tokenOut, + uint256 amountIn, + uint256 amountOut, + address trader + ); + event PoolRemoved(address indexed pool); + event ReserveSystemSet(address indexed reserveSystem); + event PoolImported( + address indexed pool, + address indexed baseToken, + address indexed quoteToken, + address importer + ); + + constructor( + address admin, + address dodoVendingMachine_, + address dodoApprove_, + address officialUSDT_, + address officialUSDC_, + address compliantUSDT_, + address compliantUSDC_ + ) { + require(admin != address(0), "DODOPMMIntegration: zero admin"); + require(dodoVendingMachine_ != address(0), "DODOPMMIntegration: zero DVM"); + require(officialUSDT_ != address(0), "DODOPMMIntegration: zero USDT"); + require(officialUSDC_ != address(0), "DODOPMMIntegration: zero USDC"); + require(compliantUSDT_ != address(0), "DODOPMMIntegration: zero cUSDT"); + require(compliantUSDC_ != address(0), "DODOPMMIntegration: zero cUSDC"); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + _grantRole(SWAP_OPERATOR_ROLE, admin); + + dodoVendingMachine = dodoVendingMachine_; + dodoApprove = dodoApprove_; + officialUSDT = officialUSDT_; + officialUSDC = officialUSDC_; + compliantUSDT = compliantUSDT_; + compliantUSDC = compliantUSDC_; + } + + /** + * @notice Create DODO PMM pool for cUSDT/USDT pair + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage, higher = more slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTUSDTPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][officialUSDT] == address(0), "DODOPMMIntegration: pool exists"); + + // Create DVM pool using DODO Vending Machine + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + officialUSDT, // quoteToken (USDT) + lpFeeRate, // LP fee rate + initialPrice, // Initial price + k, // Slippage factor + isOpenTWAP // Enable TWAP + ); + + _recordPool(pool, compliantUSDT, officialUSDT, lpFeeRate, initialPrice, k, isOpenTWAP); + + emit PoolCreated(pool, compliantUSDT, officialUSDT, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDC/USDC pair + * @param lpFeeRate Liquidity provider fee rate (basis points) + * @param initialPrice Initial price (1e18 = $1) + * @param k Slippage factor + * @param isOpenTWAP Enable TWAP oracle + */ + function createCUSDCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDC][officialUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDC, + officialUSDC, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + _recordPool(pool, compliantUSDC, officialUSDC, lpFeeRate, initialPrice, k, isOpenTWAP); + + emit PoolCreated(pool, compliantUSDC, officialUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDT/cUSDC pair (public liquidity per VAULT_SYSTEM_MASTER_TECHNICAL_PLAN §4) + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][compliantUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + compliantUSDC, // quoteToken (cUSDC) + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + _recordPool(pool, compliantUSDT, compliantUSDC, lpFeeRate, initialPrice, k, isOpenTWAP); + + emit PoolCreated(pool, compliantUSDT, compliantUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for any base/quote token pair (generic) + * @param baseToken Base token address + * @param quoteToken Quote token address + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoins) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createPool( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(baseToken != address(0), "DODOPMMIntegration: zero base"); + require(quoteToken != address(0), "DODOPMMIntegration: zero quote"); + require(baseToken != quoteToken, "DODOPMMIntegration: same token"); + require(pools[baseToken][quoteToken] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + baseToken, + quoteToken, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + _recordPool(pool, baseToken, quoteToken, lpFeeRate, initialPrice, k, isOpenTWAP); + + emit PoolCreated(pool, baseToken, quoteToken, msg.sender); + } + + /** + * @notice Import an already-deployed DODO PMM pool into integration state. + * @dev Use this when the pool exists at the DODO/provider layer but was not + * recorded in the integration mappings or allPools inventory. + */ + function importExistingPool( + address pool, + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) { + require(pool != address(0), "DODOPMMIntegration: zero pool"); + require(baseToken != address(0), "DODOPMMIntegration: zero base"); + require(quoteToken != address(0), "DODOPMMIntegration: zero quote"); + require(baseToken != quoteToken, "DODOPMMIntegration: same token"); + require(pools[baseToken][quoteToken] == address(0), "DODOPMMIntegration: pair already recorded"); + require(!isRegisteredPool[pool], "DODOPMMIntegration: pool already registered"); + + address actualBase = IDODOPMMPool(pool)._BASE_TOKEN_(); + address actualQuote = IDODOPMMPool(pool)._QUOTE_TOKEN_(); + bool matchesForward = actualBase == baseToken && actualQuote == quoteToken; + bool matchesReverse = actualBase == quoteToken && actualQuote == baseToken; + require(matchesForward || matchesReverse, "DODOPMMIntegration: pool token mismatch"); + + if (matchesReverse) { + (baseToken, quoteToken) = (quoteToken, baseToken); + } + + _recordPool(pool, baseToken, quoteToken, lpFeeRate, initialPrice, k, isOpenTWAP); + emit PoolImported(pool, baseToken, quoteToken, msg.sender); + } + + /** + * @notice Add liquidity to a DODO PMM pool + * @param pool Pool address + * @param baseAmount Amount of base token to deposit + * @param quoteAmount Amount of quote token to deposit + */ + function addLiquidity( + address pool, + uint256 baseAmount, + uint256 quoteAmount + ) external nonReentrant returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(baseAmount > 0 && quoteAmount > 0, "DODOPMMIntegration: zero amount"); + + PoolConfig memory config = poolConfigs[pool]; + + // Transfer tokens to pool (DODO pools handle their own token management) + IERC20(config.baseToken).safeTransferFrom(msg.sender, pool, baseAmount); + IERC20(config.quoteToken).safeTransferFrom(msg.sender, pool, quoteAmount); + + // Call buyShares on DODO pool to add liquidity + (baseShare, quoteShare, lpShare) = IDODOPMMPool(pool).buyShares(msg.sender); + + emit LiquidityAdded(pool, msg.sender, baseAmount, quoteAmount, lpShare); + } + + /** + * @notice Swap cUSDT for official USDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDT to sell + * @param minAmountOut Minimum amount of USDT to receive (slippage protection) + */ + function swapCUSDTForUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer cUSDT to pool + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell base token) + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDT, officialUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDT for cUSDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDT to sell + * @param minAmountOut Minimum amount of cUSDT to receive + */ + function swapUSDTForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer USDT to pool + IERC20(officialUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell quote token) + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDT, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for official USDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDC to sell + * @param minAmountOut Minimum amount of USDC to receive + */ + function swapCUSDCForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDC, officialUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDC for cUSDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDC to sell + * @param minAmountOut Minimum amount of cUSDC to receive + */ + function swapUSDCForCUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(officialUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDC, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDT for cUSDC via cUSDT/cUSDC DODO PMM pool (public liquidity pair per Master Plan §4) + */ + function swapCUSDTForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(compliantUSDC).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, compliantUSDT, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for cUSDT via cUSDT/cUSDC DODO PMM pool + */ + function swapUSDCForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(compliantUSDT).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, compliantUSDC, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Generic swap for any registered pool (full mesh routing). + * @param pool Pool address + * @param tokenIn Token to sell + * @param amountIn Amount of tokenIn + * @param minAmountOut Minimum amount of tokenOut to receive + * @return amountOut Amount of quote/base token received (sent to msg.sender) + */ + function swapExactIn( + address pool, + address tokenIn, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + PoolConfig memory config = poolConfigs[pool]; + address tokenOut; + if (tokenIn == config.baseToken) { + tokenOut = config.quoteToken; + IERC20(tokenIn).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + } else if (tokenIn == config.quoteToken) { + tokenOut = config.baseToken; + IERC20(tokenIn).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + } else { + revert("DODOPMMIntegration: token not in pool"); + } + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(tokenOut).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, tokenIn, tokenOut, amountIn, amountOut, msg.sender); + } + + /** + * @notice Set optional ReserveSystem for oracle-backed mid price + * @param reserveSystem_ ReserveSystem address (address(0) to disable) + */ + function setReserveSystem(address reserveSystem_) external onlyRole(DEFAULT_ADMIN_ROLE) { + reserveSystem = IReserveSystem(reserveSystem_); + emit ReserveSystemSet(reserveSystem_); + } + + /** + * @notice Get pool price: oracle (ReserveSystem) if configured and available, else pool getMidPrice() + * @param pool Pool address + * @return price Price in 18 decimals (quote per base; 1e18 = $1 for stablecoins) + */ + function getPoolPriceOrOracle(address pool) public view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + if (address(reserveSystem) != address(0)) { + PoolConfig memory config = poolConfigs[pool]; + try reserveSystem.getConversionPrice(config.baseToken, config.quoteToken) returns (uint256 oraclePrice) { + if (oraclePrice > 0) return oraclePrice; + } catch { } + } + return IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get current pool price (pool mid only; use getPoolPriceOrOracle for oracle-backed price) + * @param pool Pool address + * @return price Current mid price (1e18 = $1 for stablecoins) + */ + function getPoolPrice(address pool) external view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + price = IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get pool reserves + * @param pool Pool address + * @return baseReserve Base token reserve + * @return quoteReserve Quote token reserve + */ + function getPoolReserves(address pool) external view returns (uint256 baseReserve, uint256 quoteReserve) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + (baseReserve, quoteReserve) = IDODOPMMPool(pool).getVaultReserve(); + } + + /** + * @notice Get pool configuration + * @param pool Pool address + * @return config Pool configuration struct + */ + function getPoolConfig(address pool) external view returns (PoolConfig memory config) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + config = poolConfigs[pool]; + } + + /** + * @notice Get all registered pools + * @return List of all pool addresses + */ + function getAllPools() external view returns (address[] memory) { + return allPools; + } + + /** + * @notice Remove pool (emergency only) + * @param pool Pool address to remove + */ + function removePool(address pool) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + + PoolConfig memory config = poolConfigs[pool]; + pools[config.baseToken][config.quoteToken] = address(0); + pools[config.quoteToken][config.baseToken] = address(0); + isRegisteredPool[pool] = false; + + delete poolConfigs[pool]; + + emit PoolRemoved(pool); + } + + function _recordPool( + address pool, + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) internal { + pools[baseToken][quoteToken] = pool; + pools[quoteToken][baseToken] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: baseToken, + quoteToken: quoteToken, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + } +} diff --git a/verification-sources/chain138-dodo-historical/contracts/liquidity/interfaces/ILiquidityProvider.sol b/verification-sources/chain138-dodo-historical/contracts/liquidity/interfaces/ILiquidityProvider.sol new file mode 100644 index 0000000..4d63902 --- /dev/null +++ b/verification-sources/chain138-dodo-historical/contracts/liquidity/interfaces/ILiquidityProvider.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +interface ILiquidityProvider { + function getQuote(address tokenIn, address tokenOut, uint256 amountIn) + external view returns (uint256 amountOut, uint256 slippageBps); + function executeSwap(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut) + external returns (uint256 amountOut); + function supportsTokenPair(address tokenIn, address tokenOut) external view returns (bool); + function providerName() external pure returns (string memory); + function estimateGas(address tokenIn, address tokenOut, uint256 amountIn) external view returns (uint256); +} diff --git a/verification-sources/chain138-dodo-historical/contracts/liquidity/providers/DODOPMMProvider.sol b/verification-sources/chain138-dodo-historical/contracts/liquidity/providers/DODOPMMProvider.sol new file mode 100644 index 0000000..1a10561 --- /dev/null +++ b/verification-sources/chain138-dodo-historical/contracts/liquidity/providers/DODOPMMProvider.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "../interfaces/ILiquidityProvider.sol"; +import "../../dex/DODOPMMIntegration.sol"; + +/** + * @title DODOPMMProvider + * @notice Wrapper for DODO PMM with extended functionality + * @dev Implements ILiquidityProvider for multi-provider liquidity system + */ +contract DODOPMMProvider is ILiquidityProvider, AccessControl { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + + DODOPMMIntegration public dodoIntegration; + + // Pool tracking + mapping(address => mapping(address => address)) public pools; // tokenIn => tokenOut => pool + mapping(address => bool) public isKnownPool; + + event PoolCreated(address indexed tokenIn, address indexed tokenOut, address pool); + event PoolOptimized(address indexed pool, uint256 newK, uint256 newI); + + constructor(address _dodoIntegration, address admin) { + require(_dodoIntegration != address(0), "Zero address"); + + dodoIntegration = DODOPMMIntegration(_dodoIntegration); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + } + + /** + * @notice Get quote from DODO PMM + */ + function getQuote( + address tokenIn, + address tokenOut, + uint256 amountIn + ) external view override returns (uint256 amountOut, uint256 slippageBps) { + address pool = pools[tokenIn][tokenOut]; + + if (pool == address(0)) { + return (0, 10000); // No pool, 100% slippage + } + + try dodoIntegration.getPoolPriceOrOracle(pool) returns (uint256 price) { + // Simple calculation (in production, would use actual DODO math) + amountOut = (amountIn * price) / 1e18; + slippageBps = 30; // 0.3% typical for stablecoin pools + return (amountOut, slippageBps); + } catch { + return (0, 10000); + } + } + + /** + * @notice Execute swap via DODO PMM + */ + function executeSwap( + address tokenIn, + address tokenOut, + uint256 amountIn, + uint256 minAmountOut + ) external override returns (uint256 amountOut) { + // Get pool for token pair + address pool = pools[tokenIn][tokenOut]; + require(pool != address(0), "Pool not found"); + + // Transfer tokens from caller + IERC20(tokenIn).safeTransferFrom(msg.sender, address(this), amountIn); + + // Route to appropriate swap method: use dedicated methods for the 6 legacy pairs, + // otherwise use generic swapExactIn for full-mesh routing (any registered pool). + if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.officialUSDT()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapCUSDTForUSDT(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.officialUSDT() && tokenOut == dodoIntegration.compliantUSDT()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapUSDTForCUSDT(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.officialUSDC()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapCUSDCForUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.officialUSDC() && tokenOut == dodoIntegration.compliantUSDC()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapUSDCForCUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.compliantUSDC()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapCUSDTForUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.compliantUSDT()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapUSDCForCUSDT(pool, amountIn, minAmountOut); + } else { + // Full mesh: any registered pool (c* vs c*, c* vs official, etc.) + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapExactIn(pool, tokenIn, amountIn, minAmountOut); + } + + // Transfer output tokens to caller + IERC20(tokenOut).safeTransfer(msg.sender, amountOut); + + return amountOut; + } + + /** + * @notice Check if provider supports token pair + */ + function supportsTokenPair( + address tokenIn, + address tokenOut + ) external view override returns (bool) { + return pools[tokenIn][tokenOut] != address(0); + } + + /** + * @notice Get provider name + */ + function providerName() external pure override returns (string memory) { + return "DODO PMM"; + } + + /** + * @notice Estimate gas for swap + */ + function estimateGas( + address, + address, + uint256 + ) external pure override returns (uint256) { + return 150000; // Typical gas for DODO swap + } + + /** + * @notice Ensure pool exists for token pair + */ + function ensurePoolExists(address tokenIn, address tokenOut) external onlyRole(POOL_MANAGER_ROLE) { + if (pools[tokenIn][tokenOut] == address(0)) { + _createOptimalPool(tokenIn, tokenOut); + } + } + + /// @dev Default params for stablecoin pairs: 0.03% fee, 1:1 price, k=0.5e18 + uint256 private constant DEFAULT_LP_FEE = 3; + uint256 private constant DEFAULT_I = 1e18; + uint256 private constant DEFAULT_K = 0.5e18; + + /** + * @notice Create optimal DODO pool via DODOPMMIntegration + * @dev Requires DODOPMMIntegration to grant POOL_MANAGER_ROLE to this contract + */ + function _createOptimalPool(address tokenIn, address tokenOut) internal { + address pool = dodoIntegration.createPool( + tokenIn, + tokenOut, + DEFAULT_LP_FEE, + DEFAULT_I, + DEFAULT_K, + false // isOpenTWAP - disable for stablecoins + ); + pools[tokenIn][tokenOut] = pool; + pools[tokenOut][tokenIn] = pool; + isKnownPool[pool] = true; + emit PoolCreated(tokenIn, tokenOut, pool); + } + + /** + * @notice Register existing pool + */ + function registerPool( + address tokenIn, + address tokenOut, + address pool + ) external onlyRole(POOL_MANAGER_ROLE) { + require(pool != address(0), "Zero address"); + + pools[tokenIn][tokenOut] = pool; + isKnownPool[pool] = true; + + emit PoolCreated(tokenIn, tokenOut, pool); + } + + /** + * @notice Optimize pool parameters (K, I) + * @dev DODO PMM parameters are typically oracle-driven; DVM pools may expose + * setK/setI. Emits for off-chain monitoring. If the pool supports + * parameter updates, extend this to call the pool's update functions. + */ + function optimizePoolParameters( + address pool, + uint256 newK, + uint256 newI + ) external onlyRole(POOL_MANAGER_ROLE) { + require(isKnownPool[pool], "Unknown pool"); + // DODO DVM/PMM: parameters set at creation; oracle-driven rebalancing. + // Emit for observability; integrate pool.setK/setI when supported. + emit PoolOptimized(pool, newK, newI); + } +} diff --git a/verification-sources/chain138-dodo-historical/contracts/reserve/IReserveSystem.sol b/verification-sources/chain138-dodo-historical/contracts/reserve/IReserveSystem.sol new file mode 100644 index 0000000..c23f819 --- /dev/null +++ b/verification-sources/chain138-dodo-historical/contracts/reserve/IReserveSystem.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IReserveSystem + * @notice Interface for the GRU Reserve System + * @dev Defines the core functionality for reserve management, conversion, and redemption + */ +interface IReserveSystem { + // ============ Events ============ + + event ReserveDeposited( + address indexed asset, + uint256 amount, + address indexed depositor, + bytes32 indexed reserveId + ); + + event ReserveWithdrawn( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed reserveId + ); + + event ConversionExecuted( + address indexed sourceAsset, + address indexed targetAsset, + uint256 sourceAmount, + uint256 targetAmount, + bytes32 indexed conversionId, + uint256 fees + ); + + event RedemptionExecuted( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed redemptionId + ); + + event PriceFeedUpdated( + address indexed asset, + uint256 price, + uint256 timestamp + ); + + // ============ Reserve Management ============ + + /** + * @notice Deposit assets into the reserve system + * @param asset Address of the asset to deposit + * @param amount Amount to deposit + * @return reserveId Unique identifier for this reserve deposit + */ + function depositReserve( + address asset, + uint256 amount + ) external returns (bytes32 reserveId); + + /** + * @notice Withdraw assets from the reserve system + * @param asset Address of the asset to withdraw + * @param amount Amount to withdraw + * @param recipient Address to receive the withdrawn assets + * @return reserveId Unique identifier for this reserve withdrawal + */ + function withdrawReserve( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 reserveId); + + /** + * @notice Get the total reserve balance for an asset + * @param asset Address of the asset + * @return balance Total reserve balance + */ + function getReserveBalance(address asset) external view returns (uint256 balance); + + /** + * @notice Get reserve balance for a specific reserve ID + * @param reserveId Unique identifier for the reserve + * @return asset Address of the asset + * @return balance Reserve balance + */ + function getReserveById(bytes32 reserveId) external view returns (address asset, uint256 balance); + + // ============ Conversion ============ + + /** + * @notice Convert assets using optimal path (XAU triangulation) + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return conversionId Unique identifier for this conversion + * @return targetAmount Amount received after conversion + * @return fees Total fees charged + */ + function convertAssets( + address sourceAsset, + address targetAsset, + uint256 amount + ) external returns ( + bytes32 conversionId, + uint256 targetAmount, + uint256 fees + ); + + /** + * @notice Calculate conversion amount without executing + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return targetAmount Expected amount after conversion + * @return fees Expected fees + * @return path Optimal conversion path + */ + function calculateConversion( + address sourceAsset, + address targetAsset, + uint256 amount + ) external view returns ( + uint256 targetAmount, + uint256 fees, + address[] memory path + ); + + // ============ Redemption ============ + + /** + * @notice Redeem assets from the reserve system + * @param asset Address of the asset to redeem + * @param amount Amount to redeem + * @param recipient Address to receive the redeemed assets + * @return redemptionId Unique identifier for this redemption + */ + function redeem( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 redemptionId); + + // ============ Price Feeds ============ + + /** + * @notice Update price feed for an asset + * @param asset Address of the asset + * @param price Current price + * @param timestamp Price timestamp + */ + function updatePriceFeed( + address asset, + uint256 price, + uint256 timestamp + ) external; + + /** + * @notice Get current price for an asset + * @param asset Address of the asset + * @return price Current price + * @return timestamp Price timestamp + */ + function getPrice(address asset) external view returns (uint256 price, uint256 timestamp); + + /** + * @notice Get price for conversion between two assets + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @return price Conversion price (target per source) + */ + function getConversionPrice( + address sourceAsset, + address targetAsset + ) external view returns (uint256 price); +} + diff --git a/verification-sources/chain138-dodo-historical/foundry.toml b/verification-sources/chain138-dodo-historical/foundry.toml new file mode 100644 index 0000000..bac13a8 --- /dev/null +++ b/verification-sources/chain138-dodo-historical/foundry.toml @@ -0,0 +1,15 @@ +[profile.default] +src = "contracts" +out = "out" +cache_path = "cache" +libs = ["../../lib", "../../node_modules"] +solc = "0.8.20" +optimizer = true +optimizer_runs = 200 +via_ir = false +evm_version = "paris" +auto_detect_remappings = false +remappings = [ + "@openzeppelin/=../../node_modules/@openzeppelin/", + "forge-std/=../../lib/forge-std/src/" +] diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration.standard.json b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration.standard.json new file mode 100644 index 0000000..982af79 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration.standard.json @@ -0,0 +1 @@ +{"language":"Solidity","sources":{"contracts/dex/DODOPMMIntegration.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.19;\n\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport \"../reserve/IReserveSystem.sol\";\n\n/**\n * @title DODO PMM Pool Interface\n * @notice Simplified interface for DODO Proactive Market Maker pools\n * @dev Actual DODO interfaces may vary - this is a simplified version\n */\ninterface IDODOPMMPool {\n function _BASE_TOKEN_() external view returns (address);\n function _QUOTE_TOKEN_() external view returns (address);\n function sellBase(uint256 amount) external returns (uint256);\n function sellQuote(uint256 amount) external returns (uint256);\n function buyShares(address to) external returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare);\n function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve);\n function getMidPrice() external view returns (uint256);\n function _QUOTE_RESERVE_() external view returns (uint256);\n function _BASE_RESERVE_() external view returns (uint256);\n}\n\n/**\n * @title DODO Vending Machine Interface\n * @notice Interface for creating DODO Vending Machine (DVM) pools\n */\ninterface IDODOVendingMachine {\n function createDVM(\n address baseToken,\n address quoteToken,\n uint256 lpFeeRate,\n uint256 i,\n uint256 k,\n bool isOpenTWAP\n ) external returns (address dvm);\n}\n\n/**\n * @title DODOPMMIntegration\n * @notice Integration contract for DODO PMM pools with CompliantUSDT/USDC\n * @dev Manages liquidity pools on DODO and provides swap functionality between\n * compliant tokens (cUSDT/cUSDC) and official tokens (USDT/USDC)\n * \n * This contract facilitates exchangeability between compliant and official tokens\n * through DODO's Proactive Market Maker algorithm, which maintains price stability\n * and provides efficient liquidity.\n */\ncontract DODOPMMIntegration is AccessControl, ReentrancyGuard {\n using SafeERC20 for IERC20;\n\n bytes32 public constant POOL_MANAGER_ROLE = keccak256(\"POOL_MANAGER_ROLE\");\n bytes32 public constant SWAP_OPERATOR_ROLE = keccak256(\"SWAP_OPERATOR_ROLE\");\n\n // DODO contracts\n address public immutable dodoVendingMachine;\n address public immutable dodoApprove; // DODO's approval contract for gas optimization\n\n // Token addresses\n address public immutable officialUSDT; // Official USDT on destination chain\n address public immutable officialUSDC; // Official USDC on destination chain\n address public immutable compliantUSDT; // cUSDT on Chain 138\n address public immutable compliantUSDC; // cUSDC on Chain 138\n\n // Pool mappings\n mapping(address => mapping(address => address)) public pools; // token0 => token1 => pool\n mapping(address => bool) public isRegisteredPool;\n\n // Pool configuration\n struct PoolConfig {\n address pool;\n address baseToken;\n address quoteToken;\n uint256 lpFeeRate; // Basis points (100 = 1%)\n uint256 i; // Initial price (1e18 = $1 for stablecoins)\n uint256 k; // Slippage factor (0.5 = 500000000000000000, lower = less slippage)\n bool isOpenTWAP; // Enable TWAP oracle for price discovery\n uint256 createdAt;\n }\n\n mapping(address => PoolConfig) public poolConfigs;\n address[] public allPools;\n\n /// @notice Optional ReserveSystem for oracle-backed mid price (base/quote in reserve system)\n IReserveSystem public reserveSystem;\n\n event PoolCreated(\n address indexed pool,\n address indexed baseToken,\n address indexed quoteToken,\n address creator\n );\n event LiquidityAdded(\n address indexed pool,\n address indexed provider,\n uint256 baseAmount,\n uint256 quoteAmount,\n uint256 lpShares\n );\n event SwapExecuted(\n address indexed pool,\n address indexed tokenIn,\n address indexed tokenOut,\n uint256 amountIn,\n uint256 amountOut,\n address trader\n );\n event PoolRemoved(address indexed pool);\n event ReserveSystemSet(address indexed reserveSystem);\n\n constructor(\n address admin,\n address dodoVendingMachine_,\n address dodoApprove_,\n address officialUSDT_,\n address officialUSDC_,\n address compliantUSDT_,\n address compliantUSDC_\n ) {\n require(admin != address(0), \"DODOPMMIntegration: zero admin\");\n require(dodoVendingMachine_ != address(0), \"DODOPMMIntegration: zero DVM\");\n require(officialUSDT_ != address(0), \"DODOPMMIntegration: zero USDT\");\n require(officialUSDC_ != address(0), \"DODOPMMIntegration: zero USDC\");\n require(compliantUSDT_ != address(0), \"DODOPMMIntegration: zero cUSDT\");\n require(compliantUSDC_ != address(0), \"DODOPMMIntegration: zero cUSDC\");\n\n _grantRole(DEFAULT_ADMIN_ROLE, admin);\n _grantRole(POOL_MANAGER_ROLE, admin);\n _grantRole(SWAP_OPERATOR_ROLE, admin);\n\n dodoVendingMachine = dodoVendingMachine_;\n dodoApprove = dodoApprove_;\n officialUSDT = officialUSDT_;\n officialUSDC = officialUSDC_;\n compliantUSDT = compliantUSDT_;\n compliantUSDC = compliantUSDC_;\n }\n\n /**\n * @notice Create DODO PMM pool for cUSDT/USDT pair\n * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%)\n * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs)\n * @param k Slippage factor (0.5e18 = 50%, lower = less slippage, higher = more slippage)\n * @param isOpenTWAP Enable TWAP oracle for price discovery\n */\n function createCUSDTUSDTPool(\n uint256 lpFeeRate,\n uint256 initialPrice,\n uint256 k,\n bool isOpenTWAP\n ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) {\n require(pools[compliantUSDT][officialUSDT] == address(0), \"DODOPMMIntegration: pool exists\");\n\n // Create DVM pool using DODO Vending Machine\n pool = IDODOVendingMachine(dodoVendingMachine).createDVM(\n compliantUSDT, // baseToken (cUSDT)\n officialUSDT, // quoteToken (USDT)\n lpFeeRate, // LP fee rate\n initialPrice, // Initial price\n k, // Slippage factor\n isOpenTWAP // Enable TWAP\n );\n\n // Register pool\n pools[compliantUSDT][officialUSDT] = pool;\n pools[officialUSDT][compliantUSDT] = pool;\n isRegisteredPool[pool] = true;\n allPools.push(pool);\n\n poolConfigs[pool] = PoolConfig({\n pool: pool,\n baseToken: compliantUSDT,\n quoteToken: officialUSDT,\n lpFeeRate: lpFeeRate,\n i: initialPrice,\n k: k,\n isOpenTWAP: isOpenTWAP,\n createdAt: block.timestamp\n });\n\n emit PoolCreated(pool, compliantUSDT, officialUSDT, msg.sender);\n }\n\n /**\n * @notice Create DODO PMM pool for cUSDC/USDC pair\n * @param lpFeeRate Liquidity provider fee rate (basis points)\n * @param initialPrice Initial price (1e18 = $1)\n * @param k Slippage factor\n * @param isOpenTWAP Enable TWAP oracle\n */\n function createCUSDCUSDCPool(\n uint256 lpFeeRate,\n uint256 initialPrice,\n uint256 k,\n bool isOpenTWAP\n ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) {\n require(pools[compliantUSDC][officialUSDC] == address(0), \"DODOPMMIntegration: pool exists\");\n\n pool = IDODOVendingMachine(dodoVendingMachine).createDVM(\n compliantUSDC,\n officialUSDC,\n lpFeeRate,\n initialPrice,\n k,\n isOpenTWAP\n );\n\n pools[compliantUSDC][officialUSDC] = pool;\n pools[officialUSDC][compliantUSDC] = pool;\n isRegisteredPool[pool] = true;\n allPools.push(pool);\n\n poolConfigs[pool] = PoolConfig({\n pool: pool,\n baseToken: compliantUSDC,\n quoteToken: officialUSDC,\n lpFeeRate: lpFeeRate,\n i: initialPrice,\n k: k,\n isOpenTWAP: isOpenTWAP,\n createdAt: block.timestamp\n });\n\n emit PoolCreated(pool, compliantUSDC, officialUSDC, msg.sender);\n }\n\n /**\n * @notice Create DODO PMM pool for cUSDT/cUSDC pair (public liquidity per VAULT_SYSTEM_MASTER_TECHNICAL_PLAN §4)\n * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%)\n * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs)\n * @param k Slippage factor (0.5e18 = 50%, lower = less slippage)\n * @param isOpenTWAP Enable TWAP oracle for price discovery\n */\n function createCUSDTCUSDCPool(\n uint256 lpFeeRate,\n uint256 initialPrice,\n uint256 k,\n bool isOpenTWAP\n ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) {\n require(pools[compliantUSDT][compliantUSDC] == address(0), \"DODOPMMIntegration: pool exists\");\n\n pool = IDODOVendingMachine(dodoVendingMachine).createDVM(\n compliantUSDT, // baseToken (cUSDT)\n compliantUSDC, // quoteToken (cUSDC)\n lpFeeRate,\n initialPrice,\n k,\n isOpenTWAP\n );\n\n pools[compliantUSDT][compliantUSDC] = pool;\n pools[compliantUSDC][compliantUSDT] = pool;\n isRegisteredPool[pool] = true;\n allPools.push(pool);\n\n poolConfigs[pool] = PoolConfig({\n pool: pool,\n baseToken: compliantUSDT,\n quoteToken: compliantUSDC,\n lpFeeRate: lpFeeRate,\n i: initialPrice,\n k: k,\n isOpenTWAP: isOpenTWAP,\n createdAt: block.timestamp\n });\n\n emit PoolCreated(pool, compliantUSDT, compliantUSDC, msg.sender);\n }\n\n /**\n * @notice Create DODO PMM pool for any base/quote token pair (generic)\n * @param baseToken Base token address\n * @param quoteToken Quote token address\n * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%)\n * @param initialPrice Initial price (1e18 = $1 for stablecoins)\n * @param k Slippage factor (0.5e18 = 50%, lower = less slippage)\n * @param isOpenTWAP Enable TWAP oracle for price discovery\n */\n function createPool(\n address baseToken,\n address quoteToken,\n uint256 lpFeeRate,\n uint256 initialPrice,\n uint256 k,\n bool isOpenTWAP\n ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) {\n require(baseToken != address(0), \"DODOPMMIntegration: zero base\");\n require(quoteToken != address(0), \"DODOPMMIntegration: zero quote\");\n require(baseToken != quoteToken, \"DODOPMMIntegration: same token\");\n require(pools[baseToken][quoteToken] == address(0), \"DODOPMMIntegration: pool exists\");\n\n pool = IDODOVendingMachine(dodoVendingMachine).createDVM(\n baseToken,\n quoteToken,\n lpFeeRate,\n initialPrice,\n k,\n isOpenTWAP\n );\n\n pools[baseToken][quoteToken] = pool;\n pools[quoteToken][baseToken] = pool;\n isRegisteredPool[pool] = true;\n allPools.push(pool);\n\n poolConfigs[pool] = PoolConfig({\n pool: pool,\n baseToken: baseToken,\n quoteToken: quoteToken,\n lpFeeRate: lpFeeRate,\n i: initialPrice,\n k: k,\n isOpenTWAP: isOpenTWAP,\n createdAt: block.timestamp\n });\n\n emit PoolCreated(pool, baseToken, quoteToken, msg.sender);\n }\n\n /**\n * @notice Add liquidity to a DODO PMM pool\n * @param pool Pool address\n * @param baseAmount Amount of base token to deposit\n * @param quoteAmount Amount of quote token to deposit\n */\n function addLiquidity(\n address pool,\n uint256 baseAmount,\n uint256 quoteAmount\n ) external nonReentrant returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(baseAmount > 0 && quoteAmount > 0, \"DODOPMMIntegration: zero amount\");\n \n PoolConfig memory config = poolConfigs[pool];\n\n // Transfer tokens to pool (DODO pools handle their own token management)\n IERC20(config.baseToken).safeTransferFrom(msg.sender, pool, baseAmount);\n IERC20(config.quoteToken).safeTransferFrom(msg.sender, pool, quoteAmount);\n\n // Call buyShares on DODO pool to add liquidity\n (baseShare, quoteShare, lpShare) = IDODOPMMPool(pool).buyShares(msg.sender);\n\n emit LiquidityAdded(pool, msg.sender, baseAmount, quoteAmount, lpShare);\n }\n\n /**\n * @notice Swap cUSDT for official USDT via DODO PMM\n * @param pool Pool address\n * @param amountIn Amount of cUSDT to sell\n * @param minAmountOut Minimum amount of USDT to receive (slippage protection)\n */\n function swapCUSDTForUSDT(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].baseToken == compliantUSDT, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n // Transfer cUSDT to pool\n IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn);\n\n // Execute swap (sell base token)\n amountOut = IDODOPMMPool(pool).sellBase(amountIn);\n\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n\n emit SwapExecuted(pool, compliantUSDT, officialUSDT, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Swap official USDT for cUSDT via DODO PMM\n * @param pool Pool address\n * @param amountIn Amount of USDT to sell\n * @param minAmountOut Minimum amount of cUSDT to receive\n */\n function swapUSDTForCUSDT(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].quoteToken == officialUSDT, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n // Transfer USDT to pool\n IERC20(officialUSDT).safeTransferFrom(msg.sender, pool, amountIn);\n\n // Execute swap (sell quote token)\n amountOut = IDODOPMMPool(pool).sellQuote(amountIn);\n\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n\n emit SwapExecuted(pool, officialUSDT, compliantUSDT, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Swap cUSDC for official USDC via DODO PMM\n * @param pool Pool address\n * @param amountIn Amount of cUSDC to sell\n * @param minAmountOut Minimum amount of USDC to receive\n */\n function swapCUSDCForUSDC(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].baseToken == compliantUSDC, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellBase(amountIn);\n\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n\n emit SwapExecuted(pool, compliantUSDC, officialUSDC, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Swap official USDC for cUSDC via DODO PMM\n * @param pool Pool address\n * @param amountIn Amount of USDC to sell\n * @param minAmountOut Minimum amount of cUSDC to receive\n */\n function swapUSDCForCUSDC(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].quoteToken == officialUSDC, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n IERC20(officialUSDC).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellQuote(amountIn);\n\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n\n emit SwapExecuted(pool, officialUSDC, compliantUSDC, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Swap cUSDT for cUSDC via cUSDT/cUSDC DODO PMM pool (public liquidity pair per Master Plan §4)\n */\n function swapCUSDTForUSDC(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellBase(amountIn);\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n IERC20(compliantUSDC).safeTransfer(msg.sender, amountOut);\n emit SwapExecuted(pool, compliantUSDT, compliantUSDC, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Swap cUSDC for cUSDT via cUSDT/cUSDC DODO PMM pool\n */\n function swapUSDCForCUSDT(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellQuote(amountIn);\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n IERC20(compliantUSDT).safeTransfer(msg.sender, amountOut);\n emit SwapExecuted(pool, compliantUSDC, compliantUSDT, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Generic swap for any registered pool (full mesh routing).\n * @param pool Pool address\n * @param tokenIn Token to sell\n * @param amountIn Amount of tokenIn\n * @param minAmountOut Minimum amount of tokenOut to receive\n * @return amountOut Amount of quote/base token received (sent to msg.sender)\n */\n function swapExactIn(\n address pool,\n address tokenIn,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n PoolConfig memory config = poolConfigs[pool];\n address tokenOut;\n if (tokenIn == config.baseToken) {\n tokenOut = config.quoteToken;\n IERC20(tokenIn).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellBase(amountIn);\n } else if (tokenIn == config.quoteToken) {\n tokenOut = config.baseToken;\n IERC20(tokenIn).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellQuote(amountIn);\n } else {\n revert(\"DODOPMMIntegration: token not in pool\");\n }\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n IERC20(tokenOut).safeTransfer(msg.sender, amountOut);\n emit SwapExecuted(pool, tokenIn, tokenOut, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Set optional ReserveSystem for oracle-backed mid price\n * @param reserveSystem_ ReserveSystem address (address(0) to disable)\n */\n function setReserveSystem(address reserveSystem_) external onlyRole(DEFAULT_ADMIN_ROLE) {\n reserveSystem = IReserveSystem(reserveSystem_);\n emit ReserveSystemSet(reserveSystem_);\n }\n\n /**\n * @notice Get pool price: oracle (ReserveSystem) if configured and available, else pool getMidPrice()\n * @param pool Pool address\n * @return price Price in 18 decimals (quote per base; 1e18 = $1 for stablecoins)\n */\n function getPoolPriceOrOracle(address pool) public view returns (uint256 price) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n if (address(reserveSystem) != address(0)) {\n PoolConfig memory config = poolConfigs[pool];\n try reserveSystem.getConversionPrice(config.baseToken, config.quoteToken) returns (uint256 oraclePrice) {\n if (oraclePrice > 0) return oraclePrice;\n } catch { }\n }\n return IDODOPMMPool(pool).getMidPrice();\n }\n\n /**\n * @notice Get current pool price (pool mid only; use getPoolPriceOrOracle for oracle-backed price)\n * @param pool Pool address\n * @return price Current mid price (1e18 = $1 for stablecoins)\n */\n function getPoolPrice(address pool) external view returns (uint256 price) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n price = IDODOPMMPool(pool).getMidPrice();\n }\n\n /**\n * @notice Get pool reserves\n * @param pool Pool address\n * @return baseReserve Base token reserve\n * @return quoteReserve Quote token reserve\n */\n function getPoolReserves(address pool) external view returns (uint256 baseReserve, uint256 quoteReserve) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n (baseReserve, quoteReserve) = IDODOPMMPool(pool).getVaultReserve();\n }\n\n /**\n * @notice Get pool configuration\n * @param pool Pool address\n * @return config Pool configuration struct\n */\n function getPoolConfig(address pool) external view returns (PoolConfig memory config) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n config = poolConfigs[pool];\n }\n\n /**\n * @notice Get all registered pools\n * @return List of all pool addresses\n */\n function getAllPools() external view returns (address[] memory) {\n return allPools;\n }\n\n /**\n * @notice Remove pool (emergency only)\n * @param pool Pool address to remove\n */\n function removePool(address pool) external onlyRole(DEFAULT_ADMIN_ROLE) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n \n PoolConfig memory config = poolConfigs[pool];\n pools[config.baseToken][config.quoteToken] = address(0);\n pools[config.quoteToken][config.baseToken] = address(0);\n isRegisteredPool[pool] = false;\n \n delete poolConfigs[pool];\n \n emit PoolRemoved(pool);\n }\n}\n\n"},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC20Permit} from \"../extensions/IERC20Permit.sol\";\nimport {Address} from \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n /**\n * @dev An operation with an ERC20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data);\n if (returndata.length != 0 && !abi.decode(returndata, (bool))) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;\n }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"},"contracts/reserve/IReserveSystem.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/**\n * @title IReserveSystem\n * @notice Interface for the GRU Reserve System\n * @dev Defines the core functionality for reserve management, conversion, and redemption\n */\ninterface IReserveSystem {\n // ============ Events ============\n\n event ReserveDeposited(\n address indexed asset,\n uint256 amount,\n address indexed depositor,\n bytes32 indexed reserveId\n );\n\n event ReserveWithdrawn(\n address indexed asset,\n uint256 amount,\n address indexed recipient,\n bytes32 indexed reserveId\n );\n\n event ConversionExecuted(\n address indexed sourceAsset,\n address indexed targetAsset,\n uint256 sourceAmount,\n uint256 targetAmount,\n bytes32 indexed conversionId,\n uint256 fees\n );\n\n event RedemptionExecuted(\n address indexed asset,\n uint256 amount,\n address indexed recipient,\n bytes32 indexed redemptionId\n );\n\n event PriceFeedUpdated(\n address indexed asset,\n uint256 price,\n uint256 timestamp\n );\n\n // ============ Reserve Management ============\n\n /**\n * @notice Deposit assets into the reserve system\n * @param asset Address of the asset to deposit\n * @param amount Amount to deposit\n * @return reserveId Unique identifier for this reserve deposit\n */\n function depositReserve(\n address asset,\n uint256 amount\n ) external returns (bytes32 reserveId);\n\n /**\n * @notice Withdraw assets from the reserve system\n * @param asset Address of the asset to withdraw\n * @param amount Amount to withdraw\n * @param recipient Address to receive the withdrawn assets\n * @return reserveId Unique identifier for this reserve withdrawal\n */\n function withdrawReserve(\n address asset,\n uint256 amount,\n address recipient\n ) external returns (bytes32 reserveId);\n\n /**\n * @notice Get the total reserve balance for an asset\n * @param asset Address of the asset\n * @return balance Total reserve balance\n */\n function getReserveBalance(address asset) external view returns (uint256 balance);\n\n /**\n * @notice Get reserve balance for a specific reserve ID\n * @param reserveId Unique identifier for the reserve\n * @return asset Address of the asset\n * @return balance Reserve balance\n */\n function getReserveById(bytes32 reserveId) external view returns (address asset, uint256 balance);\n\n // ============ Conversion ============\n\n /**\n * @notice Convert assets using optimal path (XAU triangulation)\n * @param sourceAsset Address of the source asset\n * @param targetAsset Address of the target asset\n * @param amount Amount to convert\n * @return conversionId Unique identifier for this conversion\n * @return targetAmount Amount received after conversion\n * @return fees Total fees charged\n */\n function convertAssets(\n address sourceAsset,\n address targetAsset,\n uint256 amount\n ) external returns (\n bytes32 conversionId,\n uint256 targetAmount,\n uint256 fees\n );\n\n /**\n * @notice Calculate conversion amount without executing\n * @param sourceAsset Address of the source asset\n * @param targetAsset Address of the target asset\n * @param amount Amount to convert\n * @return targetAmount Expected amount after conversion\n * @return fees Expected fees\n * @return path Optimal conversion path\n */\n function calculateConversion(\n address sourceAsset,\n address targetAsset,\n uint256 amount\n ) external view returns (\n uint256 targetAmount,\n uint256 fees,\n address[] memory path\n );\n\n // ============ Redemption ============\n\n /**\n * @notice Redeem assets from the reserve system\n * @param asset Address of the asset to redeem\n * @param amount Amount to redeem\n * @param recipient Address to receive the redeemed assets\n * @return redemptionId Unique identifier for this redemption\n */\n function redeem(\n address asset,\n uint256 amount,\n address recipient\n ) external returns (bytes32 redemptionId);\n\n // ============ Price Feeds ============\n\n /**\n * @notice Update price feed for an asset\n * @param asset Address of the asset\n * @param price Current price\n * @param timestamp Price timestamp\n */\n function updatePriceFeed(\n address asset,\n uint256 price,\n uint256 timestamp\n ) external;\n\n /**\n * @notice Get current price for an asset\n * @param asset Address of the asset\n * @return price Current price\n * @return timestamp Price timestamp\n */\n function getPrice(address asset) external view returns (uint256 price, uint256 timestamp);\n\n /**\n * @notice Get price for conversion between two assets\n * @param sourceAsset Address of the source asset\n * @param targetAsset Address of the target asset\n * @return price Conversion price (target per source)\n */\n function getConversionPrice(\n address sourceAsset,\n address targetAsset\n ) external view returns (uint256 price);\n}\n\n"},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n * doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n * token.safeTransferFrom(msg.sender, address(this), value);\n * ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n *\n * CAUTION: See Security Considerations above.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error AddressInsufficientBalance(address account);\n\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedInnerCall();\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert AddressInsufficientBalance(address(this));\n }\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n if (!success) {\n revert FailedInnerCall();\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {FailedInnerCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert AddressInsufficientBalance(address(this));\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an\n * unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {FailedInnerCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert FailedInnerCall();\n }\n }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"}},"settings":{"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","forge-std/=lib/forge-std/src/","ds-test/=lib/forge-std/lib/ds-test/src/","@emoney/=contracts/emoney/","@emoney-scripts/=script/emoney/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","dodo-contractV2/=lib/dodo-contractV2/","hardhat/=lib/dodo-contractV2/node_modules/hardhat/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"london","viaIR":true,"libraries":{}}} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/contracts/dex/DODOPMMIntegration.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/contracts/dex/DODOPMMIntegration.sol new file mode 100644 index 0000000..90a4b4d --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/contracts/dex/DODOPMMIntegration.sol @@ -0,0 +1,599 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../reserve/IReserveSystem.sol"; + +/** + * @title DODO PMM Pool Interface + * @notice Simplified interface for DODO Proactive Market Maker pools + * @dev Actual DODO interfaces may vary - this is a simplified version + */ +interface IDODOPMMPool { + function _BASE_TOKEN_() external view returns (address); + function _QUOTE_TOKEN_() external view returns (address); + function sellBase(uint256 amount) external returns (uint256); + function sellQuote(uint256 amount) external returns (uint256); + function buyShares(address to) external returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare); + function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve); + function getMidPrice() external view returns (uint256); + function _QUOTE_RESERVE_() external view returns (uint256); + function _BASE_RESERVE_() external view returns (uint256); +} + +/** + * @title DODO Vending Machine Interface + * @notice Interface for creating DODO Vending Machine (DVM) pools + */ +interface IDODOVendingMachine { + function createDVM( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 i, + uint256 k, + bool isOpenTWAP + ) external returns (address dvm); +} + +/** + * @title DODOPMMIntegration + * @notice Integration contract for DODO PMM pools with CompliantUSDT/USDC + * @dev Manages liquidity pools on DODO and provides swap functionality between + * compliant tokens (cUSDT/cUSDC) and official tokens (USDT/USDC) + * + * This contract facilitates exchangeability between compliant and official tokens + * through DODO's Proactive Market Maker algorithm, which maintains price stability + * and provides efficient liquidity. + */ +contract DODOPMMIntegration is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + bytes32 public constant SWAP_OPERATOR_ROLE = keccak256("SWAP_OPERATOR_ROLE"); + + // DODO contracts + address public immutable dodoVendingMachine; + address public immutable dodoApprove; // DODO's approval contract for gas optimization + + // Token addresses + address public immutable officialUSDT; // Official USDT on destination chain + address public immutable officialUSDC; // Official USDC on destination chain + address public immutable compliantUSDT; // cUSDT on Chain 138 + address public immutable compliantUSDC; // cUSDC on Chain 138 + + // Pool mappings + mapping(address => mapping(address => address)) public pools; // token0 => token1 => pool + mapping(address => bool) public isRegisteredPool; + + // Pool configuration + struct PoolConfig { + address pool; + address baseToken; + address quoteToken; + uint256 lpFeeRate; // Basis points (100 = 1%) + uint256 i; // Initial price (1e18 = $1 for stablecoins) + uint256 k; // Slippage factor (0.5 = 500000000000000000, lower = less slippage) + bool isOpenTWAP; // Enable TWAP oracle for price discovery + uint256 createdAt; + } + + mapping(address => PoolConfig) public poolConfigs; + address[] public allPools; + + /// @notice Optional ReserveSystem for oracle-backed mid price (base/quote in reserve system) + IReserveSystem public reserveSystem; + + event PoolCreated( + address indexed pool, + address indexed baseToken, + address indexed quoteToken, + address creator + ); + event LiquidityAdded( + address indexed pool, + address indexed provider, + uint256 baseAmount, + uint256 quoteAmount, + uint256 lpShares + ); + event SwapExecuted( + address indexed pool, + address indexed tokenIn, + address indexed tokenOut, + uint256 amountIn, + uint256 amountOut, + address trader + ); + event PoolRemoved(address indexed pool); + event ReserveSystemSet(address indexed reserveSystem); + + constructor( + address admin, + address dodoVendingMachine_, + address dodoApprove_, + address officialUSDT_, + address officialUSDC_, + address compliantUSDT_, + address compliantUSDC_ + ) { + require(admin != address(0), "DODOPMMIntegration: zero admin"); + require(dodoVendingMachine_ != address(0), "DODOPMMIntegration: zero DVM"); + require(officialUSDT_ != address(0), "DODOPMMIntegration: zero USDT"); + require(officialUSDC_ != address(0), "DODOPMMIntegration: zero USDC"); + require(compliantUSDT_ != address(0), "DODOPMMIntegration: zero cUSDT"); + require(compliantUSDC_ != address(0), "DODOPMMIntegration: zero cUSDC"); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + _grantRole(SWAP_OPERATOR_ROLE, admin); + + dodoVendingMachine = dodoVendingMachine_; + dodoApprove = dodoApprove_; + officialUSDT = officialUSDT_; + officialUSDC = officialUSDC_; + compliantUSDT = compliantUSDT_; + compliantUSDC = compliantUSDC_; + } + + /** + * @notice Create DODO PMM pool for cUSDT/USDT pair + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage, higher = more slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTUSDTPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][officialUSDT] == address(0), "DODOPMMIntegration: pool exists"); + + // Create DVM pool using DODO Vending Machine + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + officialUSDT, // quoteToken (USDT) + lpFeeRate, // LP fee rate + initialPrice, // Initial price + k, // Slippage factor + isOpenTWAP // Enable TWAP + ); + + // Register pool + pools[compliantUSDT][officialUSDT] = pool; + pools[officialUSDT][compliantUSDT] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDT, + quoteToken: officialUSDT, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDT, officialUSDT, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDC/USDC pair + * @param lpFeeRate Liquidity provider fee rate (basis points) + * @param initialPrice Initial price (1e18 = $1) + * @param k Slippage factor + * @param isOpenTWAP Enable TWAP oracle + */ + function createCUSDCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDC][officialUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDC, + officialUSDC, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[compliantUSDC][officialUSDC] = pool; + pools[officialUSDC][compliantUSDC] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDC, + quoteToken: officialUSDC, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDC, officialUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDT/cUSDC pair (public liquidity per VAULT_SYSTEM_MASTER_TECHNICAL_PLAN §4) + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][compliantUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + compliantUSDC, // quoteToken (cUSDC) + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[compliantUSDT][compliantUSDC] = pool; + pools[compliantUSDC][compliantUSDT] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDT, + quoteToken: compliantUSDC, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDT, compliantUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for any base/quote token pair (generic) + * @param baseToken Base token address + * @param quoteToken Quote token address + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoins) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createPool( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(baseToken != address(0), "DODOPMMIntegration: zero base"); + require(quoteToken != address(0), "DODOPMMIntegration: zero quote"); + require(baseToken != quoteToken, "DODOPMMIntegration: same token"); + require(pools[baseToken][quoteToken] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + baseToken, + quoteToken, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[baseToken][quoteToken] = pool; + pools[quoteToken][baseToken] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: baseToken, + quoteToken: quoteToken, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, baseToken, quoteToken, msg.sender); + } + + /** + * @notice Add liquidity to a DODO PMM pool + * @param pool Pool address + * @param baseAmount Amount of base token to deposit + * @param quoteAmount Amount of quote token to deposit + */ + function addLiquidity( + address pool, + uint256 baseAmount, + uint256 quoteAmount + ) external nonReentrant returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(baseAmount > 0 && quoteAmount > 0, "DODOPMMIntegration: zero amount"); + + PoolConfig memory config = poolConfigs[pool]; + + // Transfer tokens to pool (DODO pools handle their own token management) + IERC20(config.baseToken).safeTransferFrom(msg.sender, pool, baseAmount); + IERC20(config.quoteToken).safeTransferFrom(msg.sender, pool, quoteAmount); + + // Call buyShares on DODO pool to add liquidity + (baseShare, quoteShare, lpShare) = IDODOPMMPool(pool).buyShares(msg.sender); + + emit LiquidityAdded(pool, msg.sender, baseAmount, quoteAmount, lpShare); + } + + /** + * @notice Swap cUSDT for official USDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDT to sell + * @param minAmountOut Minimum amount of USDT to receive (slippage protection) + */ + function swapCUSDTForUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer cUSDT to pool + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell base token) + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDT, officialUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDT for cUSDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDT to sell + * @param minAmountOut Minimum amount of cUSDT to receive + */ + function swapUSDTForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer USDT to pool + IERC20(officialUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell quote token) + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDT, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for official USDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDC to sell + * @param minAmountOut Minimum amount of USDC to receive + */ + function swapCUSDCForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDC, officialUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDC for cUSDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDC to sell + * @param minAmountOut Minimum amount of cUSDC to receive + */ + function swapUSDCForCUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(officialUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDC, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDT for cUSDC via cUSDT/cUSDC DODO PMM pool (public liquidity pair per Master Plan §4) + */ + function swapCUSDTForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(compliantUSDC).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, compliantUSDT, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for cUSDT via cUSDT/cUSDC DODO PMM pool + */ + function swapUSDCForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(compliantUSDT).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, compliantUSDC, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Generic swap for any registered pool (full mesh routing). + * @param pool Pool address + * @param tokenIn Token to sell + * @param amountIn Amount of tokenIn + * @param minAmountOut Minimum amount of tokenOut to receive + * @return amountOut Amount of quote/base token received (sent to msg.sender) + */ + function swapExactIn( + address pool, + address tokenIn, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + PoolConfig memory config = poolConfigs[pool]; + address tokenOut; + if (tokenIn == config.baseToken) { + tokenOut = config.quoteToken; + IERC20(tokenIn).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + } else if (tokenIn == config.quoteToken) { + tokenOut = config.baseToken; + IERC20(tokenIn).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + } else { + revert("DODOPMMIntegration: token not in pool"); + } + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(tokenOut).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, tokenIn, tokenOut, amountIn, amountOut, msg.sender); + } + + /** + * @notice Set optional ReserveSystem for oracle-backed mid price + * @param reserveSystem_ ReserveSystem address (address(0) to disable) + */ + function setReserveSystem(address reserveSystem_) external onlyRole(DEFAULT_ADMIN_ROLE) { + reserveSystem = IReserveSystem(reserveSystem_); + emit ReserveSystemSet(reserveSystem_); + } + + /** + * @notice Get pool price: oracle (ReserveSystem) if configured and available, else pool getMidPrice() + * @param pool Pool address + * @return price Price in 18 decimals (quote per base; 1e18 = $1 for stablecoins) + */ + function getPoolPriceOrOracle(address pool) public view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + if (address(reserveSystem) != address(0)) { + PoolConfig memory config = poolConfigs[pool]; + try reserveSystem.getConversionPrice(config.baseToken, config.quoteToken) returns (uint256 oraclePrice) { + if (oraclePrice > 0) return oraclePrice; + } catch { } + } + return IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get current pool price (pool mid only; use getPoolPriceOrOracle for oracle-backed price) + * @param pool Pool address + * @return price Current mid price (1e18 = $1 for stablecoins) + */ + function getPoolPrice(address pool) external view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + price = IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get pool reserves + * @param pool Pool address + * @return baseReserve Base token reserve + * @return quoteReserve Quote token reserve + */ + function getPoolReserves(address pool) external view returns (uint256 baseReserve, uint256 quoteReserve) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + (baseReserve, quoteReserve) = IDODOPMMPool(pool).getVaultReserve(); + } + + /** + * @notice Get pool configuration + * @param pool Pool address + * @return config Pool configuration struct + */ + function getPoolConfig(address pool) external view returns (PoolConfig memory config) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + config = poolConfigs[pool]; + } + + /** + * @notice Get all registered pools + * @return List of all pool addresses + */ + function getAllPools() external view returns (address[] memory) { + return allPools; + } + + /** + * @notice Remove pool (emergency only) + * @param pool Pool address to remove + */ + function removePool(address pool) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + + PoolConfig memory config = poolConfigs[pool]; + pools[config.baseToken][config.quoteToken] = address(0); + pools[config.quoteToken][config.baseToken] = address(0); + isRegisteredPool[pool] = false; + + delete poolConfigs[pool]; + + emit PoolRemoved(pool); + } +} + diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/contracts/reserve/IReserveSystem.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/contracts/reserve/IReserveSystem.sol new file mode 100644 index 0000000..c23f819 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/contracts/reserve/IReserveSystem.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IReserveSystem + * @notice Interface for the GRU Reserve System + * @dev Defines the core functionality for reserve management, conversion, and redemption + */ +interface IReserveSystem { + // ============ Events ============ + + event ReserveDeposited( + address indexed asset, + uint256 amount, + address indexed depositor, + bytes32 indexed reserveId + ); + + event ReserveWithdrawn( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed reserveId + ); + + event ConversionExecuted( + address indexed sourceAsset, + address indexed targetAsset, + uint256 sourceAmount, + uint256 targetAmount, + bytes32 indexed conversionId, + uint256 fees + ); + + event RedemptionExecuted( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed redemptionId + ); + + event PriceFeedUpdated( + address indexed asset, + uint256 price, + uint256 timestamp + ); + + // ============ Reserve Management ============ + + /** + * @notice Deposit assets into the reserve system + * @param asset Address of the asset to deposit + * @param amount Amount to deposit + * @return reserveId Unique identifier for this reserve deposit + */ + function depositReserve( + address asset, + uint256 amount + ) external returns (bytes32 reserveId); + + /** + * @notice Withdraw assets from the reserve system + * @param asset Address of the asset to withdraw + * @param amount Amount to withdraw + * @param recipient Address to receive the withdrawn assets + * @return reserveId Unique identifier for this reserve withdrawal + */ + function withdrawReserve( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 reserveId); + + /** + * @notice Get the total reserve balance for an asset + * @param asset Address of the asset + * @return balance Total reserve balance + */ + function getReserveBalance(address asset) external view returns (uint256 balance); + + /** + * @notice Get reserve balance for a specific reserve ID + * @param reserveId Unique identifier for the reserve + * @return asset Address of the asset + * @return balance Reserve balance + */ + function getReserveById(bytes32 reserveId) external view returns (address asset, uint256 balance); + + // ============ Conversion ============ + + /** + * @notice Convert assets using optimal path (XAU triangulation) + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return conversionId Unique identifier for this conversion + * @return targetAmount Amount received after conversion + * @return fees Total fees charged + */ + function convertAssets( + address sourceAsset, + address targetAsset, + uint256 amount + ) external returns ( + bytes32 conversionId, + uint256 targetAmount, + uint256 fees + ); + + /** + * @notice Calculate conversion amount without executing + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return targetAmount Expected amount after conversion + * @return fees Expected fees + * @return path Optimal conversion path + */ + function calculateConversion( + address sourceAsset, + address targetAsset, + uint256 amount + ) external view returns ( + uint256 targetAmount, + uint256 fees, + address[] memory path + ); + + // ============ Redemption ============ + + /** + * @notice Redeem assets from the reserve system + * @param asset Address of the asset to redeem + * @param amount Amount to redeem + * @param recipient Address to receive the redeemed assets + * @return redemptionId Unique identifier for this redemption + */ + function redeem( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 redemptionId); + + // ============ Price Feeds ============ + + /** + * @notice Update price feed for an asset + * @param asset Address of the asset + * @param price Current price + * @param timestamp Price timestamp + */ + function updatePriceFeed( + address asset, + uint256 price, + uint256 timestamp + ) external; + + /** + * @notice Get current price for an asset + * @param asset Address of the asset + * @return price Current price + * @return timestamp Price timestamp + */ + function getPrice(address asset) external view returns (uint256 price, uint256 timestamp); + + /** + * @notice Get price for conversion between two assets + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @return price Conversion price (target per source) + */ + function getConversionPrice( + address sourceAsset, + address targetAsset + ) external view returns (uint256 price); +} + diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/foundry.toml b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/foundry.toml new file mode 100644 index 0000000..fedc582 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/foundry.toml @@ -0,0 +1,24 @@ +[profile.default] +src = "." +out = "out" +cache_path = "cache" +libs = [] +remappings = [ + "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", + "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", + "forge-std/=lib/forge-std/src/", + "ds-test/=lib/forge-std/lib/ds-test/src/", + "@emoney/=contracts/emoney/", + "@emoney-scripts/=script/emoney/", + "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", + "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/", + "dodo-contractV2/=lib/dodo-contractV2/", + "hardhat/=lib/dodo-contractV2/node_modules/hardhat/" +] +solc = "0.8.20" +optimizer = true +optimizer_runs = 200 +via_ir = true +evm_version = "london" +auto_detect_remappings = false diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/access/AccessControl.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/access/AccessControl.sol new file mode 100644 index 0000000..3e3341e --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/access/AccessControl.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) + +pragma solidity ^0.8.20; + +import {IAccessControl} from "./IAccessControl.sol"; +import {Context} from "../utils/Context.sol"; +import {ERC165} from "../utils/introspection/ERC165.sol"; + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ```solidity + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ```solidity + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} + * to enforce additional security measures for this role. + */ +abstract contract AccessControl is Context, IAccessControl, ERC165 { + struct RoleData { + mapping(address account => bool) hasRole; + bytes32 adminRole; + } + + mapping(bytes32 role => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with an {AccessControlUnauthorizedAccount} error including the required role. + */ + modifier onlyRole(bytes32 role) { + _checkRole(role); + _; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view virtual returns (bool) { + return _roles[role].hasRole[account]; + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` + * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. + */ + function _checkRole(bytes32 role) internal view virtual { + _checkRole(role, _msgSender()); + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` + * is missing `role`. + */ + function _checkRole(bytes32 role, address account) internal view virtual { + if (!hasRole(role, account)) { + revert AccessControlUnauthorizedAccount(account, role); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleGranted} event. + */ + function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleRevoked} event. + */ + function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been revoked `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + * + * May emit a {RoleRevoked} event. + */ + function renounceRole(bytes32 role, address callerConfirmation) public virtual { + if (callerConfirmation != _msgSender()) { + revert AccessControlBadConfirmation(); + } + + _revokeRole(role, callerConfirmation); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + /** + * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. + * + * Internal function without access restriction. + * + * May emit a {RoleGranted} event. + */ + function _grantRole(bytes32 role, address account) internal virtual returns (bool) { + if (!hasRole(role, account)) { + _roles[role].hasRole[account] = true; + emit RoleGranted(role, account, _msgSender()); + return true; + } else { + return false; + } + } + + /** + * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. + * + * Internal function without access restriction. + * + * May emit a {RoleRevoked} event. + */ + function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { + if (hasRole(role, account)) { + _roles[role].hasRole[account] = false; + emit RoleRevoked(role, account, _msgSender()); + return true; + } else { + return false; + } + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol new file mode 100644 index 0000000..2ac89ca --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) + +pragma solidity ^0.8.20; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev The `account` is missing a role. + */ + error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); + + /** + * @dev The caller of a function is not the expected one. + * + * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. + */ + error AccessControlBadConfirmation(); + + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + */ + event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + */ + function renounceRole(bytes32 role, address callerConfirmation) external; +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol new file mode 100644 index 0000000..db01cf4 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); + + /** + * @dev Returns the value of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the value of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves a `value` amount of tokens from the caller's account to `to`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address to, uint256 value) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets a `value` amount of tokens as the allowance of `spender` over the + * caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 value) external returns (bool); + + /** + * @dev Moves a `value` amount of tokens from `from` to `to` using the + * allowance mechanism. `value` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address from, address to, uint256 value) external returns (bool); +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol new file mode 100644 index 0000000..5af4810 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in + * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. + * + * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by + * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't + * need to send a transaction, and thus is not required to hold Ether at all. + * + * ==== Security Considerations + * + * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature + * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be + * considered as an intention to spend the allowance in any specific way. The second is that because permits have + * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should + * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be + * generally recommended is: + * + * ```solidity + * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { + * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} + * doThing(..., value); + * } + * + * function doThing(..., uint256 value) public { + * token.safeTransferFrom(msg.sender, address(this), value); + * ... + * } + * ``` + * + * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of + * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also + * {SafeERC20-safeTransferFrom}). + * + * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so + * contracts should have entry points that don't rely on permit. + */ +interface IERC20Permit { + /** + * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, + * given ``owner``'s signed approval. + * + * IMPORTANT: The same issues {IERC20-approve} has related to transaction + * ordering also apply here. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `deadline` must be a timestamp in the future. + * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` + * over the EIP712-formatted function arguments. + * - the signature must use ``owner``'s current nonce (see {nonces}). + * + * For more information on the signature format, see the + * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP + * section]. + * + * CAUTION: See Security Considerations above. + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @dev Returns the current nonce for `owner`. This value must be + * included whenever a signature is generated for {permit}. + * + * Every successful call to {permit} increases ``owner``'s nonce by one. This + * prevents a signature from being used multiple times. + */ + function nonces(address owner) external view returns (uint256); + + /** + * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. + */ + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view returns (bytes32); +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol new file mode 100644 index 0000000..bb65709 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) + +pragma solidity ^0.8.20; + +import {IERC20} from "../IERC20.sol"; +import {IERC20Permit} from "../extensions/IERC20Permit.sol"; +import {Address} from "../../../utils/Address.sol"; + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using Address for address; + + /** + * @dev An operation with an ERC20 token failed. + */ + error SafeERC20FailedOperation(address token); + + /** + * @dev Indicates a failed `decreaseAllowance` request. + */ + error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); + + /** + * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeTransfer(IERC20 token, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); + } + + /** + * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the + * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. + */ + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); + } + + /** + * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + uint256 oldAllowance = token.allowance(address(this), spender); + forceApprove(token, spender, oldAllowance + value); + } + + /** + * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no + * value, non-reverting calls are assumed to be successful. + */ + function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { + unchecked { + uint256 currentAllowance = token.allowance(address(this), spender); + if (currentAllowance < requestedDecrease) { + revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); + } + forceApprove(token, spender, currentAllowance - requestedDecrease); + } + } + + /** + * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval + * to be set to zero before setting it to a non-zero value, such as USDT. + */ + function forceApprove(IERC20 token, address spender, uint256 value) internal { + bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); + + if (!_callOptionalReturnBool(token, approvalCall)) { + _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); + _callOptionalReturn(token, approvalCall); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function _callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that + // the target address contains contract code and also asserts for success in the low-level call. + + bytes memory returndata = address(token).functionCall(data); + if (returndata.length != 0 && !abi.decode(returndata, (bool))) { + revert SafeERC20FailedOperation(address(token)); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + * + * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. + */ + function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false + // and not revert is the subcall reverts. + + (bool success, bytes memory returndata) = address(token).call(data); + return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/Address.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/Address.sol new file mode 100644 index 0000000..b7e3059 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/Address.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev The ETH balance of the account is not enough to perform the operation. + */ + error AddressInsufficientBalance(address account); + + /** + * @dev There's no code at `target` (it is not a contract). + */ + error AddressEmptyCode(address target); + + /** + * @dev A call to an address target failed. The target may have reverted. + */ + error FailedInnerCall(); + + /** + * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + if (address(this).balance < amount) { + revert AddressInsufficientBalance(address(this)); + } + + (bool success, ) = recipient.call{value: amount}(""); + if (!success) { + revert FailedInnerCall(); + } + } + + /** + * @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 or custom error, it is bubbled + * up by this function (like regular Solidity function calls). However, if + * the call reverted with no returned reason, this function reverts with a + * {FailedInnerCall} error. + * + * 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. + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0); + } + + /** + * @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`. + */ + function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { + if (address(this).balance < value) { + revert AddressInsufficientBalance(address(this)); + } + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + */ + function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target + * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an + * unsuccessful call. + */ + function verifyCallResultFromTarget( + address target, + bool success, + bytes memory returndata + ) internal view returns (bytes memory) { + if (!success) { + _revert(returndata); + } else { + // only check if target is a contract if the call was successful and the return data is empty + // otherwise we already know that it was a contract + if (returndata.length == 0 && target.code.length == 0) { + revert AddressEmptyCode(target); + } + return returndata; + } + } + + /** + * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the + * revert reason or with a default {FailedInnerCall} error. + */ + function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { + if (!success) { + _revert(returndata); + } else { + return returndata; + } + } + + /** + * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. + */ + function _revert(bytes memory returndata) private pure { + // 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 FailedInnerCall(); + } + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/Context.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/Context.sol new file mode 100644 index 0000000..9037dcd --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/Context.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address) { + return msg.sender; + } + + function _msgData() internal view virtual returns (bytes calldata) { + return msg.data; + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol new file mode 100644 index 0000000..291d92f --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuard { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant NOT_ENTERED = 1; + uint256 private constant ENTERED = 2; + + uint256 private _status; + + /** + * @dev Unauthorized reentrant call. + */ + error ReentrancyGuardReentrantCall(); + + constructor() { + _status = NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and making it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + _nonReentrantBefore(); + _; + _nonReentrantAfter(); + } + + function _nonReentrantBefore() private { + // On the first call to nonReentrant, _status will be NOT_ENTERED + if (_status == ENTERED) { + revert ReentrancyGuardReentrantCall(); + } + + // Any calls to nonReentrant after this point will fail + _status = ENTERED; + } + + function _nonReentrantAfter() private { + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + _status = NOT_ENTERED; + } + + /** + * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a + * `nonReentrant` function in the call stack. + */ + function _reentrancyGuardEntered() internal view returns (bool) { + return _status == ENTERED; + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol new file mode 100644 index 0000000..1e77b60 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "./IERC165.sol"; + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + */ +abstract contract ERC165 is IERC165 { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol new file mode 100644 index 0000000..c09f31f --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMIntegration/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[EIP]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider.standard.json b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider.standard.json new file mode 100644 index 0000000..b44ef62 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider.standard.json @@ -0,0 +1 @@ +{"language":"Solidity","sources":{"contracts/liquidity/providers/DODOPMMProvider.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"../interfaces/ILiquidityProvider.sol\";\nimport \"../../dex/DODOPMMIntegration.sol\";\n\n/**\n * @title DODOPMMProvider\n * @notice Wrapper for DODO PMM with extended functionality\n * @dev Implements ILiquidityProvider for multi-provider liquidity system\n */\ncontract DODOPMMProvider is ILiquidityProvider, AccessControl {\n using SafeERC20 for IERC20;\n\n bytes32 public constant POOL_MANAGER_ROLE = keccak256(\"POOL_MANAGER_ROLE\");\n\n DODOPMMIntegration public dodoIntegration;\n \n // Pool tracking\n mapping(address => mapping(address => address)) public pools; // tokenIn => tokenOut => pool\n mapping(address => bool) public isKnownPool;\n\n event PoolCreated(address indexed tokenIn, address indexed tokenOut, address pool);\n event PoolOptimized(address indexed pool, uint256 newK, uint256 newI);\n\n constructor(address _dodoIntegration, address admin) {\n require(_dodoIntegration != address(0), \"Zero address\");\n \n dodoIntegration = DODOPMMIntegration(_dodoIntegration);\n \n _grantRole(DEFAULT_ADMIN_ROLE, admin);\n _grantRole(POOL_MANAGER_ROLE, admin);\n }\n\n /**\n * @notice Get quote from DODO PMM\n */\n function getQuote(\n address tokenIn,\n address tokenOut,\n uint256 amountIn\n ) external view override returns (uint256 amountOut, uint256 slippageBps) {\n address pool = pools[tokenIn][tokenOut];\n \n if (pool == address(0)) {\n return (0, 10000); // No pool, 100% slippage\n }\n \n try dodoIntegration.getPoolPriceOrOracle(pool) returns (uint256 price) {\n // Simple calculation (in production, would use actual DODO math)\n amountOut = (amountIn * price) / 1e18;\n slippageBps = 30; // 0.3% typical for stablecoin pools\n return (amountOut, slippageBps);\n } catch {\n return (0, 10000);\n }\n }\n\n /**\n * @notice Execute swap via DODO PMM\n */\n function executeSwap(\n address tokenIn,\n address tokenOut,\n uint256 amountIn,\n uint256 minAmountOut\n ) external override returns (uint256 amountOut) {\n // Get pool for token pair\n address pool = pools[tokenIn][tokenOut];\n require(pool != address(0), \"Pool not found\");\n \n // Transfer tokens from caller\n IERC20(tokenIn).safeTransferFrom(msg.sender, address(this), amountIn);\n \n // Route to appropriate swap method: use dedicated methods for the 6 legacy pairs,\n // otherwise use generic swapExactIn for full-mesh routing (any registered pool).\n if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.officialUSDT()) {\n IERC20(tokenIn).approve(address(dodoIntegration), amountIn);\n amountOut = dodoIntegration.swapCUSDTForUSDT(pool, amountIn, minAmountOut);\n } else if (tokenIn == dodoIntegration.officialUSDT() && tokenOut == dodoIntegration.compliantUSDT()) {\n IERC20(tokenIn).approve(address(dodoIntegration), amountIn);\n amountOut = dodoIntegration.swapUSDTForCUSDT(pool, amountIn, minAmountOut);\n } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.officialUSDC()) {\n IERC20(tokenIn).approve(address(dodoIntegration), amountIn);\n amountOut = dodoIntegration.swapCUSDCForUSDC(pool, amountIn, minAmountOut);\n } else if (tokenIn == dodoIntegration.officialUSDC() && tokenOut == dodoIntegration.compliantUSDC()) {\n IERC20(tokenIn).approve(address(dodoIntegration), amountIn);\n amountOut = dodoIntegration.swapUSDCForCUSDC(pool, amountIn, minAmountOut);\n } else if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.compliantUSDC()) {\n IERC20(tokenIn).approve(address(dodoIntegration), amountIn);\n amountOut = dodoIntegration.swapCUSDTForUSDC(pool, amountIn, minAmountOut);\n } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.compliantUSDT()) {\n IERC20(tokenIn).approve(address(dodoIntegration), amountIn);\n amountOut = dodoIntegration.swapUSDCForCUSDT(pool, amountIn, minAmountOut);\n } else {\n // Full mesh: any registered pool (c* vs c*, c* vs official, etc.)\n IERC20(tokenIn).approve(address(dodoIntegration), amountIn);\n amountOut = dodoIntegration.swapExactIn(pool, tokenIn, amountIn, minAmountOut);\n }\n \n // Transfer output tokens to caller\n IERC20(tokenOut).safeTransfer(msg.sender, amountOut);\n \n return amountOut;\n }\n\n /**\n * @notice Check if provider supports token pair\n */\n function supportsTokenPair(\n address tokenIn,\n address tokenOut\n ) external view override returns (bool) {\n return pools[tokenIn][tokenOut] != address(0);\n }\n\n /**\n * @notice Get provider name\n */\n function providerName() external pure override returns (string memory) {\n return \"DODO PMM\";\n }\n\n /**\n * @notice Estimate gas for swap\n */\n function estimateGas(\n address,\n address,\n uint256\n ) external pure override returns (uint256) {\n return 150000; // Typical gas for DODO swap\n }\n\n /**\n * @notice Ensure pool exists for token pair\n */\n function ensurePoolExists(address tokenIn, address tokenOut) external onlyRole(POOL_MANAGER_ROLE) {\n if (pools[tokenIn][tokenOut] == address(0)) {\n _createOptimalPool(tokenIn, tokenOut);\n }\n }\n\n /// @dev Default params for stablecoin pairs: 0.03% fee, 1:1 price, k=0.5e18\n uint256 private constant DEFAULT_LP_FEE = 3;\n uint256 private constant DEFAULT_I = 1e18;\n uint256 private constant DEFAULT_K = 0.5e18;\n\n /**\n * @notice Create optimal DODO pool via DODOPMMIntegration\n * @dev Requires DODOPMMIntegration to grant POOL_MANAGER_ROLE to this contract\n */\n function _createOptimalPool(address tokenIn, address tokenOut) internal {\n address pool = dodoIntegration.createPool(\n tokenIn,\n tokenOut,\n DEFAULT_LP_FEE,\n DEFAULT_I,\n DEFAULT_K,\n false // isOpenTWAP - disable for stablecoins\n );\n pools[tokenIn][tokenOut] = pool;\n pools[tokenOut][tokenIn] = pool;\n isKnownPool[pool] = true;\n emit PoolCreated(tokenIn, tokenOut, pool);\n }\n\n /**\n * @notice Register existing pool\n */\n function registerPool(\n address tokenIn,\n address tokenOut,\n address pool\n ) external onlyRole(POOL_MANAGER_ROLE) {\n require(pool != address(0), \"Zero address\");\n \n pools[tokenIn][tokenOut] = pool;\n isKnownPool[pool] = true;\n \n emit PoolCreated(tokenIn, tokenOut, pool);\n }\n\n /**\n * @notice Optimize pool parameters (K, I)\n * @dev DODO PMM parameters are typically oracle-driven; DVM pools may expose\n * setK/setI. Emits for off-chain monitoring. If the pool supports\n * parameter updates, extend this to call the pool's update functions.\n */\n function optimizePoolParameters(\n address pool,\n uint256 newK,\n uint256 newI\n ) external onlyRole(POOL_MANAGER_ROLE) {\n require(isKnownPool[pool], \"Unknown pool\");\n // DODO DVM/PMM: parameters set at creation; oracle-driven rebalancing.\n // Emit for observability; integrate pool.setK/setI when supported.\n emit PoolOptimized(pool, newK, newI);\n }\n}\n"},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC20Permit} from \"../extensions/IERC20Permit.sol\";\nimport {Address} from \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n /**\n * @dev An operation with an ERC20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data);\n if (returndata.length != 0 && !abi.decode(returndata, (bool))) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;\n }\n}\n"},"contracts/liquidity/interfaces/ILiquidityProvider.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface ILiquidityProvider {\n function getQuote(address tokenIn, address tokenOut, uint256 amountIn) \n external view returns (uint256 amountOut, uint256 slippageBps);\n function executeSwap(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut) \n external returns (uint256 amountOut);\n function supportsTokenPair(address tokenIn, address tokenOut) external view returns (bool);\n function providerName() external pure returns (string memory);\n function estimateGas(address tokenIn, address tokenOut, uint256 amountIn) external view returns (uint256);\n}\n"},"contracts/dex/DODOPMMIntegration.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.19;\n\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport \"../reserve/IReserveSystem.sol\";\n\n/**\n * @title DODO PMM Pool Interface\n * @notice Simplified interface for DODO Proactive Market Maker pools\n * @dev Actual DODO interfaces may vary - this is a simplified version\n */\ninterface IDODOPMMPool {\n function _BASE_TOKEN_() external view returns (address);\n function _QUOTE_TOKEN_() external view returns (address);\n function sellBase(uint256 amount) external returns (uint256);\n function sellQuote(uint256 amount) external returns (uint256);\n function buyShares(address to) external returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare);\n function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve);\n function getMidPrice() external view returns (uint256);\n function _QUOTE_RESERVE_() external view returns (uint256);\n function _BASE_RESERVE_() external view returns (uint256);\n}\n\n/**\n * @title DODO Vending Machine Interface\n * @notice Interface for creating DODO Vending Machine (DVM) pools\n */\ninterface IDODOVendingMachine {\n function createDVM(\n address baseToken,\n address quoteToken,\n uint256 lpFeeRate,\n uint256 i,\n uint256 k,\n bool isOpenTWAP\n ) external returns (address dvm);\n}\n\n/**\n * @title DODOPMMIntegration\n * @notice Integration contract for DODO PMM pools with CompliantUSDT/USDC\n * @dev Manages liquidity pools on DODO and provides swap functionality between\n * compliant tokens (cUSDT/cUSDC) and official tokens (USDT/USDC)\n * \n * This contract facilitates exchangeability between compliant and official tokens\n * through DODO's Proactive Market Maker algorithm, which maintains price stability\n * and provides efficient liquidity.\n */\ncontract DODOPMMIntegration is AccessControl, ReentrancyGuard {\n using SafeERC20 for IERC20;\n\n bytes32 public constant POOL_MANAGER_ROLE = keccak256(\"POOL_MANAGER_ROLE\");\n bytes32 public constant SWAP_OPERATOR_ROLE = keccak256(\"SWAP_OPERATOR_ROLE\");\n\n // DODO contracts\n address public immutable dodoVendingMachine;\n address public immutable dodoApprove; // DODO's approval contract for gas optimization\n\n // Token addresses\n address public immutable officialUSDT; // Official USDT on destination chain\n address public immutable officialUSDC; // Official USDC on destination chain\n address public immutable compliantUSDT; // cUSDT on Chain 138\n address public immutable compliantUSDC; // cUSDC on Chain 138\n\n // Pool mappings\n mapping(address => mapping(address => address)) public pools; // token0 => token1 => pool\n mapping(address => bool) public isRegisteredPool;\n\n // Pool configuration\n struct PoolConfig {\n address pool;\n address baseToken;\n address quoteToken;\n uint256 lpFeeRate; // Basis points (100 = 1%)\n uint256 i; // Initial price (1e18 = $1 for stablecoins)\n uint256 k; // Slippage factor (0.5 = 500000000000000000, lower = less slippage)\n bool isOpenTWAP; // Enable TWAP oracle for price discovery\n uint256 createdAt;\n }\n\n mapping(address => PoolConfig) public poolConfigs;\n address[] public allPools;\n\n /// @notice Optional ReserveSystem for oracle-backed mid price (base/quote in reserve system)\n IReserveSystem public reserveSystem;\n\n event PoolCreated(\n address indexed pool,\n address indexed baseToken,\n address indexed quoteToken,\n address creator\n );\n event LiquidityAdded(\n address indexed pool,\n address indexed provider,\n uint256 baseAmount,\n uint256 quoteAmount,\n uint256 lpShares\n );\n event SwapExecuted(\n address indexed pool,\n address indexed tokenIn,\n address indexed tokenOut,\n uint256 amountIn,\n uint256 amountOut,\n address trader\n );\n event PoolRemoved(address indexed pool);\n event ReserveSystemSet(address indexed reserveSystem);\n\n constructor(\n address admin,\n address dodoVendingMachine_,\n address dodoApprove_,\n address officialUSDT_,\n address officialUSDC_,\n address compliantUSDT_,\n address compliantUSDC_\n ) {\n require(admin != address(0), \"DODOPMMIntegration: zero admin\");\n require(dodoVendingMachine_ != address(0), \"DODOPMMIntegration: zero DVM\");\n require(officialUSDT_ != address(0), \"DODOPMMIntegration: zero USDT\");\n require(officialUSDC_ != address(0), \"DODOPMMIntegration: zero USDC\");\n require(compliantUSDT_ != address(0), \"DODOPMMIntegration: zero cUSDT\");\n require(compliantUSDC_ != address(0), \"DODOPMMIntegration: zero cUSDC\");\n\n _grantRole(DEFAULT_ADMIN_ROLE, admin);\n _grantRole(POOL_MANAGER_ROLE, admin);\n _grantRole(SWAP_OPERATOR_ROLE, admin);\n\n dodoVendingMachine = dodoVendingMachine_;\n dodoApprove = dodoApprove_;\n officialUSDT = officialUSDT_;\n officialUSDC = officialUSDC_;\n compliantUSDT = compliantUSDT_;\n compliantUSDC = compliantUSDC_;\n }\n\n /**\n * @notice Create DODO PMM pool for cUSDT/USDT pair\n * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%)\n * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs)\n * @param k Slippage factor (0.5e18 = 50%, lower = less slippage, higher = more slippage)\n * @param isOpenTWAP Enable TWAP oracle for price discovery\n */\n function createCUSDTUSDTPool(\n uint256 lpFeeRate,\n uint256 initialPrice,\n uint256 k,\n bool isOpenTWAP\n ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) {\n require(pools[compliantUSDT][officialUSDT] == address(0), \"DODOPMMIntegration: pool exists\");\n\n // Create DVM pool using DODO Vending Machine\n pool = IDODOVendingMachine(dodoVendingMachine).createDVM(\n compliantUSDT, // baseToken (cUSDT)\n officialUSDT, // quoteToken (USDT)\n lpFeeRate, // LP fee rate\n initialPrice, // Initial price\n k, // Slippage factor\n isOpenTWAP // Enable TWAP\n );\n\n // Register pool\n pools[compliantUSDT][officialUSDT] = pool;\n pools[officialUSDT][compliantUSDT] = pool;\n isRegisteredPool[pool] = true;\n allPools.push(pool);\n\n poolConfigs[pool] = PoolConfig({\n pool: pool,\n baseToken: compliantUSDT,\n quoteToken: officialUSDT,\n lpFeeRate: lpFeeRate,\n i: initialPrice,\n k: k,\n isOpenTWAP: isOpenTWAP,\n createdAt: block.timestamp\n });\n\n emit PoolCreated(pool, compliantUSDT, officialUSDT, msg.sender);\n }\n\n /**\n * @notice Create DODO PMM pool for cUSDC/USDC pair\n * @param lpFeeRate Liquidity provider fee rate (basis points)\n * @param initialPrice Initial price (1e18 = $1)\n * @param k Slippage factor\n * @param isOpenTWAP Enable TWAP oracle\n */\n function createCUSDCUSDCPool(\n uint256 lpFeeRate,\n uint256 initialPrice,\n uint256 k,\n bool isOpenTWAP\n ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) {\n require(pools[compliantUSDC][officialUSDC] == address(0), \"DODOPMMIntegration: pool exists\");\n\n pool = IDODOVendingMachine(dodoVendingMachine).createDVM(\n compliantUSDC,\n officialUSDC,\n lpFeeRate,\n initialPrice,\n k,\n isOpenTWAP\n );\n\n pools[compliantUSDC][officialUSDC] = pool;\n pools[officialUSDC][compliantUSDC] = pool;\n isRegisteredPool[pool] = true;\n allPools.push(pool);\n\n poolConfigs[pool] = PoolConfig({\n pool: pool,\n baseToken: compliantUSDC,\n quoteToken: officialUSDC,\n lpFeeRate: lpFeeRate,\n i: initialPrice,\n k: k,\n isOpenTWAP: isOpenTWAP,\n createdAt: block.timestamp\n });\n\n emit PoolCreated(pool, compliantUSDC, officialUSDC, msg.sender);\n }\n\n /**\n * @notice Create DODO PMM pool for cUSDT/cUSDC pair (public liquidity per VAULT_SYSTEM_MASTER_TECHNICAL_PLAN §4)\n * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%)\n * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs)\n * @param k Slippage factor (0.5e18 = 50%, lower = less slippage)\n * @param isOpenTWAP Enable TWAP oracle for price discovery\n */\n function createCUSDTCUSDCPool(\n uint256 lpFeeRate,\n uint256 initialPrice,\n uint256 k,\n bool isOpenTWAP\n ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) {\n require(pools[compliantUSDT][compliantUSDC] == address(0), \"DODOPMMIntegration: pool exists\");\n\n pool = IDODOVendingMachine(dodoVendingMachine).createDVM(\n compliantUSDT, // baseToken (cUSDT)\n compliantUSDC, // quoteToken (cUSDC)\n lpFeeRate,\n initialPrice,\n k,\n isOpenTWAP\n );\n\n pools[compliantUSDT][compliantUSDC] = pool;\n pools[compliantUSDC][compliantUSDT] = pool;\n isRegisteredPool[pool] = true;\n allPools.push(pool);\n\n poolConfigs[pool] = PoolConfig({\n pool: pool,\n baseToken: compliantUSDT,\n quoteToken: compliantUSDC,\n lpFeeRate: lpFeeRate,\n i: initialPrice,\n k: k,\n isOpenTWAP: isOpenTWAP,\n createdAt: block.timestamp\n });\n\n emit PoolCreated(pool, compliantUSDT, compliantUSDC, msg.sender);\n }\n\n /**\n * @notice Create DODO PMM pool for any base/quote token pair (generic)\n * @param baseToken Base token address\n * @param quoteToken Quote token address\n * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%)\n * @param initialPrice Initial price (1e18 = $1 for stablecoins)\n * @param k Slippage factor (0.5e18 = 50%, lower = less slippage)\n * @param isOpenTWAP Enable TWAP oracle for price discovery\n */\n function createPool(\n address baseToken,\n address quoteToken,\n uint256 lpFeeRate,\n uint256 initialPrice,\n uint256 k,\n bool isOpenTWAP\n ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) {\n require(baseToken != address(0), \"DODOPMMIntegration: zero base\");\n require(quoteToken != address(0), \"DODOPMMIntegration: zero quote\");\n require(baseToken != quoteToken, \"DODOPMMIntegration: same token\");\n require(pools[baseToken][quoteToken] == address(0), \"DODOPMMIntegration: pool exists\");\n\n pool = IDODOVendingMachine(dodoVendingMachine).createDVM(\n baseToken,\n quoteToken,\n lpFeeRate,\n initialPrice,\n k,\n isOpenTWAP\n );\n\n pools[baseToken][quoteToken] = pool;\n pools[quoteToken][baseToken] = pool;\n isRegisteredPool[pool] = true;\n allPools.push(pool);\n\n poolConfigs[pool] = PoolConfig({\n pool: pool,\n baseToken: baseToken,\n quoteToken: quoteToken,\n lpFeeRate: lpFeeRate,\n i: initialPrice,\n k: k,\n isOpenTWAP: isOpenTWAP,\n createdAt: block.timestamp\n });\n\n emit PoolCreated(pool, baseToken, quoteToken, msg.sender);\n }\n\n /**\n * @notice Add liquidity to a DODO PMM pool\n * @param pool Pool address\n * @param baseAmount Amount of base token to deposit\n * @param quoteAmount Amount of quote token to deposit\n */\n function addLiquidity(\n address pool,\n uint256 baseAmount,\n uint256 quoteAmount\n ) external nonReentrant returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(baseAmount > 0 && quoteAmount > 0, \"DODOPMMIntegration: zero amount\");\n \n PoolConfig memory config = poolConfigs[pool];\n\n // Transfer tokens to pool (DODO pools handle their own token management)\n IERC20(config.baseToken).safeTransferFrom(msg.sender, pool, baseAmount);\n IERC20(config.quoteToken).safeTransferFrom(msg.sender, pool, quoteAmount);\n\n // Call buyShares on DODO pool to add liquidity\n (baseShare, quoteShare, lpShare) = IDODOPMMPool(pool).buyShares(msg.sender);\n\n emit LiquidityAdded(pool, msg.sender, baseAmount, quoteAmount, lpShare);\n }\n\n /**\n * @notice Swap cUSDT for official USDT via DODO PMM\n * @param pool Pool address\n * @param amountIn Amount of cUSDT to sell\n * @param minAmountOut Minimum amount of USDT to receive (slippage protection)\n */\n function swapCUSDTForUSDT(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].baseToken == compliantUSDT, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n // Transfer cUSDT to pool\n IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn);\n\n // Execute swap (sell base token)\n amountOut = IDODOPMMPool(pool).sellBase(amountIn);\n\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n\n emit SwapExecuted(pool, compliantUSDT, officialUSDT, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Swap official USDT for cUSDT via DODO PMM\n * @param pool Pool address\n * @param amountIn Amount of USDT to sell\n * @param minAmountOut Minimum amount of cUSDT to receive\n */\n function swapUSDTForCUSDT(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].quoteToken == officialUSDT, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n // Transfer USDT to pool\n IERC20(officialUSDT).safeTransferFrom(msg.sender, pool, amountIn);\n\n // Execute swap (sell quote token)\n amountOut = IDODOPMMPool(pool).sellQuote(amountIn);\n\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n\n emit SwapExecuted(pool, officialUSDT, compliantUSDT, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Swap cUSDC for official USDC via DODO PMM\n * @param pool Pool address\n * @param amountIn Amount of cUSDC to sell\n * @param minAmountOut Minimum amount of USDC to receive\n */\n function swapCUSDCForUSDC(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].baseToken == compliantUSDC, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellBase(amountIn);\n\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n\n emit SwapExecuted(pool, compliantUSDC, officialUSDC, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Swap official USDC for cUSDC via DODO PMM\n * @param pool Pool address\n * @param amountIn Amount of USDC to sell\n * @param minAmountOut Minimum amount of cUSDC to receive\n */\n function swapUSDCForCUSDC(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].quoteToken == officialUSDC, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n IERC20(officialUSDC).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellQuote(amountIn);\n\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n\n emit SwapExecuted(pool, officialUSDC, compliantUSDC, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Swap cUSDT for cUSDC via cUSDT/cUSDC DODO PMM pool (public liquidity pair per Master Plan §4)\n */\n function swapCUSDTForUSDC(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellBase(amountIn);\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n IERC20(compliantUSDC).safeTransfer(msg.sender, amountOut);\n emit SwapExecuted(pool, compliantUSDT, compliantUSDC, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Swap cUSDC for cUSDT via cUSDT/cUSDC DODO PMM pool\n */\n function swapUSDCForCUSDT(\n address pool,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, \"DODOPMMIntegration: invalid pool\");\n require(amountIn > 0, \"DODOPMMIntegration: zero amount\");\n\n IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellQuote(amountIn);\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n IERC20(compliantUSDT).safeTransfer(msg.sender, amountOut);\n emit SwapExecuted(pool, compliantUSDC, compliantUSDT, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Generic swap for any registered pool (full mesh routing).\n * @param pool Pool address\n * @param tokenIn Token to sell\n * @param amountIn Amount of tokenIn\n * @param minAmountOut Minimum amount of tokenOut to receive\n * @return amountOut Amount of quote/base token received (sent to msg.sender)\n */\n function swapExactIn(\n address pool,\n address tokenIn,\n uint256 amountIn,\n uint256 minAmountOut\n ) external nonReentrant returns (uint256 amountOut) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n PoolConfig memory config = poolConfigs[pool];\n address tokenOut;\n if (tokenIn == config.baseToken) {\n tokenOut = config.quoteToken;\n IERC20(tokenIn).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellBase(amountIn);\n } else if (tokenIn == config.quoteToken) {\n tokenOut = config.baseToken;\n IERC20(tokenIn).safeTransferFrom(msg.sender, pool, amountIn);\n amountOut = IDODOPMMPool(pool).sellQuote(amountIn);\n } else {\n revert(\"DODOPMMIntegration: token not in pool\");\n }\n require(amountOut >= minAmountOut, \"DODOPMMIntegration: insufficient output\");\n IERC20(tokenOut).safeTransfer(msg.sender, amountOut);\n emit SwapExecuted(pool, tokenIn, tokenOut, amountIn, amountOut, msg.sender);\n }\n\n /**\n * @notice Set optional ReserveSystem for oracle-backed mid price\n * @param reserveSystem_ ReserveSystem address (address(0) to disable)\n */\n function setReserveSystem(address reserveSystem_) external onlyRole(DEFAULT_ADMIN_ROLE) {\n reserveSystem = IReserveSystem(reserveSystem_);\n emit ReserveSystemSet(reserveSystem_);\n }\n\n /**\n * @notice Get pool price: oracle (ReserveSystem) if configured and available, else pool getMidPrice()\n * @param pool Pool address\n * @return price Price in 18 decimals (quote per base; 1e18 = $1 for stablecoins)\n */\n function getPoolPriceOrOracle(address pool) public view returns (uint256 price) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n if (address(reserveSystem) != address(0)) {\n PoolConfig memory config = poolConfigs[pool];\n try reserveSystem.getConversionPrice(config.baseToken, config.quoteToken) returns (uint256 oraclePrice) {\n if (oraclePrice > 0) return oraclePrice;\n } catch { }\n }\n return IDODOPMMPool(pool).getMidPrice();\n }\n\n /**\n * @notice Get current pool price (pool mid only; use getPoolPriceOrOracle for oracle-backed price)\n * @param pool Pool address\n * @return price Current mid price (1e18 = $1 for stablecoins)\n */\n function getPoolPrice(address pool) external view returns (uint256 price) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n price = IDODOPMMPool(pool).getMidPrice();\n }\n\n /**\n * @notice Get pool reserves\n * @param pool Pool address\n * @return baseReserve Base token reserve\n * @return quoteReserve Quote token reserve\n */\n function getPoolReserves(address pool) external view returns (uint256 baseReserve, uint256 quoteReserve) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n (baseReserve, quoteReserve) = IDODOPMMPool(pool).getVaultReserve();\n }\n\n /**\n * @notice Get pool configuration\n * @param pool Pool address\n * @return config Pool configuration struct\n */\n function getPoolConfig(address pool) external view returns (PoolConfig memory config) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n config = poolConfigs[pool];\n }\n\n /**\n * @notice Get all registered pools\n * @return List of all pool addresses\n */\n function getAllPools() external view returns (address[] memory) {\n return allPools;\n }\n\n /**\n * @notice Remove pool (emergency only)\n * @param pool Pool address to remove\n */\n function removePool(address pool) external onlyRole(DEFAULT_ADMIN_ROLE) {\n require(isRegisteredPool[pool], \"DODOPMMIntegration: pool not registered\");\n \n PoolConfig memory config = poolConfigs[pool];\n pools[config.baseToken][config.quoteToken] = address(0);\n pools[config.quoteToken][config.baseToken] = address(0);\n isRegisteredPool[pool] = false;\n \n delete poolConfigs[pool];\n \n emit PoolRemoved(pool);\n }\n}\n\n"},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n * doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n * token.safeTransferFrom(msg.sender, address(this), value);\n * ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n *\n * CAUTION: See Security Considerations above.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error AddressInsufficientBalance(address account);\n\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedInnerCall();\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert AddressInsufficientBalance(address(this));\n }\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n if (!success) {\n revert FailedInnerCall();\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {FailedInnerCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert AddressInsufficientBalance(address(this));\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an\n * unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {FailedInnerCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert FailedInnerCall();\n }\n }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"},"contracts/reserve/IReserveSystem.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/**\n * @title IReserveSystem\n * @notice Interface for the GRU Reserve System\n * @dev Defines the core functionality for reserve management, conversion, and redemption\n */\ninterface IReserveSystem {\n // ============ Events ============\n\n event ReserveDeposited(\n address indexed asset,\n uint256 amount,\n address indexed depositor,\n bytes32 indexed reserveId\n );\n\n event ReserveWithdrawn(\n address indexed asset,\n uint256 amount,\n address indexed recipient,\n bytes32 indexed reserveId\n );\n\n event ConversionExecuted(\n address indexed sourceAsset,\n address indexed targetAsset,\n uint256 sourceAmount,\n uint256 targetAmount,\n bytes32 indexed conversionId,\n uint256 fees\n );\n\n event RedemptionExecuted(\n address indexed asset,\n uint256 amount,\n address indexed recipient,\n bytes32 indexed redemptionId\n );\n\n event PriceFeedUpdated(\n address indexed asset,\n uint256 price,\n uint256 timestamp\n );\n\n // ============ Reserve Management ============\n\n /**\n * @notice Deposit assets into the reserve system\n * @param asset Address of the asset to deposit\n * @param amount Amount to deposit\n * @return reserveId Unique identifier for this reserve deposit\n */\n function depositReserve(\n address asset,\n uint256 amount\n ) external returns (bytes32 reserveId);\n\n /**\n * @notice Withdraw assets from the reserve system\n * @param asset Address of the asset to withdraw\n * @param amount Amount to withdraw\n * @param recipient Address to receive the withdrawn assets\n * @return reserveId Unique identifier for this reserve withdrawal\n */\n function withdrawReserve(\n address asset,\n uint256 amount,\n address recipient\n ) external returns (bytes32 reserveId);\n\n /**\n * @notice Get the total reserve balance for an asset\n * @param asset Address of the asset\n * @return balance Total reserve balance\n */\n function getReserveBalance(address asset) external view returns (uint256 balance);\n\n /**\n * @notice Get reserve balance for a specific reserve ID\n * @param reserveId Unique identifier for the reserve\n * @return asset Address of the asset\n * @return balance Reserve balance\n */\n function getReserveById(bytes32 reserveId) external view returns (address asset, uint256 balance);\n\n // ============ Conversion ============\n\n /**\n * @notice Convert assets using optimal path (XAU triangulation)\n * @param sourceAsset Address of the source asset\n * @param targetAsset Address of the target asset\n * @param amount Amount to convert\n * @return conversionId Unique identifier for this conversion\n * @return targetAmount Amount received after conversion\n * @return fees Total fees charged\n */\n function convertAssets(\n address sourceAsset,\n address targetAsset,\n uint256 amount\n ) external returns (\n bytes32 conversionId,\n uint256 targetAmount,\n uint256 fees\n );\n\n /**\n * @notice Calculate conversion amount without executing\n * @param sourceAsset Address of the source asset\n * @param targetAsset Address of the target asset\n * @param amount Amount to convert\n * @return targetAmount Expected amount after conversion\n * @return fees Expected fees\n * @return path Optimal conversion path\n */\n function calculateConversion(\n address sourceAsset,\n address targetAsset,\n uint256 amount\n ) external view returns (\n uint256 targetAmount,\n uint256 fees,\n address[] memory path\n );\n\n // ============ Redemption ============\n\n /**\n * @notice Redeem assets from the reserve system\n * @param asset Address of the asset to redeem\n * @param amount Amount to redeem\n * @param recipient Address to receive the redeemed assets\n * @return redemptionId Unique identifier for this redemption\n */\n function redeem(\n address asset,\n uint256 amount,\n address recipient\n ) external returns (bytes32 redemptionId);\n\n // ============ Price Feeds ============\n\n /**\n * @notice Update price feed for an asset\n * @param asset Address of the asset\n * @param price Current price\n * @param timestamp Price timestamp\n */\n function updatePriceFeed(\n address asset,\n uint256 price,\n uint256 timestamp\n ) external;\n\n /**\n * @notice Get current price for an asset\n * @param asset Address of the asset\n * @return price Current price\n * @return timestamp Price timestamp\n */\n function getPrice(address asset) external view returns (uint256 price, uint256 timestamp);\n\n /**\n * @notice Get price for conversion between two assets\n * @param sourceAsset Address of the source asset\n * @param targetAsset Address of the target asset\n * @return price Conversion price (target per source)\n */\n function getConversionPrice(\n address sourceAsset,\n address targetAsset\n ) external view returns (uint256 price);\n}\n\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"}},"settings":{"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","forge-std/=lib/forge-std/src/","ds-test/=lib/forge-std/lib/ds-test/src/","@emoney/=contracts/emoney/","@emoney-scripts/=script/emoney/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","dodo-contractV2/=lib/dodo-contractV2/","hardhat/=lib/dodo-contractV2/node_modules/hardhat/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"london","viaIR":true,"libraries":{}}} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/dex/DODOPMMIntegration.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/dex/DODOPMMIntegration.sol new file mode 100644 index 0000000..90a4b4d --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/dex/DODOPMMIntegration.sol @@ -0,0 +1,599 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "../reserve/IReserveSystem.sol"; + +/** + * @title DODO PMM Pool Interface + * @notice Simplified interface for DODO Proactive Market Maker pools + * @dev Actual DODO interfaces may vary - this is a simplified version + */ +interface IDODOPMMPool { + function _BASE_TOKEN_() external view returns (address); + function _QUOTE_TOKEN_() external view returns (address); + function sellBase(uint256 amount) external returns (uint256); + function sellQuote(uint256 amount) external returns (uint256); + function buyShares(address to) external returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare); + function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve); + function getMidPrice() external view returns (uint256); + function _QUOTE_RESERVE_() external view returns (uint256); + function _BASE_RESERVE_() external view returns (uint256); +} + +/** + * @title DODO Vending Machine Interface + * @notice Interface for creating DODO Vending Machine (DVM) pools + */ +interface IDODOVendingMachine { + function createDVM( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 i, + uint256 k, + bool isOpenTWAP + ) external returns (address dvm); +} + +/** + * @title DODOPMMIntegration + * @notice Integration contract for DODO PMM pools with CompliantUSDT/USDC + * @dev Manages liquidity pools on DODO and provides swap functionality between + * compliant tokens (cUSDT/cUSDC) and official tokens (USDT/USDC) + * + * This contract facilitates exchangeability between compliant and official tokens + * through DODO's Proactive Market Maker algorithm, which maintains price stability + * and provides efficient liquidity. + */ +contract DODOPMMIntegration is AccessControl, ReentrancyGuard { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + bytes32 public constant SWAP_OPERATOR_ROLE = keccak256("SWAP_OPERATOR_ROLE"); + + // DODO contracts + address public immutable dodoVendingMachine; + address public immutable dodoApprove; // DODO's approval contract for gas optimization + + // Token addresses + address public immutable officialUSDT; // Official USDT on destination chain + address public immutable officialUSDC; // Official USDC on destination chain + address public immutable compliantUSDT; // cUSDT on Chain 138 + address public immutable compliantUSDC; // cUSDC on Chain 138 + + // Pool mappings + mapping(address => mapping(address => address)) public pools; // token0 => token1 => pool + mapping(address => bool) public isRegisteredPool; + + // Pool configuration + struct PoolConfig { + address pool; + address baseToken; + address quoteToken; + uint256 lpFeeRate; // Basis points (100 = 1%) + uint256 i; // Initial price (1e18 = $1 for stablecoins) + uint256 k; // Slippage factor (0.5 = 500000000000000000, lower = less slippage) + bool isOpenTWAP; // Enable TWAP oracle for price discovery + uint256 createdAt; + } + + mapping(address => PoolConfig) public poolConfigs; + address[] public allPools; + + /// @notice Optional ReserveSystem for oracle-backed mid price (base/quote in reserve system) + IReserveSystem public reserveSystem; + + event PoolCreated( + address indexed pool, + address indexed baseToken, + address indexed quoteToken, + address creator + ); + event LiquidityAdded( + address indexed pool, + address indexed provider, + uint256 baseAmount, + uint256 quoteAmount, + uint256 lpShares + ); + event SwapExecuted( + address indexed pool, + address indexed tokenIn, + address indexed tokenOut, + uint256 amountIn, + uint256 amountOut, + address trader + ); + event PoolRemoved(address indexed pool); + event ReserveSystemSet(address indexed reserveSystem); + + constructor( + address admin, + address dodoVendingMachine_, + address dodoApprove_, + address officialUSDT_, + address officialUSDC_, + address compliantUSDT_, + address compliantUSDC_ + ) { + require(admin != address(0), "DODOPMMIntegration: zero admin"); + require(dodoVendingMachine_ != address(0), "DODOPMMIntegration: zero DVM"); + require(officialUSDT_ != address(0), "DODOPMMIntegration: zero USDT"); + require(officialUSDC_ != address(0), "DODOPMMIntegration: zero USDC"); + require(compliantUSDT_ != address(0), "DODOPMMIntegration: zero cUSDT"); + require(compliantUSDC_ != address(0), "DODOPMMIntegration: zero cUSDC"); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + _grantRole(SWAP_OPERATOR_ROLE, admin); + + dodoVendingMachine = dodoVendingMachine_; + dodoApprove = dodoApprove_; + officialUSDT = officialUSDT_; + officialUSDC = officialUSDC_; + compliantUSDT = compliantUSDT_; + compliantUSDC = compliantUSDC_; + } + + /** + * @notice Create DODO PMM pool for cUSDT/USDT pair + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage, higher = more slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTUSDTPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][officialUSDT] == address(0), "DODOPMMIntegration: pool exists"); + + // Create DVM pool using DODO Vending Machine + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + officialUSDT, // quoteToken (USDT) + lpFeeRate, // LP fee rate + initialPrice, // Initial price + k, // Slippage factor + isOpenTWAP // Enable TWAP + ); + + // Register pool + pools[compliantUSDT][officialUSDT] = pool; + pools[officialUSDT][compliantUSDT] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDT, + quoteToken: officialUSDT, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDT, officialUSDT, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDC/USDC pair + * @param lpFeeRate Liquidity provider fee rate (basis points) + * @param initialPrice Initial price (1e18 = $1) + * @param k Slippage factor + * @param isOpenTWAP Enable TWAP oracle + */ + function createCUSDCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDC][officialUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDC, + officialUSDC, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[compliantUSDC][officialUSDC] = pool; + pools[officialUSDC][compliantUSDC] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDC, + quoteToken: officialUSDC, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDC, officialUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for cUSDT/cUSDC pair (public liquidity per VAULT_SYSTEM_MASTER_TECHNICAL_PLAN §4) + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoin pairs) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createCUSDTCUSDCPool( + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(pools[compliantUSDT][compliantUSDC] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + compliantUSDT, // baseToken (cUSDT) + compliantUSDC, // quoteToken (cUSDC) + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[compliantUSDT][compliantUSDC] = pool; + pools[compliantUSDC][compliantUSDT] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: compliantUSDT, + quoteToken: compliantUSDC, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, compliantUSDT, compliantUSDC, msg.sender); + } + + /** + * @notice Create DODO PMM pool for any base/quote token pair (generic) + * @param baseToken Base token address + * @param quoteToken Quote token address + * @param lpFeeRate Liquidity provider fee rate (basis points, 3 = 0.03%) + * @param initialPrice Initial price (1e18 = $1 for stablecoins) + * @param k Slippage factor (0.5e18 = 50%, lower = less slippage) + * @param isOpenTWAP Enable TWAP oracle for price discovery + */ + function createPool( + address baseToken, + address quoteToken, + uint256 lpFeeRate, + uint256 initialPrice, + uint256 k, + bool isOpenTWAP + ) external onlyRole(POOL_MANAGER_ROLE) returns (address pool) { + require(baseToken != address(0), "DODOPMMIntegration: zero base"); + require(quoteToken != address(0), "DODOPMMIntegration: zero quote"); + require(baseToken != quoteToken, "DODOPMMIntegration: same token"); + require(pools[baseToken][quoteToken] == address(0), "DODOPMMIntegration: pool exists"); + + pool = IDODOVendingMachine(dodoVendingMachine).createDVM( + baseToken, + quoteToken, + lpFeeRate, + initialPrice, + k, + isOpenTWAP + ); + + pools[baseToken][quoteToken] = pool; + pools[quoteToken][baseToken] = pool; + isRegisteredPool[pool] = true; + allPools.push(pool); + + poolConfigs[pool] = PoolConfig({ + pool: pool, + baseToken: baseToken, + quoteToken: quoteToken, + lpFeeRate: lpFeeRate, + i: initialPrice, + k: k, + isOpenTWAP: isOpenTWAP, + createdAt: block.timestamp + }); + + emit PoolCreated(pool, baseToken, quoteToken, msg.sender); + } + + /** + * @notice Add liquidity to a DODO PMM pool + * @param pool Pool address + * @param baseAmount Amount of base token to deposit + * @param quoteAmount Amount of quote token to deposit + */ + function addLiquidity( + address pool, + uint256 baseAmount, + uint256 quoteAmount + ) external nonReentrant returns (uint256 baseShare, uint256 quoteShare, uint256 lpShare) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(baseAmount > 0 && quoteAmount > 0, "DODOPMMIntegration: zero amount"); + + PoolConfig memory config = poolConfigs[pool]; + + // Transfer tokens to pool (DODO pools handle their own token management) + IERC20(config.baseToken).safeTransferFrom(msg.sender, pool, baseAmount); + IERC20(config.quoteToken).safeTransferFrom(msg.sender, pool, quoteAmount); + + // Call buyShares on DODO pool to add liquidity + (baseShare, quoteShare, lpShare) = IDODOPMMPool(pool).buyShares(msg.sender); + + emit LiquidityAdded(pool, msg.sender, baseAmount, quoteAmount, lpShare); + } + + /** + * @notice Swap cUSDT for official USDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDT to sell + * @param minAmountOut Minimum amount of USDT to receive (slippage protection) + */ + function swapCUSDTForUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer cUSDT to pool + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell base token) + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDT, officialUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDT for cUSDT via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDT to sell + * @param minAmountOut Minimum amount of cUSDT to receive + */ + function swapUSDTForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDT, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + // Transfer USDT to pool + IERC20(officialUSDT).safeTransferFrom(msg.sender, pool, amountIn); + + // Execute swap (sell quote token) + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDT, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for official USDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of cUSDC to sell + * @param minAmountOut Minimum amount of USDC to receive + */ + function swapCUSDCForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, compliantUSDC, officialUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap official USDC for cUSDC via DODO PMM + * @param pool Pool address + * @param amountIn Amount of USDC to sell + * @param minAmountOut Minimum amount of cUSDC to receive + */ + function swapUSDCForCUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].quoteToken == officialUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(officialUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + + emit SwapExecuted(pool, officialUSDC, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDT for cUSDC via cUSDT/cUSDC DODO PMM pool (public liquidity pair per Master Plan §4) + */ + function swapCUSDTForUSDC( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDT).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(compliantUSDC).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, compliantUSDT, compliantUSDC, amountIn, amountOut, msg.sender); + } + + /** + * @notice Swap cUSDC for cUSDT via cUSDT/cUSDC DODO PMM pool + */ + function swapUSDCForCUSDT( + address pool, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + require(poolConfigs[pool].baseToken == compliantUSDT && poolConfigs[pool].quoteToken == compliantUSDC, "DODOPMMIntegration: invalid pool"); + require(amountIn > 0, "DODOPMMIntegration: zero amount"); + + IERC20(compliantUSDC).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(compliantUSDT).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, compliantUSDC, compliantUSDT, amountIn, amountOut, msg.sender); + } + + /** + * @notice Generic swap for any registered pool (full mesh routing). + * @param pool Pool address + * @param tokenIn Token to sell + * @param amountIn Amount of tokenIn + * @param minAmountOut Minimum amount of tokenOut to receive + * @return amountOut Amount of quote/base token received (sent to msg.sender) + */ + function swapExactIn( + address pool, + address tokenIn, + uint256 amountIn, + uint256 minAmountOut + ) external nonReentrant returns (uint256 amountOut) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + PoolConfig memory config = poolConfigs[pool]; + address tokenOut; + if (tokenIn == config.baseToken) { + tokenOut = config.quoteToken; + IERC20(tokenIn).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellBase(amountIn); + } else if (tokenIn == config.quoteToken) { + tokenOut = config.baseToken; + IERC20(tokenIn).safeTransferFrom(msg.sender, pool, amountIn); + amountOut = IDODOPMMPool(pool).sellQuote(amountIn); + } else { + revert("DODOPMMIntegration: token not in pool"); + } + require(amountOut >= minAmountOut, "DODOPMMIntegration: insufficient output"); + IERC20(tokenOut).safeTransfer(msg.sender, amountOut); + emit SwapExecuted(pool, tokenIn, tokenOut, amountIn, amountOut, msg.sender); + } + + /** + * @notice Set optional ReserveSystem for oracle-backed mid price + * @param reserveSystem_ ReserveSystem address (address(0) to disable) + */ + function setReserveSystem(address reserveSystem_) external onlyRole(DEFAULT_ADMIN_ROLE) { + reserveSystem = IReserveSystem(reserveSystem_); + emit ReserveSystemSet(reserveSystem_); + } + + /** + * @notice Get pool price: oracle (ReserveSystem) if configured and available, else pool getMidPrice() + * @param pool Pool address + * @return price Price in 18 decimals (quote per base; 1e18 = $1 for stablecoins) + */ + function getPoolPriceOrOracle(address pool) public view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + if (address(reserveSystem) != address(0)) { + PoolConfig memory config = poolConfigs[pool]; + try reserveSystem.getConversionPrice(config.baseToken, config.quoteToken) returns (uint256 oraclePrice) { + if (oraclePrice > 0) return oraclePrice; + } catch { } + } + return IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get current pool price (pool mid only; use getPoolPriceOrOracle for oracle-backed price) + * @param pool Pool address + * @return price Current mid price (1e18 = $1 for stablecoins) + */ + function getPoolPrice(address pool) external view returns (uint256 price) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + price = IDODOPMMPool(pool).getMidPrice(); + } + + /** + * @notice Get pool reserves + * @param pool Pool address + * @return baseReserve Base token reserve + * @return quoteReserve Quote token reserve + */ + function getPoolReserves(address pool) external view returns (uint256 baseReserve, uint256 quoteReserve) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + (baseReserve, quoteReserve) = IDODOPMMPool(pool).getVaultReserve(); + } + + /** + * @notice Get pool configuration + * @param pool Pool address + * @return config Pool configuration struct + */ + function getPoolConfig(address pool) external view returns (PoolConfig memory config) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + config = poolConfigs[pool]; + } + + /** + * @notice Get all registered pools + * @return List of all pool addresses + */ + function getAllPools() external view returns (address[] memory) { + return allPools; + } + + /** + * @notice Remove pool (emergency only) + * @param pool Pool address to remove + */ + function removePool(address pool) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(isRegisteredPool[pool], "DODOPMMIntegration: pool not registered"); + + PoolConfig memory config = poolConfigs[pool]; + pools[config.baseToken][config.quoteToken] = address(0); + pools[config.quoteToken][config.baseToken] = address(0); + isRegisteredPool[pool] = false; + + delete poolConfigs[pool]; + + emit PoolRemoved(pool); + } +} + diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/liquidity/interfaces/ILiquidityProvider.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/liquidity/interfaces/ILiquidityProvider.sol new file mode 100644 index 0000000..4d63902 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/liquidity/interfaces/ILiquidityProvider.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +interface ILiquidityProvider { + function getQuote(address tokenIn, address tokenOut, uint256 amountIn) + external view returns (uint256 amountOut, uint256 slippageBps); + function executeSwap(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut) + external returns (uint256 amountOut); + function supportsTokenPair(address tokenIn, address tokenOut) external view returns (bool); + function providerName() external pure returns (string memory); + function estimateGas(address tokenIn, address tokenOut, uint256 amountIn) external view returns (uint256); +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/liquidity/providers/DODOPMMProvider.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/liquidity/providers/DODOPMMProvider.sol new file mode 100644 index 0000000..1a10561 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/liquidity/providers/DODOPMMProvider.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "../interfaces/ILiquidityProvider.sol"; +import "../../dex/DODOPMMIntegration.sol"; + +/** + * @title DODOPMMProvider + * @notice Wrapper for DODO PMM with extended functionality + * @dev Implements ILiquidityProvider for multi-provider liquidity system + */ +contract DODOPMMProvider is ILiquidityProvider, AccessControl { + using SafeERC20 for IERC20; + + bytes32 public constant POOL_MANAGER_ROLE = keccak256("POOL_MANAGER_ROLE"); + + DODOPMMIntegration public dodoIntegration; + + // Pool tracking + mapping(address => mapping(address => address)) public pools; // tokenIn => tokenOut => pool + mapping(address => bool) public isKnownPool; + + event PoolCreated(address indexed tokenIn, address indexed tokenOut, address pool); + event PoolOptimized(address indexed pool, uint256 newK, uint256 newI); + + constructor(address _dodoIntegration, address admin) { + require(_dodoIntegration != address(0), "Zero address"); + + dodoIntegration = DODOPMMIntegration(_dodoIntegration); + + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _grantRole(POOL_MANAGER_ROLE, admin); + } + + /** + * @notice Get quote from DODO PMM + */ + function getQuote( + address tokenIn, + address tokenOut, + uint256 amountIn + ) external view override returns (uint256 amountOut, uint256 slippageBps) { + address pool = pools[tokenIn][tokenOut]; + + if (pool == address(0)) { + return (0, 10000); // No pool, 100% slippage + } + + try dodoIntegration.getPoolPriceOrOracle(pool) returns (uint256 price) { + // Simple calculation (in production, would use actual DODO math) + amountOut = (amountIn * price) / 1e18; + slippageBps = 30; // 0.3% typical for stablecoin pools + return (amountOut, slippageBps); + } catch { + return (0, 10000); + } + } + + /** + * @notice Execute swap via DODO PMM + */ + function executeSwap( + address tokenIn, + address tokenOut, + uint256 amountIn, + uint256 minAmountOut + ) external override returns (uint256 amountOut) { + // Get pool for token pair + address pool = pools[tokenIn][tokenOut]; + require(pool != address(0), "Pool not found"); + + // Transfer tokens from caller + IERC20(tokenIn).safeTransferFrom(msg.sender, address(this), amountIn); + + // Route to appropriate swap method: use dedicated methods for the 6 legacy pairs, + // otherwise use generic swapExactIn for full-mesh routing (any registered pool). + if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.officialUSDT()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapCUSDTForUSDT(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.officialUSDT() && tokenOut == dodoIntegration.compliantUSDT()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapUSDTForCUSDT(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.officialUSDC()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapCUSDCForUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.officialUSDC() && tokenOut == dodoIntegration.compliantUSDC()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapUSDCForCUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDT() && tokenOut == dodoIntegration.compliantUSDC()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapCUSDTForUSDC(pool, amountIn, minAmountOut); + } else if (tokenIn == dodoIntegration.compliantUSDC() && tokenOut == dodoIntegration.compliantUSDT()) { + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapUSDCForCUSDT(pool, amountIn, minAmountOut); + } else { + // Full mesh: any registered pool (c* vs c*, c* vs official, etc.) + IERC20(tokenIn).approve(address(dodoIntegration), amountIn); + amountOut = dodoIntegration.swapExactIn(pool, tokenIn, amountIn, minAmountOut); + } + + // Transfer output tokens to caller + IERC20(tokenOut).safeTransfer(msg.sender, amountOut); + + return amountOut; + } + + /** + * @notice Check if provider supports token pair + */ + function supportsTokenPair( + address tokenIn, + address tokenOut + ) external view override returns (bool) { + return pools[tokenIn][tokenOut] != address(0); + } + + /** + * @notice Get provider name + */ + function providerName() external pure override returns (string memory) { + return "DODO PMM"; + } + + /** + * @notice Estimate gas for swap + */ + function estimateGas( + address, + address, + uint256 + ) external pure override returns (uint256) { + return 150000; // Typical gas for DODO swap + } + + /** + * @notice Ensure pool exists for token pair + */ + function ensurePoolExists(address tokenIn, address tokenOut) external onlyRole(POOL_MANAGER_ROLE) { + if (pools[tokenIn][tokenOut] == address(0)) { + _createOptimalPool(tokenIn, tokenOut); + } + } + + /// @dev Default params for stablecoin pairs: 0.03% fee, 1:1 price, k=0.5e18 + uint256 private constant DEFAULT_LP_FEE = 3; + uint256 private constant DEFAULT_I = 1e18; + uint256 private constant DEFAULT_K = 0.5e18; + + /** + * @notice Create optimal DODO pool via DODOPMMIntegration + * @dev Requires DODOPMMIntegration to grant POOL_MANAGER_ROLE to this contract + */ + function _createOptimalPool(address tokenIn, address tokenOut) internal { + address pool = dodoIntegration.createPool( + tokenIn, + tokenOut, + DEFAULT_LP_FEE, + DEFAULT_I, + DEFAULT_K, + false // isOpenTWAP - disable for stablecoins + ); + pools[tokenIn][tokenOut] = pool; + pools[tokenOut][tokenIn] = pool; + isKnownPool[pool] = true; + emit PoolCreated(tokenIn, tokenOut, pool); + } + + /** + * @notice Register existing pool + */ + function registerPool( + address tokenIn, + address tokenOut, + address pool + ) external onlyRole(POOL_MANAGER_ROLE) { + require(pool != address(0), "Zero address"); + + pools[tokenIn][tokenOut] = pool; + isKnownPool[pool] = true; + + emit PoolCreated(tokenIn, tokenOut, pool); + } + + /** + * @notice Optimize pool parameters (K, I) + * @dev DODO PMM parameters are typically oracle-driven; DVM pools may expose + * setK/setI. Emits for off-chain monitoring. If the pool supports + * parameter updates, extend this to call the pool's update functions. + */ + function optimizePoolParameters( + address pool, + uint256 newK, + uint256 newI + ) external onlyRole(POOL_MANAGER_ROLE) { + require(isKnownPool[pool], "Unknown pool"); + // DODO DVM/PMM: parameters set at creation; oracle-driven rebalancing. + // Emit for observability; integrate pool.setK/setI when supported. + emit PoolOptimized(pool, newK, newI); + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/reserve/IReserveSystem.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/reserve/IReserveSystem.sol new file mode 100644 index 0000000..c23f819 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/contracts/reserve/IReserveSystem.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title IReserveSystem + * @notice Interface for the GRU Reserve System + * @dev Defines the core functionality for reserve management, conversion, and redemption + */ +interface IReserveSystem { + // ============ Events ============ + + event ReserveDeposited( + address indexed asset, + uint256 amount, + address indexed depositor, + bytes32 indexed reserveId + ); + + event ReserveWithdrawn( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed reserveId + ); + + event ConversionExecuted( + address indexed sourceAsset, + address indexed targetAsset, + uint256 sourceAmount, + uint256 targetAmount, + bytes32 indexed conversionId, + uint256 fees + ); + + event RedemptionExecuted( + address indexed asset, + uint256 amount, + address indexed recipient, + bytes32 indexed redemptionId + ); + + event PriceFeedUpdated( + address indexed asset, + uint256 price, + uint256 timestamp + ); + + // ============ Reserve Management ============ + + /** + * @notice Deposit assets into the reserve system + * @param asset Address of the asset to deposit + * @param amount Amount to deposit + * @return reserveId Unique identifier for this reserve deposit + */ + function depositReserve( + address asset, + uint256 amount + ) external returns (bytes32 reserveId); + + /** + * @notice Withdraw assets from the reserve system + * @param asset Address of the asset to withdraw + * @param amount Amount to withdraw + * @param recipient Address to receive the withdrawn assets + * @return reserveId Unique identifier for this reserve withdrawal + */ + function withdrawReserve( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 reserveId); + + /** + * @notice Get the total reserve balance for an asset + * @param asset Address of the asset + * @return balance Total reserve balance + */ + function getReserveBalance(address asset) external view returns (uint256 balance); + + /** + * @notice Get reserve balance for a specific reserve ID + * @param reserveId Unique identifier for the reserve + * @return asset Address of the asset + * @return balance Reserve balance + */ + function getReserveById(bytes32 reserveId) external view returns (address asset, uint256 balance); + + // ============ Conversion ============ + + /** + * @notice Convert assets using optimal path (XAU triangulation) + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return conversionId Unique identifier for this conversion + * @return targetAmount Amount received after conversion + * @return fees Total fees charged + */ + function convertAssets( + address sourceAsset, + address targetAsset, + uint256 amount + ) external returns ( + bytes32 conversionId, + uint256 targetAmount, + uint256 fees + ); + + /** + * @notice Calculate conversion amount without executing + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @param amount Amount to convert + * @return targetAmount Expected amount after conversion + * @return fees Expected fees + * @return path Optimal conversion path + */ + function calculateConversion( + address sourceAsset, + address targetAsset, + uint256 amount + ) external view returns ( + uint256 targetAmount, + uint256 fees, + address[] memory path + ); + + // ============ Redemption ============ + + /** + * @notice Redeem assets from the reserve system + * @param asset Address of the asset to redeem + * @param amount Amount to redeem + * @param recipient Address to receive the redeemed assets + * @return redemptionId Unique identifier for this redemption + */ + function redeem( + address asset, + uint256 amount, + address recipient + ) external returns (bytes32 redemptionId); + + // ============ Price Feeds ============ + + /** + * @notice Update price feed for an asset + * @param asset Address of the asset + * @param price Current price + * @param timestamp Price timestamp + */ + function updatePriceFeed( + address asset, + uint256 price, + uint256 timestamp + ) external; + + /** + * @notice Get current price for an asset + * @param asset Address of the asset + * @return price Current price + * @return timestamp Price timestamp + */ + function getPrice(address asset) external view returns (uint256 price, uint256 timestamp); + + /** + * @notice Get price for conversion between two assets + * @param sourceAsset Address of the source asset + * @param targetAsset Address of the target asset + * @return price Conversion price (target per source) + */ + function getConversionPrice( + address sourceAsset, + address targetAsset + ) external view returns (uint256 price); +} + diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/foundry.toml b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/foundry.toml new file mode 100644 index 0000000..fedc582 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/foundry.toml @@ -0,0 +1,24 @@ +[profile.default] +src = "." +out = "out" +cache_path = "cache" +libs = [] +remappings = [ + "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", + "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", + "forge-std/=lib/forge-std/src/", + "ds-test/=lib/forge-std/lib/ds-test/src/", + "@emoney/=contracts/emoney/", + "@emoney-scripts/=script/emoney/", + "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", + "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/", + "dodo-contractV2/=lib/dodo-contractV2/", + "hardhat/=lib/dodo-contractV2/node_modules/hardhat/" +] +solc = "0.8.20" +optimizer = true +optimizer_runs = 200 +via_ir = true +evm_version = "london" +auto_detect_remappings = false diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/access/AccessControl.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/access/AccessControl.sol new file mode 100644 index 0000000..3e3341e --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/access/AccessControl.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) + +pragma solidity ^0.8.20; + +import {IAccessControl} from "./IAccessControl.sol"; +import {Context} from "../utils/Context.sol"; +import {ERC165} from "../utils/introspection/ERC165.sol"; + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ```solidity + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ```solidity + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} + * to enforce additional security measures for this role. + */ +abstract contract AccessControl is Context, IAccessControl, ERC165 { + struct RoleData { + mapping(address account => bool) hasRole; + bytes32 adminRole; + } + + mapping(bytes32 role => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with an {AccessControlUnauthorizedAccount} error including the required role. + */ + modifier onlyRole(bytes32 role) { + _checkRole(role); + _; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view virtual returns (bool) { + return _roles[role].hasRole[account]; + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` + * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. + */ + function _checkRole(bytes32 role) internal view virtual { + _checkRole(role, _msgSender()); + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` + * is missing `role`. + */ + function _checkRole(bytes32 role, address account) internal view virtual { + if (!hasRole(role, account)) { + revert AccessControlUnauthorizedAccount(account, role); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleGranted} event. + */ + function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleRevoked} event. + */ + function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been revoked `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + * + * May emit a {RoleRevoked} event. + */ + function renounceRole(bytes32 role, address callerConfirmation) public virtual { + if (callerConfirmation != _msgSender()) { + revert AccessControlBadConfirmation(); + } + + _revokeRole(role, callerConfirmation); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + /** + * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. + * + * Internal function without access restriction. + * + * May emit a {RoleGranted} event. + */ + function _grantRole(bytes32 role, address account) internal virtual returns (bool) { + if (!hasRole(role, account)) { + _roles[role].hasRole[account] = true; + emit RoleGranted(role, account, _msgSender()); + return true; + } else { + return false; + } + } + + /** + * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. + * + * Internal function without access restriction. + * + * May emit a {RoleRevoked} event. + */ + function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { + if (hasRole(role, account)) { + _roles[role].hasRole[account] = false; + emit RoleRevoked(role, account, _msgSender()); + return true; + } else { + return false; + } + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol new file mode 100644 index 0000000..2ac89ca --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) + +pragma solidity ^0.8.20; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev The `account` is missing a role. + */ + error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); + + /** + * @dev The caller of a function is not the expected one. + * + * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. + */ + error AccessControlBadConfirmation(); + + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + */ + event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + */ + function renounceRole(bytes32 role, address callerConfirmation) external; +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol new file mode 100644 index 0000000..db01cf4 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); + + /** + * @dev Returns the value of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the value of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves a `value` amount of tokens from the caller's account to `to`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address to, uint256 value) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets a `value` amount of tokens as the allowance of `spender` over the + * caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 value) external returns (bool); + + /** + * @dev Moves a `value` amount of tokens from `from` to `to` using the + * allowance mechanism. `value` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address from, address to, uint256 value) external returns (bool); +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol new file mode 100644 index 0000000..5af4810 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in + * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. + * + * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by + * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't + * need to send a transaction, and thus is not required to hold Ether at all. + * + * ==== Security Considerations + * + * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature + * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be + * considered as an intention to spend the allowance in any specific way. The second is that because permits have + * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should + * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be + * generally recommended is: + * + * ```solidity + * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { + * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} + * doThing(..., value); + * } + * + * function doThing(..., uint256 value) public { + * token.safeTransferFrom(msg.sender, address(this), value); + * ... + * } + * ``` + * + * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of + * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also + * {SafeERC20-safeTransferFrom}). + * + * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so + * contracts should have entry points that don't rely on permit. + */ +interface IERC20Permit { + /** + * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, + * given ``owner``'s signed approval. + * + * IMPORTANT: The same issues {IERC20-approve} has related to transaction + * ordering also apply here. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `deadline` must be a timestamp in the future. + * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` + * over the EIP712-formatted function arguments. + * - the signature must use ``owner``'s current nonce (see {nonces}). + * + * For more information on the signature format, see the + * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP + * section]. + * + * CAUTION: See Security Considerations above. + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @dev Returns the current nonce for `owner`. This value must be + * included whenever a signature is generated for {permit}. + * + * Every successful call to {permit} increases ``owner``'s nonce by one. This + * prevents a signature from being used multiple times. + */ + function nonces(address owner) external view returns (uint256); + + /** + * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. + */ + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view returns (bytes32); +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol new file mode 100644 index 0000000..bb65709 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) + +pragma solidity ^0.8.20; + +import {IERC20} from "../IERC20.sol"; +import {IERC20Permit} from "../extensions/IERC20Permit.sol"; +import {Address} from "../../../utils/Address.sol"; + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using Address for address; + + /** + * @dev An operation with an ERC20 token failed. + */ + error SafeERC20FailedOperation(address token); + + /** + * @dev Indicates a failed `decreaseAllowance` request. + */ + error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); + + /** + * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeTransfer(IERC20 token, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); + } + + /** + * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the + * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. + */ + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); + } + + /** + * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + uint256 oldAllowance = token.allowance(address(this), spender); + forceApprove(token, spender, oldAllowance + value); + } + + /** + * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no + * value, non-reverting calls are assumed to be successful. + */ + function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { + unchecked { + uint256 currentAllowance = token.allowance(address(this), spender); + if (currentAllowance < requestedDecrease) { + revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); + } + forceApprove(token, spender, currentAllowance - requestedDecrease); + } + } + + /** + * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval + * to be set to zero before setting it to a non-zero value, such as USDT. + */ + function forceApprove(IERC20 token, address spender, uint256 value) internal { + bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); + + if (!_callOptionalReturnBool(token, approvalCall)) { + _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); + _callOptionalReturn(token, approvalCall); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function _callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that + // the target address contains contract code and also asserts for success in the low-level call. + + bytes memory returndata = address(token).functionCall(data); + if (returndata.length != 0 && !abi.decode(returndata, (bool))) { + revert SafeERC20FailedOperation(address(token)); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + * + * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. + */ + function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false + // and not revert is the subcall reverts. + + (bool success, bytes memory returndata) = address(token).call(data); + return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/Address.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/Address.sol new file mode 100644 index 0000000..b7e3059 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/Address.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev The ETH balance of the account is not enough to perform the operation. + */ + error AddressInsufficientBalance(address account); + + /** + * @dev There's no code at `target` (it is not a contract). + */ + error AddressEmptyCode(address target); + + /** + * @dev A call to an address target failed. The target may have reverted. + */ + error FailedInnerCall(); + + /** + * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + if (address(this).balance < amount) { + revert AddressInsufficientBalance(address(this)); + } + + (bool success, ) = recipient.call{value: amount}(""); + if (!success) { + revert FailedInnerCall(); + } + } + + /** + * @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 or custom error, it is bubbled + * up by this function (like regular Solidity function calls). However, if + * the call reverted with no returned reason, this function reverts with a + * {FailedInnerCall} error. + * + * 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. + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0); + } + + /** + * @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`. + */ + function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { + if (address(this).balance < value) { + revert AddressInsufficientBalance(address(this)); + } + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + */ + function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResultFromTarget(target, success, returndata); + } + + /** + * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target + * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an + * unsuccessful call. + */ + function verifyCallResultFromTarget( + address target, + bool success, + bytes memory returndata + ) internal view returns (bytes memory) { + if (!success) { + _revert(returndata); + } else { + // only check if target is a contract if the call was successful and the return data is empty + // otherwise we already know that it was a contract + if (returndata.length == 0 && target.code.length == 0) { + revert AddressEmptyCode(target); + } + return returndata; + } + } + + /** + * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the + * revert reason or with a default {FailedInnerCall} error. + */ + function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { + if (!success) { + _revert(returndata); + } else { + return returndata; + } + } + + /** + * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. + */ + function _revert(bytes memory returndata) private pure { + // 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 FailedInnerCall(); + } + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/Context.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/Context.sol new file mode 100644 index 0000000..9037dcd --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/Context.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address) { + return msg.sender; + } + + function _msgData() internal view virtual returns (bytes calldata) { + return msg.data; + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol new file mode 100644 index 0000000..291d92f --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuard { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant NOT_ENTERED = 1; + uint256 private constant ENTERED = 2; + + uint256 private _status; + + /** + * @dev Unauthorized reentrant call. + */ + error ReentrancyGuardReentrantCall(); + + constructor() { + _status = NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and making it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + _nonReentrantBefore(); + _; + _nonReentrantAfter(); + } + + function _nonReentrantBefore() private { + // On the first call to nonReentrant, _status will be NOT_ENTERED + if (_status == ENTERED) { + revert ReentrancyGuardReentrantCall(); + } + + // Any calls to nonReentrant after this point will fail + _status = ENTERED; + } + + function _nonReentrantAfter() private { + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + _status = NOT_ENTERED; + } + + /** + * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a + * `nonReentrant` function in the call stack. + */ + function _reentrancyGuardEntered() internal view returns (bool) { + return _status == ENTERED; + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol new file mode 100644 index 0000000..1e77b60 --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) + +pragma solidity ^0.8.20; + +import {IERC165} from "./IERC165.sol"; + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + */ +abstract contract ERC165 is IERC165 { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} diff --git a/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol new file mode 100644 index 0000000..c09f31f --- /dev/null +++ b/verification-sources/chain138-dodo-standard-json/DODOPMMProvider/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Interface of the ERC165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[EIP]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} diff --git a/verification-sources/chain138-metadata-archive/QmNPTM3VDsJPCoYaQFDgAKFwLNTdbJna6Nr4KJhFESRvsy/archive-info.json b/verification-sources/chain138-metadata-archive/QmNPTM3VDsJPCoYaQFDgAKFwLNTdbJna6Nr4KJhFESRvsy/archive-info.json new file mode 100644 index 0000000..cb77597 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNPTM3VDsJPCoYaQFDgAKFwLNTdbJna6Nr4KJhFESRvsy/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNPTM3VDsJPCoYaQFDgAKFwLNTdbJna6Nr4KJhFESRvsy", + "metadata_digest": "00b7e4e19e17dea4415509d10775598f547078430e43267e812986dda06c9bf0", + "source_path": "contracts/bridge/adapters/evm/EVMAdapter.sol", + "contract_name": "EVMAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNPTM3VDsJPCoYaQFDgAKFwLNTdbJna6Nr4KJhFESRvsy/metadata.json b/verification-sources/chain138-metadata-archive/QmNPTM3VDsJPCoYaQFDgAKFwLNTdbJna6Nr4KJhFESRvsy/metadata.json new file mode 100644 index 0000000..27b731a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNPTM3VDsJPCoYaQFDgAKFwLNTdbJna6Nr4KJhFESRvsy/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"_bridge","type":"address"},{"internalType":"uint256","name":"_chainId","type":"uint256"},{"internalType":"string","name":"_chainName","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"EVMBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"destinationChainId","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"EVMBridgeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"confirmBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"universalBridge","outputs":[{"internalType":"contract UniversalCCIPBridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"Template adapter for Polygon, Arbitrum, Optimism, Base, Avalanche, BSC, Ethereum","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"EVMAdapter","version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"estimateFee(address,uint256,bytes)":{"notice":"Estimate bridge fee"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"}},"notice":"Standard bridge adapter for EVM-compatible chains","version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/evm/EVMAdapter.sol":"EVMAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/UniversalCCIPBridge.sol":{"keccak256":"0xcdbe2bad1997db39d23990cc77a7e304ff228d4de878b0a897285e9eaf1f39ca","license":"MIT","urls":["bzz-raw://fe0c40c17b7869587ecacd0fe72f880a3e1e8a836d7f93650d52123bbc9efce2","dweb:/ipfs/QmXqoeHhNAJqJqA7NHw4WjpqWW8SXwVJ7TosQkTp74NiDY"]},"contracts/bridge/adapters/evm/EVMAdapter.sol":{"keccak256":"0xba75d973ecf50278078abd8229cf561f48a2c94a7e46146b1555b52b4e776123","license":"MIT","urls":["bzz-raw://3ebc67c94eaa0aa6614589bbe6c5238526df08fb397ed116eff6c070714dc24e","dweb:/ipfs/QmckZAKvS8G94Np86uz2Y1biXkTSBZCxKJN9BxzREB6q9H"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNStJXecH28kvAjsgMEUEwQ9sqE8nZmVHuQ5JTcbfmguG/archive-info.json b/verification-sources/chain138-metadata-archive/QmNStJXecH28kvAjsgMEUEwQ9sqE8nZmVHuQ5JTcbfmguG/archive-info.json new file mode 100644 index 0000000..3e52b57 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNStJXecH28kvAjsgMEUEwQ9sqE8nZmVHuQ5JTcbfmguG/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmNStJXecH28kvAjsgMEUEwQ9sqE8nZmVHuQ5JTcbfmguG", + "metadata_digest": "0198dae59bc1e6bf131665270b599f8f0dd3a1afa5c0d253386db579cf535b93", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Factory.sol", + "contract_name": "IUniswapV2Factory", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNStJXecH28kvAjsgMEUEwQ9sqE8nZmVHuQ5JTcbfmguG/metadata.json b/verification-sources/chain138-metadata-archive/QmNStJXecH28kvAjsgMEUEwQ9sqE8nZmVHuQ5JTcbfmguG/metadata.json new file mode 100644 index 0000000..a569dc2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNStJXecH28kvAjsgMEUEwQ9sqE8nZmVHuQ5JTcbfmguG/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PairCreated","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setFeeToSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Factory.sol":"IUniswapV2Factory"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xcaec675e6250bf4cd3364459a0cbf789262af2aaa377d61d4d463f657aea7b50","license":"GPL-3.0","urls":["bzz-raw://2c09e004aa8654e1ad2a1e9d8500883f618d754e5a77c840e2c9064c7a80b5cb","dweb:/ipfs/QmamoA2xnZpLsu4gjNaWkfdYcL5VjRpFmR5shpoJ8wYjZw"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNUGdEu27EaVNEbssJo7WbVaAi4h2nCGYBhSUbsPXTpej/archive-info.json b/verification-sources/chain138-metadata-archive/QmNUGdEu27EaVNEbssJo7WbVaAi4h2nCGYBhSUbsPXTpej/archive-info.json new file mode 100644 index 0000000..252e9b7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNUGdEu27EaVNEbssJo7WbVaAi4h2nCGYBhSUbsPXTpej/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmNUGdEu27EaVNEbssJo7WbVaAi4h2nCGYBhSUbsPXTpej", + "metadata_digest": "01f3ad16a5c8632b9b43d819a014f3bf2959d74be96075f1d46597826ba28058", + "source_path": "contracts/vendor/sushiswap-v2/libraries/UQ112x112.sol", + "contract_name": "UQ112x112", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNUGdEu27EaVNEbssJo7WbVaAi4h2nCGYBhSUbsPXTpej/metadata.json b/verification-sources/chain138-metadata-archive/QmNUGdEu27EaVNEbssJo7WbVaAi4h2nCGYBhSUbsPXTpej/metadata.json new file mode 100644 index 0000000..1c393f0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNUGdEu27EaVNEbssJo7WbVaAi4h2nCGYBhSUbsPXTpej/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/libraries/UQ112x112.sol":"UQ112x112"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/libraries/UQ112x112.sol":{"keccak256":"0xc4574ee73aa220d7a8b363ef7c874c099b6007b0f30365993e758c8337a294d8","license":"GPL-3.0","urls":["bzz-raw://e27c362f1a0f0bf97004bccab2b19faaea0706bc8a21febca6e365de77a20536","dweb:/ipfs/QmZipPjDSok9FxPjMB5rPTuJ7P2VvhaNzHA92TpYvE16FR"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNYRsHbUziy4BrrWaNrq9XPYisjdZpqvVMGPA161oQMfQ/archive-info.json b/verification-sources/chain138-metadata-archive/QmNYRsHbUziy4BrrWaNrq9XPYisjdZpqvVMGPA161oQMfQ/archive-info.json new file mode 100644 index 0000000..b23e9de --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNYRsHbUziy4BrrWaNrq9XPYisjdZpqvVMGPA161oQMfQ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNYRsHbUziy4BrrWaNrq9XPYisjdZpqvVMGPA161oQMfQ", + "metadata_digest": "03047314728f6fda01bb355d62d18e72d0301ab478318596aac1184b9250a23b", + "source_path": "contracts/tokens/CompliantUSDC.sol", + "contract_name": "CompliantUSDC", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNYRsHbUziy4BrrWaNrq9XPYisjdZpqvVMGPA161oQMfQ/metadata.json b/verification-sources/chain138-metadata-archive/QmNYRsHbUziy4BrrWaNrq9XPYisjdZpqvVMGPA161oQMfQ/metadata.json new file mode 100644 index 0000000..978ef9a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNYRsHbUziy4BrrWaNrq9XPYisjdZpqvVMGPA161oQMfQ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mechanism","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisputeResolutionMechanismSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"JurisdictionDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LegalNotice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"ValueTransferDeclared","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISPUTE_RESOLUTION_MECHANISM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_ARBITRATION_SUPPORT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_TRADE_TERMS_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_UNIFORM_RULES_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTRUMENT_CLASSIFICATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_20022_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_27001_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_3166_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_4217_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_8601_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_ENFORCEABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_FRAMEWORK_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_JURISDICTION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATORY_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_OF_PROCESS_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFERABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAVEL_RULE_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"recordLegalNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Inherits from LegallyCompliantBase for Travel Rules exemption and regulatory compliance exemption","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"burn(uint256)":{"params":{"amount":"Amount of tokens to burn"}},"constructor":{"params":{"admin":"Address that will receive DEFAULT_ADMIN_ROLE for compliance","initialOwner":"Address that will own the contract"}},"decimals()":{"returns":{"_0":"Number of decimals (6 for USDC)"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"mint(address,uint256)":{"details":"Only owner can mint","params":{"amount":"Amount of tokens to mint","to":"Address to mint tokens to"}},"name()":{"details":"Returns the name of the token."},"owner()":{"details":"Returns the address of the current owner."},"pause()":{"details":"Only owner can pause"},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"recordLegalNotice(string)":{"params":{"message":"The legal notice message"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"unpause()":{"details":"Only owner can unpause"}},"title":"CompliantUSDC","version":1},"userdoc":{"kind":"user","methods":{"burn(uint256)":{"notice":"Burn tokens from caller's balance"},"constructor":{"notice":"Constructor"},"decimals()":{"notice":"Returns the number of decimals"},"mint(address,uint256)":{"notice":"Mint new tokens"},"pause()":{"notice":"Pause token transfers"},"recordLegalNotice(string)":{"notice":"Record a legal notice"},"unpause()":{"notice":"Unpause token transfers"}},"notice":"USD Coin (Compliant) - ERC20 token with full legal compliance","version":1}},"settings":{"compilationTarget":{"contracts/tokens/CompliantUSDC.sol":"CompliantUSDC"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/compliance/LegallyCompliantBase.sol":{"keccak256":"0x60b62492c7ad1f613a6070f38b3e6849d7a52d63dd68254bd95f96e733f74bb1","license":"MIT","urls":["bzz-raw://abcea0d6b1835eaccbd2b9eceaa1f04e3665fbdf3f2a61bcc52709e783a8ba51","dweb:/ipfs/Qmc8M9VQ2k2QP4UBXcjGfWQAojbmxNYUBVwNBfHSLFRorw"]},"contracts/tokens/CompliantUSDC.sol":{"keccak256":"0x6aa298250313bb037d6dc64809c55bf672b5617105e1dc7ea429a8d0f79c483a","license":"MIT","urls":["bzz-raw://bbb09cf55ac342d89008e3438222f4ca2a02a5ea6c12fa22cfe022f69030ef9a","dweb:/ipfs/QmdgBVbRNbVfuetSeY5DAHPfbmrCKS3WDt3yqhnvKhznnz"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNb3bhwDLNCqQ44EejbuEZqKYKPX5eLuECqKyNmtNi6gR/archive-info.json b/verification-sources/chain138-metadata-archive/QmNb3bhwDLNCqQ44EejbuEZqKYKPX5eLuECqKyNmtNi6gR/archive-info.json new file mode 100644 index 0000000..78022da --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNb3bhwDLNCqQ44EejbuEZqKYKPX5eLuECqKyNmtNi6gR/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNb3bhwDLNCqQ44EejbuEZqKYKPX5eLuECqKyNmtNi6gR", + "metadata_digest": "03b00343090c9b6483e519efefccaa9cf1ef4d6b3989f54315cce5a181ad9fba", + "source_path": "@openzeppelin/contracts/proxy/beacon/IBeacon.sol", + "contract_name": "IBeacon", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNb3bhwDLNCqQ44EejbuEZqKYKPX5eLuECqKyNmtNi6gR/metadata.json b/verification-sources/chain138-metadata-archive/QmNb3bhwDLNCqQ44EejbuEZqKYKPX5eLuECqKyNmtNi6gR/metadata.json new file mode 100644 index 0000000..d54170c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNb3bhwDLNCqQ44EejbuEZqKYKPX5eLuECqKyNmtNi6gR/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This is the interface that {BeaconProxy} expects of its beacon.","kind":"dev","methods":{"implementation()":{"details":"Must return an address that can be used as a delegate call target. {UpgradeableBeacon} will check that this address is a contract."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":"IBeacon"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNc3f8adeRo8zAp7DitBPb53t6jbAXSzNH11dJWsjWwVY/archive-info.json b/verification-sources/chain138-metadata-archive/QmNc3f8adeRo8zAp7DitBPb53t6jbAXSzNH11dJWsjWwVY/archive-info.json new file mode 100644 index 0000000..3d64e74 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNc3f8adeRo8zAp7DitBPb53t6jbAXSzNH11dJWsjWwVY/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNc3f8adeRo8zAp7DitBPb53t6jbAXSzNH11dJWsjWwVY", + "metadata_digest": "03f1a90aabb80c89a2f65e398253671adb7a7a603122df19e1574957b0b1fc37", + "source_path": "contracts/bridge/atomic/AtomicFulfillerRegistry.sol", + "contract_name": "AtomicFulfillerRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNc3f8adeRo8zAp7DitBPb53t6jbAXSzNH11dJWsjWwVY/metadata.json b/verification-sources/chain138-metadata-archive/QmNc3f8adeRo8zAp7DitBPb53t6jbAXSzNH11dJWsjWwVY/metadata.json new file mode 100644 index 0000000..d3dea04 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNc3f8adeRo8zAp7DitBPb53t6jbAXSzNH11dJWsjWwVY/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"bondToken_","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BondAlreadyLocked","type":"error"},{"inputs":[],"name":"BondMissing","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientAvailableBond","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnauthorizedFulfiller","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fulfiller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"fulfiller","type":"address"},{"indexed":true,"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"fulfiller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"fulfiller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondSlashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fulfiller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fulfiller","type":"address"},{"indexed":true,"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"}],"name":"CorridorAuthorizationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fulfiller","type":"address"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"FulfillerActivationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"AUTH_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COORDINATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLASHER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fulfiller","type":"address"}],"name":"availableBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"canCover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"corridorAuthorization","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fulfillerActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"bytes32","name":"corridorId","type":"bytes32"}],"name":"isFulfillerAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"lockedBonds","outputs":[{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"releaseBond","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"bool","name":"authorized","type":"bool"}],"name":"setCorridorAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setFulfillerActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"recipient","type":"address"}],"name":"slashBond","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawBond","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/AtomicFulfillerRegistry.sol":"AtomicFulfillerRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/atomic/AtomicFulfillerRegistry.sol":{"keccak256":"0xfe38eae62121179c164e9d60fe07476b79437c6d8b640f351eeb9471e6354937","license":"MIT","urls":["bzz-raw://0c1cea325f18408cb597870215c83d47b41f8ca5eb4af6f1feebcd90774608af","dweb:/ipfs/QmNpuRbSH3wHpyXDjcxxoyiyWhYJShcTGWgyg6tYqVdGRr"]},"contracts/bridge/atomic/interfaces/IAtomicFulfillerRegistry.sol":{"keccak256":"0xdd5c9766af720fb2b40a8e5232b818004999ab640e0420fd4cfd6198fdc9bf56","license":"MIT","urls":["bzz-raw://20a172cfc8b4a54f94bd889d464a84530467ab11085748437158368d931d828d","dweb:/ipfs/QmUKBHadjvVmiSc3cxBcMCg8496hpqFS1gEi4vhQJvj7R7"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNdwPDnPYdkBkpzXAnNZ5SBSxbazj2dobRxdreHMwW72D/archive-info.json b/verification-sources/chain138-metadata-archive/QmNdwPDnPYdkBkpzXAnNZ5SBSxbazj2dobRxdreHMwW72D/archive-info.json new file mode 100644 index 0000000..93f7507 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNdwPDnPYdkBkpzXAnNZ5SBSxbazj2dobRxdreHMwW72D/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmNdwPDnPYdkBkpzXAnNZ5SBSxbazj2dobRxdreHMwW72D", + "metadata_digest": "046dba4075d5625e24fca7c0519d3adc2f79120bbcb4feb316b26c7a1962b506", + "source_path": "contracts/vendor/sushiswap-v2/libraries/SafeMath.sol", + "contract_name": "SafeMathUniswap", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNdwPDnPYdkBkpzXAnNZ5SBSxbazj2dobRxdreHMwW72D/metadata.json b/verification-sources/chain138-metadata-archive/QmNdwPDnPYdkBkpzXAnNZ5SBSxbazj2dobRxdreHMwW72D/metadata.json new file mode 100644 index 0000000..123640a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNdwPDnPYdkBkpzXAnNZ5SBSxbazj2dobRxdreHMwW72D/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/libraries/SafeMath.sol":"SafeMathUniswap"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/libraries/SafeMath.sol":{"keccak256":"0xbde2cf4655f2f21a4e6cc76c28cf88ade1d8150289c208d48662135be9d5dd97","license":"GPL-3.0","urls":["bzz-raw://bd8f46ed9dc5ad8123e596a3b762815503a04ce8a83098d80ba45085fe3c5953","dweb:/ipfs/QmUa6d2v7Miy26dzUctkrumi5My4G34TL9QNUj9u4hh7iS"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNm5GnzzfPmh22ayZnTNYKHtC7jXm3Wiu3WmxrLqPRkrB/archive-info.json b/verification-sources/chain138-metadata-archive/QmNm5GnzzfPmh22ayZnTNYKHtC7jXm3Wiu3WmxrLqPRkrB/archive-info.json new file mode 100644 index 0000000..66cae75 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNm5GnzzfPmh22ayZnTNYKHtC7jXm3Wiu3WmxrLqPRkrB/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNm5GnzzfPmh22ayZnTNYKHtC7jXm3Wiu3WmxrLqPRkrB", + "metadata_digest": "0641b6aa81241eea62144ee5e219d5d82b66465595195c7227ccd37a057dad90", + "source_path": "contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol", + "contract_name": "TransferHelper", + "compiler": "0.6.6", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/fafa493132a3d2f65cdfc44051edfddd.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNm5GnzzfPmh22ayZnTNYKHtC7jXm3Wiu3WmxrLqPRkrB/metadata.json b/verification-sources/chain138-metadata-archive/QmNm5GnzzfPmh22ayZnTNYKHtC7jXm3Wiu3WmxrLqPRkrB/metadata.json new file mode 100644 index 0000000..53363a1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNm5GnzzfPmh22ayZnTNYKHtC7jXm3Wiu3WmxrLqPRkrB/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.6+commit.6c089d02"},"language":"Solidity","output":{"abi":[],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol":"TransferHelper"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol":{"keccak256":"0x7a9fb341d2bf50b0dfbce1d614f918ffc0598e1f3e31f8d2a949ab9ce25125af","urls":["bzz-raw://81ad1ae72ccc1aeae4416b14cde0fab746ef47515ec3c6750dcbeaa8086d9188","dweb:/ipfs/QmePznL6SjS5iw2TAhwznEAAkVskeseMyNA9psvTB6YtrV"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNmfzKQrNnW98EsgaJY2rm1F4cy6SgUoUMGxY9B8gu3Xd/archive-info.json b/verification-sources/chain138-metadata-archive/QmNmfzKQrNnW98EsgaJY2rm1F4cy6SgUoUMGxY9B8gu3Xd/archive-info.json new file mode 100644 index 0000000..21df9b7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNmfzKQrNnW98EsgaJY2rm1F4cy6SgUoUMGxY9B8gu3Xd/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNmfzKQrNnW98EsgaJY2rm1F4cy6SgUoUMGxY9B8gu3Xd", + "metadata_digest": "0668f78b9c869d66d8b884026f8b81f44d4ab0d6867ad3938512df7218f2b9a8", + "source_path": "contracts/bridge/EtherlinkRelayReceiver.sol", + "contract_name": "EtherlinkRelayReceiver", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNmfzKQrNnW98EsgaJY2rm1F4cy6SgUoUMGxY9B8gu3Xd/metadata.json b/verification-sources/chain138-metadata-archive/QmNmfzKQrNnW98EsgaJY2rm1F4cy6SgUoUMGxY9B8gu3Xd/metadata.json new file mode 100644 index 0000000..ad6d029 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNmfzKQrNnW98EsgaJY2rm1F4cy6SgUoUMGxY9B8gu3Xd/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RelayMintOrUnlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELAYER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"relayMintOrUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"When CCIP does not support Etherlink, custom relay monitors source and calls this contract. Idempotency via messageId; only RELAYER_ROLE can call.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"relayMintOrUnlock(bytes32,address,address,uint256)":{"params":{"amount":"Amount to transfer.","messageId":"Source chain message id (for idempotency).","recipient":"Recipient on Etherlink.","token":"Token address (address(0) for native)."}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"EtherlinkRelayReceiver","version":1},"userdoc":{"kind":"user","methods":{"relayMintOrUnlock(bytes32,address,address,uint256)":{"notice":"Mint or unlock tokens to recipient. Only relayer; idempotent per messageId."}},"notice":"Relay-compatible receiver on Etherlink (chain 42793). Accepts relayMintOrUnlock from off-chain relay.","version":1}},"settings":{"compilationTarget":{"contracts/bridge/EtherlinkRelayReceiver.sol":"EtherlinkRelayReceiver"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/EtherlinkRelayReceiver.sol":{"keccak256":"0x412150166dddf80947a4ef455a84042aa08f5701530687b24acf322cb5cc0d67","license":"MIT","urls":["bzz-raw://6b701237325d050435517604d289ce42db6b52cdd24e33b14387a7fc062deb8a","dweb:/ipfs/QmZE8FLRfK4Rr5zhjeF4K8s2FdfYPiASAzaT14d6p1EyPV"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNns5HXTmWqr6UpqFJi3iVaSHkeSFa8xY6Eipe6siUjvQ/archive-info.json b/verification-sources/chain138-metadata-archive/QmNns5HXTmWqr6UpqFJi3iVaSHkeSFa8xY6Eipe6siUjvQ/archive-info.json new file mode 100644 index 0000000..f78ab2e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNns5HXTmWqr6UpqFJi3iVaSHkeSFa8xY6Eipe6siUjvQ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNns5HXTmWqr6UpqFJi3iVaSHkeSFa8xY6Eipe6siUjvQ", + "metadata_digest": "06b71515c2d223d2b8d348bb32a6c6dc079b5456c9688367948dc2271e2aefc9", + "source_path": "contracts/reserve/MockPriceFeed.sol", + "contract_name": "MockPriceFeed", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNns5HXTmWqr6UpqFJi3iVaSHkeSFa8xY6Eipe6siUjvQ/metadata.json b/verification-sources/chain138-metadata-archive/QmNns5HXTmWqr6UpqFJi3iVaSHkeSFa8xY6Eipe6siUjvQ/metadata.json new file mode 100644 index 0000000..02a12ec --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNns5HXTmWqr6UpqFJi3iVaSHkeSFa8xY6Eipe6siUjvQ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"int256","name":"initialPrice","type":"int256"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int256","name":"newPrice","type":"int256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint80","name":"roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"answer","type":"uint256"}],"name":"updateAnswer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"newPrice","type":"int256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"newPrice","type":"int256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"updatePriceWithTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"Implements IAggregator interface for Chainlink compatibility","errors":{"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"kind":"dev","methods":{"decimals()":{"returns":{"_0":"decimals Number of decimals"}},"description()":{"returns":{"_0":"description Price feed description"}},"getRoundData(uint80)":{"params":{"roundId":"Round ID (ignored in mock)"},"returns":{"_0":"roundId Round ID","answer":"Latest price answer","answeredInRound":"Round ID","startedAt":"Start timestamp","updatedAt":"Latest timestamp"}},"latestAnswer()":{"returns":{"_0":"answer Latest price answer"}},"latestRoundData()":{"returns":{"answer":"Latest price answer","answeredInRound":"Round ID (mock: always 1)","roundId":"Round ID (mock: always 1)","startedAt":"Start timestamp (mock: same as latestTimestamp)","updatedAt":"Latest timestamp"}},"latestTimestamp()":{"returns":{"_0":"timestamp Latest price timestamp"}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"updateAnswer(uint256)":{"params":{"answer":"New answer value"}},"updatePrice(int256)":{"params":{"newPrice":"New price value"}},"updatePriceWithTimestamp(int256,uint256)":{"params":{"newPrice":"New price value","timestamp":"Custom timestamp"}},"version()":{"returns":{"_0":"version Version number"}}},"title":"MockPriceFeed","version":1},"userdoc":{"kind":"user","methods":{"decimals()":{"notice":"Get decimals"},"description()":{"notice":"Get description"},"getRoundData(uint80)":{"notice":"Get round data (mock: always returns latest)"},"latestAnswer()":{"notice":"Get latest answer"},"latestRoundData()":{"notice":"Get latest round data"},"latestTimestamp()":{"notice":"Get latest timestamp"},"updateAnswer(uint256)":{"notice":"Update answer (for testing)"},"updatePrice(int256)":{"notice":"Update price (owner only)"},"updatePriceWithTimestamp(int256,uint256)":{"notice":"Update price with custom timestamp"},"version()":{"notice":"Get version"}},"notice":"Mock price feed for testing and development","version":1}},"settings":{"compilationTarget":{"contracts/reserve/MockPriceFeed.sol":"MockPriceFeed"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/oracle/IAggregator.sol":{"keccak256":"0xcdbf107184805058e5725282eb6ade5778fe5ac5ac4cacc3d12438d2292e2951","license":"MIT","urls":["bzz-raw://552f85c4185c0c6273b28a9b5f5473154c0d490885e597dae305882d64377809","dweb:/ipfs/QmXMp3tKq42tUr1RoxhC81vfwQ7aYPFsGkpq5SHTpUmsnu"]},"contracts/reserve/MockPriceFeed.sol":{"keccak256":"0x23c3d5d75ef50362e79e03f4106d1944ce2ec96fa148b4e4d41dc6856aade26b","license":"MIT","urls":["bzz-raw://e1fed42a3b6313a2e1b6c78c36f329a94c5dec387bf795682e9d95affdf93e48","dweb:/ipfs/QmYriar26HHZZYEYtLPyCkGeyPLzdy6op2Toc7d1Dq2kNG"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNoqmRXDxW6BEd6Cf3QEssnZFviFdp8ebSyFSTvE66vB6/archive-info.json b/verification-sources/chain138-metadata-archive/QmNoqmRXDxW6BEd6Cf3QEssnZFviFdp8ebSyFSTvE66vB6/archive-info.json new file mode 100644 index 0000000..b3392b7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNoqmRXDxW6BEd6Cf3QEssnZFviFdp8ebSyFSTvE66vB6/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNoqmRXDxW6BEd6Cf3QEssnZFviFdp8ebSyFSTvE66vB6", + "metadata_digest": "06f72f2ae5e65ba3a45ec7da696a7d528aec81f1ac824ba0eea529459d12a135", + "source_path": "contracts/treasury/CcipBridgeAdapter138.sol", + "contract_name": "CcipBridgeAdapter138", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNoqmRXDxW6BEd6Cf3QEssnZFviFdp8ebSyFSTvE66vB6/metadata.json b/verification-sources/chain138-metadata-archive/QmNoqmRXDxW6BEd6Cf3QEssnZFviFdp8ebSyFSTvE66vB6/metadata.json new file mode 100644 index 0000000..77abdf0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNoqmRXDxW6BEd6Cf3QEssnZFviFdp8ebSyFSTvE66vB6/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_weth9","type":"address"},{"internalType":"address","name":"_bridgeWeth9","type":"address"},{"internalType":"address","name":"_receiverMainnet","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"DeadlineExpired","type":"error"},{"inputs":[],"name":"ExportsDisabled","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientOutput","type":"error"},{"inputs":[],"name":"OnlyExecutor","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ExportInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ExportsEnabledSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAINNET_SELECTOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeWeth9","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exportsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiverMainnet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"sendWeth9ToMainnet","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExportsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"}],"name":"setStrategyExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategyExecutor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth9","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Destination selector fixed to 5009297550715157269. Gate: exportsEnabled must be true. See docs/treasury/EXECUTOR_ALLOWLIST_MATRIX.md and EXPORT_STATE_MACHINE.md.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"sendWeth9ToMainnet(uint256,uint256,uint256)":{"params":{"amount":"Amount of WETH9 to send.","deadline":"Revert if block.timestamp > deadline.","minAmount":"Unused; reserved for future slippage/quote checks."}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"CcipBridgeAdapter138","version":1},"userdoc":{"kind":"user","methods":{"sendWeth9ToMainnet(uint256,uint256,uint256)":{"notice":"Send WETH9 to Ethereum Mainnet. Only callable by StrategyExecutor138."}},"notice":"Export-only module: only WETH9 to Ethereum Mainnet; only callable by StrategyExecutor138.","version":1}},"settings":{"compilationTarget":{"contracts/treasury/CcipBridgeAdapter138.sol":"CcipBridgeAdapter138"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/ccip/CCIPWETH9Bridge.sol":{"keccak256":"0x9b370018bc9f9184523c5e92a9e704f62df0dd4c240b0a8b59ac33585ef05651","license":"MIT","urls":["bzz-raw://26901f83517dd654b1127c7eac8abbeca0a25d47552b012e86525bcdc6f6cb8a","dweb:/ipfs/QmYvAmmQL8FoTKK6Kb2rzHoUEVfK6gD4GwMXCcwynYJk7d"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/treasury/CcipBridgeAdapter138.sol":{"keccak256":"0x700e89a5b96b8bbee91e964c23420bc4f6f09399a2db9f518cd64498f243e8bb","license":"MIT","urls":["bzz-raw://2fb4d4444f51a9f272aa6db80cbfba7a45cb4c75086b57730a2ad30fed0cc370","dweb:/ipfs/QmU4Pu5FT5JrKjSZLzkMvrndx39RJ4L6eRNjnLQWBrgAMG"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNphKHFAxZNobpZuPHd2ff6xQoRJaqnXpMBeMz5cSBHk9/archive-info.json b/verification-sources/chain138-metadata-archive/QmNphKHFAxZNobpZuPHd2ff6xQoRJaqnXpMBeMz5cSBHk9/archive-info.json new file mode 100644 index 0000000..6a00f18 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNphKHFAxZNobpZuPHd2ff6xQoRJaqnXpMBeMz5cSBHk9/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNphKHFAxZNobpZuPHd2ff6xQoRJaqnXpMBeMz5cSBHk9", + "metadata_digest": "072f35b41b356f8bf710f040095d460ce43240976bb2538aa85d4ee2a3951a86", + "source_path": "contracts/bridge/trustless/adapters/UniswapV3RouteExecutorAdapter.sol", + "contract_name": "UniswapV3RouteExecutorAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNphKHFAxZNobpZuPHd2ff6xQoRJaqnXpMBeMz5cSBHk9/metadata.json b/verification-sources/chain138-metadata-archive/QmNphKHFAxZNobpZuPHd2ff6xQoRJaqnXpMBeMz5cSBHk9/metadata.json new file mode 100644 index 0000000..8194bac --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNphKHFAxZNobpZuPHd2ff6xQoRJaqnXpMBeMz5cSBHk9/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"execute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"}],"name":"validate","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"pure","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/adapters/UniswapV3RouteExecutorAdapter.sol":"UniswapV3RouteExecutorAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/adapters/UniswapV3RouteExecutorAdapter.sol":{"keccak256":"0xcc12754a46d95c7d57912f9ec022da1e6c12f0b4dd0f4d696d8ba4902a089c36","license":"MIT","urls":["bzz-raw://e6b8babd5aebbb0a270534172a8a367992045afce389702a2f9ab2e228d729ea","dweb:/ipfs/QmWjyY4cHBZatKNDVqKfyrNLPfdGyRvQJGhF4PXS5vhbj4"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNqkXzpgDAPERsLCBV8GWg4AvRVLNBgnFDZtHwbTfGRJn/archive-info.json b/verification-sources/chain138-metadata-archive/QmNqkXzpgDAPERsLCBV8GWg4AvRVLNBgnFDZtHwbTfGRJn/archive-info.json new file mode 100644 index 0000000..11c3e9b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNqkXzpgDAPERsLCBV8GWg4AvRVLNBgnFDZtHwbTfGRJn/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNqkXzpgDAPERsLCBV8GWg4AvRVLNBgnFDZtHwbTfGRJn", + "metadata_digest": "07746e3ca833c07fa6adfbb9be09370a3195eac09b47da8a3a62e8ccf17893df", + "source_path": "contracts/bridge/TwoWayTokenBridgeL2.sol", + "contract_name": "TwoWayTokenBridgeL2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNqkXzpgDAPERsLCBV8GWg4AvRVLNBgnFDZtHwbTfGRJn/metadata.json b/verification-sources/chain138-metadata-archive/QmNqkXzpgDAPERsLCBV8GWg4AvRVLNBgnFDZtHwbTfGRJn/metadata.json new file mode 100644 index 0000000..aabf930 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNqkXzpgDAPERsLCBV8GWg4AvRVLNBgnFDZtHwbTfGRJn/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_feeToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"destChain","type":"uint64"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CcipSend","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"l1Bridge","type":"address"}],"name":"DestinationAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"DestinationRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"l1Bridge","type":"address"}],"name":"DestinationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"l1Bridge","type":"address"}],"name":"addDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destSelector","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnAndSend","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ccipRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"destinationChains","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destinations","outputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"l1Bridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDestinationChains","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mirroredToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"removeDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"l1Bridge","type":"address"}],"name":"updateDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFee","type":"address"}],"name":"updateFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"TwoWayTokenBridgeL2","version":1},"userdoc":{"kind":"user","methods":{},"notice":"L2/secondary chain side: mints mirrored tokens on inbound and burns on outbound","version":1}},"settings":{"compilationTarget":{"contracts/bridge/TwoWayTokenBridgeL2.sol":"TwoWayTokenBridgeL2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"contracts/bridge/TwoWayTokenBridgeL2.sol":{"keccak256":"0x56e39c374784a2f0d35f81bcdb7bb7ef5b80768b7040ec0bc3cb2dd8a7ca11b5","license":"MIT","urls":["bzz-raw://ac20517f2c00438d581b3c3dceed4649b8d712176a1ffefc47831db519334395","dweb:/ipfs/QmRr5Tm1B3Jfx17EkGnQ8aYJSCpiHpQY5mhdJW3hQDjtpg"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNrtk5s4aAdMwwhw2bE7EQPu2UMghJSJchQVmBa5Mzwrg/archive-info.json b/verification-sources/chain138-metadata-archive/QmNrtk5s4aAdMwwhw2bE7EQPu2UMghJSJchQVmBa5Mzwrg/archive-info.json new file mode 100644 index 0000000..592b330 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNrtk5s4aAdMwwhw2bE7EQPu2UMghJSJchQVmBa5Mzwrg/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNrtk5s4aAdMwwhw2bE7EQPu2UMghJSJchQVmBa5Mzwrg", + "metadata_digest": "07bf4aed57b7b58c7a7ee444f0d737fd24e63e09a2ff36ccf14f3f50303f06c1", + "source_path": "contracts/bridge/trustless/integration/IStablecoinPegManager.sol", + "contract_name": "IStablecoinPegManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNrtk5s4aAdMwwhw2bE7EQPu2UMghJSJchQVmBa5Mzwrg/metadata.json b/verification-sources/chain138-metadata-archive/QmNrtk5s4aAdMwwhw2bE7EQPu2UMghJSJchQVmBa5Mzwrg/metadata.json new file mode 100644 index 0000000..9d31c18 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNrtk5s4aAdMwwhw2bE7EQPu2UMghJSJchQVmBa5Mzwrg/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"currentPrice","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"}],"name":"calculateDeviation","outputs":[{"internalType":"int256","name":"deviationBps","type":"int256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"weth","type":"address"}],"name":"checkETHpeg","outputs":[{"internalType":"bool","name":"isMaintained","type":"bool"},{"internalType":"int256","name":"deviationBps","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stablecoin","type":"address"}],"name":"checkUSDpeg","outputs":[{"internalType":"bool","name":"isMaintained","type":"bool"},{"internalType":"int256","name":"deviationBps","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getPegStatus","outputs":[{"internalType":"uint256","name":"currentPrice","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"},{"internalType":"int256","name":"deviationBps","type":"int256"},{"internalType":"bool","name":"isMaintained","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportedAssets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"IStablecoinPegManager","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Interface for Stablecoin Peg Manager","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/integration/IStablecoinPegManager.sol":"IStablecoinPegManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/integration/IStablecoinPegManager.sol":{"keccak256":"0x781bb48403013454143b4b539427949ded1f2627475a4d9fef6d95e070f31017","license":"MIT","urls":["bzz-raw://df35bbad3d7a6fcabfc9d543b750e8c2f6736c2fc69bcd3b7f8f22f98e5d395c","dweb:/ipfs/QmQjnE74iygDFtQmXKNuHmjdf1LKekiWcrW1UxW4r1oXrG"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNzKm2c2quB5CuEMtAUDi9wixa2o3Jy1YsUv2wpm5Hv53/archive-info.json b/verification-sources/chain138-metadata-archive/QmNzKm2c2quB5CuEMtAUDi9wixa2o3Jy1YsUv2wpm5Hv53/archive-info.json new file mode 100644 index 0000000..d36ef41 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNzKm2c2quB5CuEMtAUDi9wixa2o3Jy1YsUv2wpm5Hv53/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNzKm2c2quB5CuEMtAUDi9wixa2o3Jy1YsUv2wpm5Hv53", + "metadata_digest": "09a6a4f34759db930740bf15d537be896c15e54659a2c2f9cc0abf3239c8b35e", + "source_path": "contracts/bridge/atomic/AtomicTypes.sol", + "contract_name": "AtomicTypes", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNzKm2c2quB5CuEMtAUDi9wixa2o3Jy1YsUv2wpm5Hv53/metadata.json b/verification-sources/chain138-metadata-archive/QmNzKm2c2quB5CuEMtAUDi9wixa2o3Jy1YsUv2wpm5Hv53/metadata.json new file mode 100644 index 0000000..68544d0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNzKm2c2quB5CuEMtAUDi9wixa2o3Jy1YsUv2wpm5Hv53/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/AtomicTypes.sol":"AtomicTypes"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/atomic/AtomicTypes.sol":{"keccak256":"0x85a1bdb93368582a1dea40790269ee2eda65047cd8812b88efdee02eebd343c1","license":"MIT","urls":["bzz-raw://ace009c17e8b2d13ef3be8d1116d772fd5e2c4cc3483e17c63915e8d9fa00fba","dweb:/ipfs/Qmayj5VSpYsqftkgYnmTQahKXaBK9tiAivjjMHvyYwZoRM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmNzqaeKTMNoTM5YcjCn1T2BPsQz8W3jBFotZKGQBr3Sqz/archive-info.json b/verification-sources/chain138-metadata-archive/QmNzqaeKTMNoTM5YcjCn1T2BPsQz8W3jBFotZKGQBr3Sqz/archive-info.json new file mode 100644 index 0000000..0714ea9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNzqaeKTMNoTM5YcjCn1T2BPsQz8W3jBFotZKGQBr3Sqz/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmNzqaeKTMNoTM5YcjCn1T2BPsQz8W3jBFotZKGQBr3Sqz", + "metadata_digest": "09c85cedf10f7eb4a990cbee7a0ee4bd34b19f8ead90d5bd5863a0f2eac2fb7d", + "source_path": "@openzeppelin/contracts/token/ERC20/ERC20.sol", + "contract_name": "ERC20", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmNzqaeKTMNoTM5YcjCn1T2BPsQz8W3jBFotZKGQBr3Sqz/metadata.json b/verification-sources/chain138-metadata-archive/QmNzqaeKTMNoTM5YcjCn1T2BPsQz8W3jBFotZKGQBr3Sqz/metadata.json new file mode 100644 index 0000000..d908d5e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmNzqaeKTMNoTM5YcjCn1T2BPsQz8W3jBFotZKGQBr3Sqz/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Implementation of the {IERC20} interface. This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. TIP: For a detailed writeup see our guide https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. The default value of {decimals} is 18. To change this, you should override this function so it returns a different value. We have followed general OpenZeppelin Contracts guidelines: functions revert instead returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification.","errors":{"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"constructor":{"details":"Sets the values for {name} and {symbol}. All two of these values are immutable: they can only be set once during construction."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/token/ERC20/ERC20.sol":"ERC20"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmP18vpVfCC5bzJnbYP2Ba8irvH618sQGoTMmnErdGCbuK/archive-info.json b/verification-sources/chain138-metadata-archive/QmP18vpVfCC5bzJnbYP2Ba8irvH618sQGoTMmnErdGCbuK/archive-info.json new file mode 100644 index 0000000..c203e9e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmP18vpVfCC5bzJnbYP2Ba8irvH618sQGoTMmnErdGCbuK/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmP18vpVfCC5bzJnbYP2Ba8irvH618sQGoTMmnErdGCbuK", + "metadata_digest": "09dbfa70e46b80e1842718fac0345f76b261bb6ab53027a1b02af39d6209588a", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IERC20.sol", + "contract_name": "IERC20Uniswap", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmP18vpVfCC5bzJnbYP2Ba8irvH618sQGoTMmnErdGCbuK/metadata.json b/verification-sources/chain138-metadata-archive/QmP18vpVfCC5bzJnbYP2Ba8irvH618sQGoTMmnErdGCbuK/metadata.json new file mode 100644 index 0000000..ae83fb1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmP18vpVfCC5bzJnbYP2Ba8irvH618sQGoTMmnErdGCbuK/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IERC20.sol":"IERC20Uniswap"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IERC20.sol":{"keccak256":"0x76866491759a6f069ddc030d52df08d4105a8bcef0e3330dee261cf7ee049b1a","license":"GPL-3.0","urls":["bzz-raw://0b3b2a687415260c33e491cc2d03577729802b5ff8227cc9fd7b45b28cbd24e4","dweb:/ipfs/QmNtBCKh68KLnNj8M2rQDPnbBfKhntzaZ1JReQx4Axtx5w"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmP4CT1sDRjF1B8VX6TXZzgpQ8XER74L4eD9M1K6zBeCaW/archive-info.json b/verification-sources/chain138-metadata-archive/QmP4CT1sDRjF1B8VX6TXZzgpQ8XER74L4eD9M1K6zBeCaW/archive-info.json new file mode 100644 index 0000000..338a811 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmP4CT1sDRjF1B8VX6TXZzgpQ8XER74L4eD9M1K6zBeCaW/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmP4CT1sDRjF1B8VX6TXZzgpQ8XER74L4eD9M1K6zBeCaW", + "metadata_digest": "0aa4b394fbbfe1d7f63138aba5b14260162b4a93fc5f17ef76743d61b9f6276b", + "source_path": "contracts/flash/AaveQuotePushFlashReceiver.sol", + "contract_name": "IAaveDODOQuotePushSwapExactIn", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmP4CT1sDRjF1B8VX6TXZzgpQ8XER74L4eD9M1K6zBeCaW/metadata.json b/verification-sources/chain138-metadata-archive/QmP4CT1sDRjF1B8VX6TXZzgpQ8XER74L4eD9M1K6zBeCaW/metadata.json new file mode 100644 index 0000000..49c8dec --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmP4CT1sDRjF1B8VX6TXZzgpQ8XER74L4eD9M1K6zBeCaW/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapExactIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/AaveQuotePushFlashReceiver.sol":"IAaveDODOQuotePushSwapExactIn"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/flash/AaveQuotePushFlashReceiver.sol":{"keccak256":"0x9648a35f371bb79c4782933d66237ee759ab4d546950bf79489c87091ff5d7e5","license":"MIT","urls":["bzz-raw://e4360e49daf3f2ac0a7f0299d0083479909f5ae30de80ad647b37421f4d871c8","dweb:/ipfs/QmVAkMWwMEJwFQ5ELSLJhhoxM6oSPUpkrjTzEZkMH5cdh7"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmP944ELH1kQ394cZk4kPP7j8z9nefdpg9rqsrJxaYJPea/archive-info.json b/verification-sources/chain138-metadata-archive/QmP944ELH1kQ394cZk4kPP7j8z9nefdpg9rqsrJxaYJPea/archive-info.json new file mode 100644 index 0000000..3333dbf --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmP944ELH1kQ394cZk4kPP7j8z9nefdpg9rqsrJxaYJPea/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmP944ELH1kQ394cZk4kPP7j8z9nefdpg9rqsrJxaYJPea", + "metadata_digest": "0be31d9f96be3d2b4939556a8d306ac73307f6c6c20a5a53b386b6fefe91dc13", + "source_path": "contracts/flash/DODOIntegrationExternalUnwinder.sol", + "contract_name": "IDODOIntegrationSwapExactIn", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmP944ELH1kQ394cZk4kPP7j8z9nefdpg9rqsrJxaYJPea/metadata.json b/verification-sources/chain138-metadata-archive/QmP944ELH1kQ394cZk4kPP7j8z9nefdpg9rqsrJxaYJPea/metadata.json new file mode 100644 index 0000000..bf27a20 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmP944ELH1kQ394cZk4kPP7j8z9nefdpg9rqsrJxaYJPea/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapExactIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/DODOIntegrationExternalUnwinder.sol":"IDODOIntegrationSwapExactIn"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/flash/DODOIntegrationExternalUnwinder.sol":{"keccak256":"0xd4ee730fafea99efa29420827321aea736a4ae8079786addc533dd43f6266ecb","license":"MIT","urls":["bzz-raw://1be16bf01fa8e3af5a396aa71d560727a904f910b1c94f7e57ef702f3d452e9c","dweb:/ipfs/QmZDuSEyY8LoyB4EV5orLfY9Dhy5kAWCMr9w2bUYNXFZ1Y"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPDM1ehCbB3etnqBvD4aoh9NWBgvjD8V8N9PmGxDKVh2t/archive-info.json b/verification-sources/chain138-metadata-archive/QmPDM1ehCbB3etnqBvD4aoh9NWBgvjD8V8N9PmGxDKVh2t/archive-info.json new file mode 100644 index 0000000..446a125 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPDM1ehCbB3etnqBvD4aoh9NWBgvjD8V8N9PmGxDKVh2t/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmPDM1ehCbB3etnqBvD4aoh9NWBgvjD8V8N9PmGxDKVh2t", + "metadata_digest": "0cfc9c516c0834d2257f85ce315e3005617258430334f698c88bd8cb55aa8e4d", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router01.sol", + "contract_name": "IUniswapV2Router01", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPDM1ehCbB3etnqBvD4aoh9NWBgvjD8V8N9PmGxDKVh2t/metadata.json b/verification-sources/chain138-metadata-archive/QmPDM1ehCbB3etnqBvD4aoh9NWBgvjD8V8N9PmGxDKVh2t/metadata.json new file mode 100644 index 0000000..2a5f6ab --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPDM1ehCbB3etnqBvD4aoh9NWBgvjD8V8N9PmGxDKVh2t/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router01.sol":"IUniswapV2Router01"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router01.sol":{"keccak256":"0x12091adc186fe351c639dc62aa0b691f78c7bea054c27bbb4b58acd02e1b2ce7","license":"GPL-3.0","urls":["bzz-raw://e7a3f1b86be061741f5483f0f153389aa9e89a24a1556c8784df44ce288b5183","dweb:/ipfs/QmejsqRXse45aoyDjccfKEnZ1uZzdqUtjsYbAS3ThAMesu"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPEHFZ1DzGW1cwAniSCipt8waKLYckL5R2L1CekX8znNZ/archive-info.json b/verification-sources/chain138-metadata-archive/QmPEHFZ1DzGW1cwAniSCipt8waKLYckL5R2L1CekX8znNZ/archive-info.json new file mode 100644 index 0000000..14200e8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPEHFZ1DzGW1cwAniSCipt8waKLYckL5R2L1CekX8znNZ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPEHFZ1DzGW1cwAniSCipt8waKLYckL5R2L1CekX8znNZ", + "metadata_digest": "0d39f08b7a29f213f307387c14e193ac85e75534fb06bcb57eebb9ffa2c69b8e", + "source_path": "contracts/bridge/interop/BridgeEscrowVault.sol", + "contract_name": "BridgeEscrowVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPEHFZ1DzGW1cwAniSCipt8waKLYckL5R2L1CekX8znNZ/metadata.json b/verification-sources/chain138-metadata-archive/QmPEHFZ1DzGW1cwAniSCipt8waKLYckL5R2L1CekX8znNZ/metadata.json new file mode 100644 index 0000000..73d797e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPEHFZ1DzGW1cwAniSCipt8waKLYckL5R2L1CekX8znNZ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"InvalidStatus","type":"error"},{"inputs":[],"name":"InvalidTimeout","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"inputs":[],"name":"TransferAlreadyProcessed","type":"error"},{"inputs":[],"name":"TransferNotFound","type":"error"},{"inputs":[],"name":"TransferNotRefundable","type":"error"},{"inputs":[],"name":"TransferNotTimedOut","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"inputs":[],"name":"ZeroAsset","type":"error"},{"inputs":[],"name":"ZeroRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"enum BridgeEscrowVault.DestinationType","name":"destinationType","type":"uint8"},{"indexed":false,"internalType":"bytes","name":"destinationData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RefundExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RefundInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":false,"internalType":"enum BridgeEscrowVault.TransferStatus","name":"oldStatus","type":"uint8"},{"indexed":false,"internalType":"enum BridgeEscrowVault.TransferStatus","name":"newStatus","type":"uint8"}],"name":"TransferStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFUND_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum BridgeEscrowVault.DestinationType","name":"destinationType","type":"uint8"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"depositERC20","outputs":[{"internalType":"bytes32","name":"transferId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum BridgeEscrowVault.DestinationType","name":"destinationType","type":"uint8"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"depositNative","outputs":[{"internalType":"bytes32","name":"transferId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"transferId","type":"bytes32"}],"name":"executeRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"transferId","type":"bytes32"}],"name":"getTransfer","outputs":[{"components":[{"internalType":"bytes32","name":"transferId","type":"bytes32"},{"internalType":"address","name":"depositor","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum BridgeEscrowVault.DestinationType","name":"destinationType","type":"uint8"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"enum BridgeEscrowVault.TransferStatus","name":"status","type":"uint8"},{"internalType":"bool","name":"refunded","type":"bool"}],"internalType":"struct BridgeEscrowVault.Transfer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"transferId","type":"bytes32"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"hsmSignature","type":"bytes"}],"internalType":"struct BridgeEscrowVault.RefundRequest","name":"request","type":"tuple"},{"internalType":"address","name":"hsmSigner","type":"address"}],"name":"initiateRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"transferId","type":"bytes32"}],"name":"isRefundable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedTransferIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"transfers","outputs":[{"internalType":"bytes32","name":"transferId","type":"bytes32"},{"internalType":"address","name":"depositor","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum BridgeEscrowVault.DestinationType","name":"destinationType","type":"uint8"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"enum BridgeEscrowVault.TransferStatus","name":"status","type":"uint8"},{"internalType":"bool","name":"refunded","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"transferId","type":"bytes32"},{"internalType":"enum BridgeEscrowVault.TransferStatus","name":"newStatus","type":"uint8"}],"name":"updateTransferStatus","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Supports HSM-backed admin functions via EIP-712 signatures","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"EIP712DomainChanged()":{"details":"MAY be emitted to signal that the domain could have changed."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"depositERC20(address,uint256,uint8,bytes,uint256,bytes32)":{"params":{"amount":"Amount to deposit","destinationData":"Encoded destination address/identifier","destinationType":"Type of destination (EVM, XRPL, Fabric)","nonce":"User-provided nonce for replay protection","timeout":"Timeout in seconds for refund eligibility","token":"ERC-20 token address"},"returns":{"transferId":"Unique transfer identifier"}},"depositNative(uint8,bytes,uint256,bytes32)":{"params":{"destinationData":"Encoded destination address/identifier","destinationType":"Type of destination (EVM, XRPL, Fabric)","nonce":"User-provided nonce for replay protection","timeout":"Timeout in seconds for refund eligibility"},"returns":{"transferId":"Unique transfer identifier"}},"eip712Domain()":{"details":"See {IERC-5267}."},"executeRefund(bytes32)":{"params":{"transferId":"Transfer identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getTransfer(bytes32)":{"params":{"transferId":"Transfer identifier"},"returns":{"_0":"Transfer struct"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"initiateRefund((bytes32,uint256,bytes),address)":{"params":{"hsmSigner":"HSM signer address","request":"Refund request with HSM signature"}},"isRefundable(bytes32)":{"params":{"transferId":"Transfer identifier"},"returns":{"_0":"True if refundable"}},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"updateTransferStatus(bytes32,uint8)":{"params":{"newStatus":"New status","transferId":"Transfer identifier"}}},"title":"BridgeEscrowVault","version":1},"userdoc":{"kind":"user","methods":{"depositERC20(address,uint256,uint8,bytes,uint256,bytes32)":{"notice":"Deposit ERC-20 tokens for cross-chain transfer"},"depositNative(uint8,bytes,uint256,bytes32)":{"notice":"Deposit native ETH for cross-chain transfer"},"executeRefund(bytes32)":{"notice":"Execute refund after initiation"},"getTransfer(bytes32)":{"notice":"Get transfer details"},"initiateRefund((bytes32,uint256,bytes),address)":{"notice":"Initiate refund (requires HSM signature)"},"isRefundable(bytes32)":{"notice":"Check if transfer is refundable"},"pause()":{"notice":"Pause contract"},"unpause()":{"notice":"Unpause contract"},"updateTransferStatus(bytes32,uint8)":{"notice":"Update transfer status (operator only)"}},"notice":"Enhanced escrow vault for multi-rail bridging (EVM, XRPL, Fabric)","version":1}},"settings":{"compilationTarget":{"contracts/bridge/interop/BridgeEscrowVault.sol":"BridgeEscrowVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/bridge/interop/BridgeEscrowVault.sol":{"keccak256":"0x4411967c78a32fc800fd88c7875c4552e247579659899621e6b0dbe7d1cffd98","license":"MIT","urls":["bzz-raw://e1ccca6d988e95a0255160c5908691a99744f7f988653765d42e9d1b7019e357","dweb:/ipfs/QmUy33pNSkMciFLkoQpbP7kBSDcwLHiNS48xzeEvdktRmF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPFtaefQKuviN5hRHQdmZpMoKFooz89xaEteh9LKvqjBZ/archive-info.json b/verification-sources/chain138-metadata-archive/QmPFtaefQKuviN5hRHQdmZpMoKFooz89xaEteh9LKvqjBZ/archive-info.json new file mode 100644 index 0000000..f17956a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPFtaefQKuviN5hRHQdmZpMoKFooz89xaEteh9LKvqjBZ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPFtaefQKuviN5hRHQdmZpMoKFooz89xaEteh9LKvqjBZ", + "metadata_digest": "0da377a571f24de27bd1348e8db7edd974dc5140bbad06306c9cdabac209441c", + "source_path": "contracts/iso4217w/ISO4217WToken.sol", + "contract_name": "ISO4217WToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPFtaefQKuviN5hRHQdmZpMoKFooz89xaEteh9LKvqjBZ/metadata.json b/verification-sources/chain138-metadata-archive/QmPFtaefQKuviN5hRHQdmZpMoKFooz89xaEteh9LKvqjBZ/metadata.json new file mode 100644 index 0000000..48b1fd4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPFtaefQKuviN5hRHQdmZpMoKFooz89xaEteh9LKvqjBZ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"ReserveInsufficient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newReserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ReserveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_UPDATE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"complianceGuard","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currencyCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"custodian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"currencyCode_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address","name":"custodian_","type":"address"},{"internalType":"address","name":"mintController_","type":"address"},{"internalType":"address","name":"burnController_","type":"address"},{"internalType":"address","name":"complianceGuard_","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isReserveSufficient","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReserve","type":"uint256"}],"name":"updateVerifiedReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"verifiedReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Represents 1:1 redeemable digital claim on fiat currency COMPLIANCE: - Classification: M1 eMoney - Legal Tender: NO - Synthetic / Reserve Unit: NO - Commodity-Backed: NO - Money Multiplier: m = 1.0 (hard-fixed, no fractional reserve) - Backing: 1:1 with fiat currency in segregated custodial accounts - GRU Isolation: Direct/indirect GRU conversion prohibited","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"burn(address,uint256)":{"params":{"amount":"Amount to burn","from":"Source address"}},"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"currencyCode()":{"returns":{"_0":"currencyCode 3-letter ISO-4217 code"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"initialize(string,string,string,uint8,address,address,address,address,address)":{"params":{"admin":"Admin address","burnController_":"Burn controller address","complianceGuard_":"Compliance guard address","currencyCode_":"ISO-4217 currency code (e.g., \"USD\")","custodian_":"Custodian address","decimals_":"Token decimals (typically 2 for fiat)","mintController_":"Mint controller address","name":"Token name (e.g., \"USDW Token\")","symbol":"Token symbol (e.g., \"USDW\")"}},"isReserveSufficient()":{"details":"Reserve MUST be >= supply (enforcing 1:1 backing)","returns":{"_0":"isSufficient True if verifiedReserve >= totalSupply"}},"mint(address,uint256)":{"params":{"amount":"Amount to mint","to":"Recipient address"}},"name()":{"details":"Returns the name of the token."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"returns":{"_0":"Total supply of tokens"}},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Skips emitting an {Approval} event indicating an allowance update. This is not required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"updateVerifiedReserve(uint256)":{"details":"Can only be called by authorized reserve update role","params":{"newReserve":"New reserve balance"}},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"verifiedReserve()":{"returns":{"_0":"reserveBalance Reserve balance in base currency units"}}},"title":"ISO4217WToken","version":1},"userdoc":{"kind":"user","methods":{"burn(address,uint256)":{"notice":"Burn tokens (only by burn controller)"},"burnController()":{"notice":"Get burn controller address"},"complianceGuard()":{"notice":"Get compliance guard address"},"currencyCode()":{"notice":"Get the ISO-4217 currency code this token represents"},"custodian()":{"notice":"Get custodian address"},"decimals()":{"notice":"Override decimals (typically 2 for fiat currencies)"},"initialize(string,string,string,uint8,address,address,address,address,address)":{"notice":"Initialize the ISO-4217 W token"},"isReserveSufficient()":{"notice":"Check if reserves are sufficient"},"mint(address,uint256)":{"notice":"Mint tokens (only by mint controller)"},"mintController()":{"notice":"Get mint controller address"},"totalSupply()":{"notice":"Override totalSupply to resolve multiple inheritance conflict"},"updateVerifiedReserve(uint256)":{"notice":"Update verified reserve (oracle/attestation)"},"verifiedReserve()":{"notice":"Get verified reserve balance"}},"notice":"ISO-4217 W token (e.g., USDW, EURW, GBPW) - M1 eMoney token","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/ISO4217WToken.sol":"ISO4217WToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol":{"keccak256":"0xd518def45c722a6e803e1e26e625db25e01497f672ca566cca585d234ec903b0","license":"MIT","urls":["bzz-raw://6e7de3fccd96783244790cde282435ce0fd3a44ab4ccb10f17005c743202882f","dweb:/ipfs/QmYSepstTqs5UPJvjeJXkWU5R659yReqrSgSGGh65hkbdK"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/iso4217w/ISO4217WToken.sol":{"keccak256":"0x8cbf914cdd061fe24d3d1d7225c658a46a2457c432b0a31f2dce51ccadf0ea4e","license":"MIT","urls":["bzz-raw://149d904a440d679b115eb457dc296373e608091b90d39f9c6d790a18042c9cae","dweb:/ipfs/QmbAEiBVExtF5J1onA65om6pLgfBfDPrgsv5euLjkNyQh2"]},"contracts/iso4217w/interfaces/IISO4217WToken.sol":{"keccak256":"0xd583b83e8598f54e2f3cc5e8bf954441fa73e959a0b816522eb66528b248d412","license":"MIT","urls":["bzz-raw://103a3010d1805dc5e1bbda03ce9338e03aa0ca36a914677cd45ece3ec8868ae3","dweb:/ipfs/QmQDnC1kxKbtedmyjMN4W8oonbGQ4y6LARWWqn7jK4V8W9"]},"contracts/iso4217w/libraries/ISO4217WCompliance.sol":{"keccak256":"0xdfef8ded2a1d1fd8303a05b6846270a0bb882386c2da513260cc19a20c7a8b68","license":"MIT","urls":["bzz-raw://e1107bd7d443a2ef6995fbaceab0e4d06b6c36e72cf5f1b08e9fc64f8a4dc256","dweb:/ipfs/QmNter36BUWZnPHsLZWbQTeDdMiVKQNxWoBHLDoQ74B8JA"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPPcCeLe3gFjiq31oR5T1JouPtQYHYNQsZ4NTTzS28aDe/archive-info.json b/verification-sources/chain138-metadata-archive/QmPPcCeLe3gFjiq31oR5T1JouPtQYHYNQsZ4NTTzS28aDe/archive-info.json new file mode 100644 index 0000000..b4918ff --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPPcCeLe3gFjiq31oR5T1JouPtQYHYNQsZ4NTTzS28aDe/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPPcCeLe3gFjiq31oR5T1JouPtQYHYNQsZ4NTTzS28aDe", + "metadata_digest": "0f9d97f54ee23ea12c6018c7d7b58f61d93126f5c706555e6ab9d1e81b8ad289", + "source_path": "contracts/bridge/trustless/interfaces/IEnhancedSwapRouterV2.sol", + "contract_name": "IEnhancedSwapRouterV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPPcCeLe3gFjiq31oR5T1JouPtQYHYNQsZ4NTTzS28aDe/metadata.json b/verification-sources/chain138-metadata-archive/QmPPcCeLe3gFjiq31oR5T1JouPtQYHYNQsZ4NTTzS28aDe/metadata.json new file mode 100644 index 0000000..2235a1d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPPcCeLe3gFjiq31oR5T1JouPtQYHYNQsZ4NTTzS28aDe/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"address","name":"outputToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg[]","name":"legs","type":"tuple[]"}],"internalType":"struct RouteTypesV2.RoutePlan","name":"plan","type":"tuple"}],"name":"executeRoute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quoteConfiguredProviders","outputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"estimatedGas","type":"uint256"},{"internalType":"bool","name":"executable","type":"bool"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.ProviderQuote[]","name":"quotes","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum LiquidityPoolETH.AssetType","name":"inputAsset","type":"uint8"},{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"swapToStablecoin","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"swapTokenToToken","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/interfaces/IEnhancedSwapRouterV2.sol":"IEnhancedSwapRouterV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/interfaces/IEnhancedSwapRouterV2.sol":{"keccak256":"0x43001bdc9f187d3316ee67f037838c374aafb36a9a1d4af00f2a6b0e4194db72","license":"MIT","urls":["bzz-raw://2756b5a70903d1849a3e457a4c066ff5a169f61a63df6b37e5b6e1f4d009f562","dweb:/ipfs/QmXJWG3ksg9CmChnL5RhnanrubUVFAPiTyugn1hk8qhfrD"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPXbwV5BmFx1WEWKEw6H8SSXe3uU1LLouEP4D5HiF19jz/archive-info.json b/verification-sources/chain138-metadata-archive/QmPXbwV5BmFx1WEWKEw6H8SSXe3uU1LLouEP4D5HiF19jz/archive-info.json new file mode 100644 index 0000000..f2992ed --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPXbwV5BmFx1WEWKEw6H8SSXe3uU1LLouEP4D5HiF19jz/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPXbwV5BmFx1WEWKEw6H8SSXe3uU1LLouEP4D5HiF19jz", + "metadata_digest": "11a9f1cc2900d355567d527955158fbe61118a4dfb049a8c6277f2115fcee85d", + "source_path": "contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router01.sol", + "contract_name": "IUniswapV2Router01", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPXbwV5BmFx1WEWKEw6H8SSXe3uU1LLouEP4D5HiF19jz/metadata.json b/verification-sources/chain138-metadata-archive/QmPXbwV5BmFx1WEWKEw6H8SSXe3uU1LLouEP4D5HiF19jz/metadata.json new file mode 100644 index 0000000..d285eb3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPXbwV5BmFx1WEWKEw6H8SSXe3uU1LLouEP4D5HiF19jz/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router01.sol":"IUniswapV2Router01"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router01.sol":{"keccak256":"0x8a3c5c449d4b7cd76513ed6995f4b86e4a86f222c770f8442f5fc128ce29b4d2","urls":["bzz-raw://1df63ca373dafae3bd0ee7fe70f890a1dc7c45ed869c01de68413e0e97ff9deb","dweb:/ipfs/QmefJgEYGUL8KX7kQKYTrDweF8GB7yjy3nw5Bmqzryg7PG"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPaEQfPifwS9t3UmTrFSQNpQ4HCkuibqoiXjVNfYG5jS4/archive-info.json b/verification-sources/chain138-metadata-archive/QmPaEQfPifwS9t3UmTrFSQNpQ4HCkuibqoiXjVNfYG5jS4/archive-info.json new file mode 100644 index 0000000..52f15bd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPaEQfPifwS9t3UmTrFSQNpQ4HCkuibqoiXjVNfYG5jS4/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPaEQfPifwS9t3UmTrFSQNpQ4HCkuibqoiXjVNfYG5jS4", + "metadata_digest": "1256575f7025e4bb9cff4334273067c9121b1def2d3eb156ef4cf749300f8285", + "source_path": "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol", + "contract_name": "MessageHashUtils", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPaEQfPifwS9t3UmTrFSQNpQ4HCkuibqoiXjVNfYG5jS4/metadata.json b/verification-sources/chain138-metadata-archive/QmPaEQfPifwS9t3UmTrFSQNpQ4HCkuibqoiXjVNfYG5jS4/metadata.json new file mode 100644 index 0000000..d2696d9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPaEQfPifwS9t3UmTrFSQNpQ4HCkuibqoiXjVNfYG5jS4/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"details":"Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing. The library provides methods for generating a hash of a message that conforms to the https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712] specifications.","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":"MessageHashUtils"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPbPMTRrPU2dFH52s49A45NfUVHidjJPZ5SuUiqBHoPqk/archive-info.json b/verification-sources/chain138-metadata-archive/QmPbPMTRrPU2dFH52s49A45NfUVHidjJPZ5SuUiqBHoPqk/archive-info.json new file mode 100644 index 0000000..96e7835 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPbPMTRrPU2dFH52s49A45NfUVHidjJPZ5SuUiqBHoPqk/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPbPMTRrPU2dFH52s49A45NfUVHidjJPZ5SuUiqBHoPqk", + "metadata_digest": "12a2093316be1b7e5ec620ff152519551df441e06f8583c1e94de8080cfdea13", + "source_path": "contracts/bridge/atomic/interfaces/IAtomicSettlementAdapter.sol", + "contract_name": "IAtomicSettlementAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPbPMTRrPU2dFH52s49A45NfUVHidjJPZ5SuUiqBHoPqk/metadata.json b/verification-sources/chain138-metadata-archive/QmPbPMTRrPU2dFH52s49A45NfUVHidjJPZ5SuUiqBHoPqk/metadata.json new file mode 100644 index 0000000..f15ef12 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPbPMTRrPU2dFH52s49A45NfUVHidjJPZ5SuUiqBHoPqk/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeSettlement","outputs":[{"internalType":"bytes32","name":"settlementId","type":"bytes32"}],"stateMutability":"payable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/interfaces/IAtomicSettlementAdapter.sol":"IAtomicSettlementAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/atomic/interfaces/IAtomicSettlementAdapter.sol":{"keccak256":"0x4277422986484c9f70c1748efbc4b211a7ff9c8d2327de8b3b9c923fad1abf8a","license":"MIT","urls":["bzz-raw://b61515a52067561730e08bc58aaf52d99a226c004d19dd4e7756142195e578ec","dweb:/ipfs/QmdBieKpqd7QdEPaPqXJDjH9m7o9LvMLVtLhGcpNBx8B15"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPcbEUUFYkCiUVRpqXEWBVccguTdmZQvwuuyB5dxFpXqG/archive-info.json b/verification-sources/chain138-metadata-archive/QmPcbEUUFYkCiUVRpqXEWBVccguTdmZQvwuuyB5dxFpXqG/archive-info.json new file mode 100644 index 0000000..6063221 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPcbEUUFYkCiUVRpqXEWBVccguTdmZQvwuuyB5dxFpXqG/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmPcbEUUFYkCiUVRpqXEWBVccguTdmZQvwuuyB5dxFpXqG", + "metadata_digest": "12f10c901befa6684472d8f4c8229d8bd3fea2c00fdcd436443d9704e01133bf", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router02.sol", + "contract_name": "IUniswapV2Router02", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPcbEUUFYkCiUVRpqXEWBVccguTdmZQvwuuyB5dxFpXqG/metadata.json b/verification-sources/chain138-metadata-archive/QmPcbEUUFYkCiUVRpqXEWBVccguTdmZQvwuuyB5dxFpXqG/metadata.json new file mode 100644 index 0000000..323221d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPcbEUUFYkCiUVRpqXEWBVccguTdmZQvwuuyB5dxFpXqG/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router02.sol":"IUniswapV2Router02"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router01.sol":{"keccak256":"0x12091adc186fe351c639dc62aa0b691f78c7bea054c27bbb4b58acd02e1b2ce7","license":"GPL-3.0","urls":["bzz-raw://e7a3f1b86be061741f5483f0f153389aa9e89a24a1556c8784df44ce288b5183","dweb:/ipfs/QmejsqRXse45aoyDjccfKEnZ1uZzdqUtjsYbAS3ThAMesu"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router02.sol":{"keccak256":"0x7e588378c1076243506b8164132e0dcccd468f31edb933a88ddb8d6c4063ab30","license":"GPL-3.0","urls":["bzz-raw://da8233b51c721065562eca1bf774963b4d881f8df26de34c9e608233cd5fd557","dweb:/ipfs/QmRVgpFroy1ofrMdsXU3eiyhmsot3haCLtevUsRt3uPCpu"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPcjSLZHASruTkaqaNmVeHqYBPWKc3dctrJtiqcV8FZcY/archive-info.json b/verification-sources/chain138-metadata-archive/QmPcjSLZHASruTkaqaNmVeHqYBPWKc3dctrJtiqcV8FZcY/archive-info.json new file mode 100644 index 0000000..4c77228 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPcjSLZHASruTkaqaNmVeHqYBPWKc3dctrJtiqcV8FZcY/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPcjSLZHASruTkaqaNmVeHqYBPWKc3dctrJtiqcV8FZcY", + "metadata_digest": "12fa537388423c6da58baaee33d3d6077f926929d2844fab9cffde0552f3d96d", + "source_path": "contracts/dex/MockDVMFactory.sol", + "contract_name": "MockDVMFactory", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPcjSLZHASruTkaqaNmVeHqYBPWKc3dctrJtiqcV8FZcY/metadata.json b/verification-sources/chain138-metadata-archive/QmPcjSLZHASruTkaqaNmVeHqYBPWKc3dctrJtiqcV8FZcY/metadata.json new file mode 100644 index 0000000..4a68b9d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPcjSLZHASruTkaqaNmVeHqYBPWKc3dctrJtiqcV8FZcY/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"initialPrice","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"name":"createDVM","outputs":[{"internalType":"address","name":"dvm","type":"address"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Deploy this on Chain 138 and set DODO_VENDING_MACHINE_ADDRESS so run-pmm-and-pools.sh can run. Pools are mock (no real AMM); replace with real DODO DVM when available (see DVM_DEPLOYMENT_CHECK.md).","kind":"dev","methods":{},"title":"MockDVMFactory","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Mock DODO Vending Machine factory for Chain 138 when no official DVM exists","version":1}},"settings":{"compilationTarget":{"contracts/dex/MockDVMFactory.sol":"MockDVMFactory"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"contracts/dex/MockDVMFactory.sol":{"keccak256":"0x86c952a11b91c95da3077cd3f9c53f23725aacd168a9bb1d8fb374a31ef3ab97","license":"MIT","urls":["bzz-raw://93ad92cb33d47a47b2c0b7148e87071fbb4437c982f4053835ec52f3867dbb05","dweb:/ipfs/QmfDy5exdWzngTjKmyq2YBcPTmtiA1sozKpLcwzMrmc3L2"]},"contracts/dex/MockDVMPool.sol":{"keccak256":"0xc24e46eb32ec6901bdc96eb3d90266f0765314493851b0a3ceb2af38202ff043","license":"MIT","urls":["bzz-raw://a99bbfd3c96d2bc0aae4f5d59809ec85508c687fbc9029743b5aa834ed01b3cf","dweb:/ipfs/QmcaDdUvgFZHw3HNSxDer55Yz6mnDAk9pRCZzJDvRqJj7k"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPhffrfAd81QcSBjiAVLLaTtAZ12bRxbRDB8D5XSrBFih/archive-info.json b/verification-sources/chain138-metadata-archive/QmPhffrfAd81QcSBjiAVLLaTtAZ12bRxbRDB8D5XSrBFih/archive-info.json new file mode 100644 index 0000000..4565eb9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPhffrfAd81QcSBjiAVLLaTtAZ12bRxbRDB8D5XSrBFih/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPhffrfAd81QcSBjiAVLLaTtAZ12bRxbRDB8D5XSrBFih", + "metadata_digest": "143df883fa911e5fc7fbc0f3d42f2c1da2984a217684ae695901c68963b0b32a", + "source_path": "contracts/bridge/adapters/non-evm/TezosAdapter.sol", + "contract_name": "TezosAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPhffrfAd81QcSBjiAVLLaTtAZ12bRxbRDB8D5XSrBFih/metadata.json b/verification-sources/chain138-metadata-archive/QmPhffrfAd81QcSBjiAVLLaTtAZ12bRxbRDB8D5XSrBFih/metadata.json new file mode 100644 index 0000000..a3f0aa5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPhffrfAd81QcSBjiAVLLaTtAZ12bRxbRDB8D5XSrBFih/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"string","name":"txHash","type":"string"}],"name":"TezosBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"destination","type":"string"}],"name":"TezosBridgeInitiated","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"string","name":"txHash","type":"string"}],"name":"confirmTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"txHashes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"Lock tokens on this chain; off-chain relayer watches events and performs Tezos-side mint/transfer. Oracle calls confirmTransaction when Tezos tx is confirmed.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"TezosAdapter","version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"confirmTransaction(bytes32,string)":{"notice":"Called by oracle/relayer when Tezos tx is confirmed"},"estimateFee(address,uint256,bytes)":{"notice":"Estimate bridge fee"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate Tezos destination (tz1/tz2/tz3/KT1 address format; length 35-64 bytes when UTF-8)"}},"notice":"Bridge adapter for Tezos L1 (native Michelson)","version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/non-evm/TezosAdapter.sol":"TezosAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/adapters/non-evm/TezosAdapter.sol":{"keccak256":"0xf416124850af2e1e8edc2397d762535433a14412af6edef4ef5cf20cc0fc8674","license":"MIT","urls":["bzz-raw://4ed110e4d3a5bc430e6c36f2a99fa2ac45d892c7bbe61ae0249c63681d66ce74","dweb:/ipfs/QmVwQ5EgcAGbbRrMQGhK2USXW1LyK2iYx9ijz4jPDtLoEH"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPmkrmCiRuaXgRwsD2yXujLyrrSWdUhYUzRDno3tVjX5j/archive-info.json b/verification-sources/chain138-metadata-archive/QmPmkrmCiRuaXgRwsD2yXujLyrrSWdUhYUzRDno3tVjX5j/archive-info.json new file mode 100644 index 0000000..426af42 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPmkrmCiRuaXgRwsD2yXujLyrrSWdUhYUzRDno3tVjX5j/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPmkrmCiRuaXgRwsD2yXujLyrrSWdUhYUzRDno3tVjX5j", + "metadata_digest": "154a28fe27169e182eb5ef60335e3477d4d084c2facc613263740d4bcd57fefa", + "source_path": "@openzeppelin/contracts/token/ERC20/IERC20.sol", + "contract_name": "IERC20", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPmkrmCiRuaXgRwsD2yXujLyrrSWdUhYUzRDno3tVjX5j/metadata.json b/verification-sources/chain138-metadata-archive/QmPmkrmCiRuaXgRwsD2yXujLyrrSWdUhYUzRDno3tVjX5j/metadata.json new file mode 100644 index 0000000..56b9991 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPmkrmCiRuaXgRwsD2yXujLyrrSWdUhYUzRDno3tVjX5j/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface of the ERC20 standard as defined in the EIP.","events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":"IERC20"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPmnpv47Q6bLdjGDgHg2rhp7rBU25ci41B96RZKZZbn8M/archive-info.json b/verification-sources/chain138-metadata-archive/QmPmnpv47Q6bLdjGDgHg2rhp7rBU25ci41B96RZKZZbn8M/archive-info.json new file mode 100644 index 0000000..f3742b5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPmnpv47Q6bLdjGDgHg2rhp7rBU25ci41B96RZKZZbn8M/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPmnpv47Q6bLdjGDgHg2rhp7rBU25ci41B96RZKZZbn8M", + "metadata_digest": "154c62b17c0e4f5cebba897091b131be09cd22ab71480233739c731457ecaace", + "source_path": "contracts/ccip-integration/CCIPLogger.sol", + "contract_name": "CCIPLogger", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPmnpv47Q6bLdjGDgHg2rhp7rBU25ci41B96RZKZZbn8M/metadata.json b/verification-sources/chain138-metadata-archive/QmPmnpv47Q6bLdjGDgHg2rhp7rBU25ci41B96RZKZZbn8M/metadata.json new file mode 100644 index 0000000..1a35964 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPmnpv47Q6bLdjGDgHg2rhp7rBU25ci41B96RZKZZbn8M/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_authorizedSigner","type":"address"},{"internalType":"uint64","name":"_expectedSourceChainSelector","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldSigner","type":"address"},{"indexed":false,"internalType":"address","name":"newSigner","type":"address"}],"name":"AuthorizedSignerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"batchId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes32[]","name":"txHashes","type":"bytes32[]"},{"indexed":false,"internalType":"address[]","name":"froms","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"tos","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"RemoteBatchLogged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"oldSelector","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"newSelector","type":"uint64"}],"name":"SourceChainSelectorUpdated","type":"event"},{"inputs":[],"name":"authorizedSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"expectedSourceChainSelector","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedBatches","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setAuthorizedSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_selector","type":"uint64"}],"name":"setExpectedSourceChainSelector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Implements replay protection via batch ID tracking; optional authorized signer for future use","kind":"dev","methods":{"ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"params":{"message":"The received CCIP message"}}},"title":"CCIPLogger","version":1},"userdoc":{"kind":"user","methods":{"ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"notice":"Handle CCIP message (called by CCIP Router)"}},"notice":"Receives and logs Chain-138 transactions via Chainlink CCIP","version":1}},"settings":{"compilationTarget":{"contracts/ccip-integration/CCIPLogger.sol":"CCIPLogger"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/ccip-integration/CCIPLogger.sol":{"keccak256":"0x8dd51aa82d17f14f59c7479a4d08d0563490ef9baeee17d209182f02f8b9f543","license":"MIT","urls":["bzz-raw://f25e198f98b6a1f02ca9ca2965d2c2450106b62339d7be4361d64e230b43d89e","dweb:/ipfs/QmaTuaGrpdxi3m9QwdE8gKREUUkhs4fFzfVBwsP8kAyQRj"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPnxoRLPvKTYFqnHtbHogZ5tYD5NRufx3KNvEU3DmF4KX/archive-info.json b/verification-sources/chain138-metadata-archive/QmPnxoRLPvKTYFqnHtbHogZ5tYD5NRufx3KNvEU3DmF4KX/archive-info.json new file mode 100644 index 0000000..efd58ec --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPnxoRLPvKTYFqnHtbHogZ5tYD5NRufx3KNvEU3DmF4KX/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPnxoRLPvKTYFqnHtbHogZ5tYD5NRufx3KNvEU3DmF4KX", + "metadata_digest": "15993e850fce001bb308ea9761ce1dda35509d16e295336ea4610a7bb276170e", + "source_path": "contracts/bridge/trustless/BridgeSwapCoordinator.sol", + "contract_name": "BridgeSwapCoordinator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPnxoRLPvKTYFqnHtbHogZ5tYD5NRufx3KNvEU3DmF4KX/metadata.json b/verification-sources/chain138-metadata-archive/QmPnxoRLPvKTYFqnHtbHogZ5tYD5NRufx3KNvEU3DmF4KX/metadata.json new file mode 100644 index 0000000..06f04e7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPnxoRLPvKTYFqnHtbHogZ5tYD5NRufx3KNvEU3DmF4KX/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_inbox","type":"address"},{"internalType":"address","name":"_liquidityPool","type":"address"},{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_challengeManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"ClaimChallenged","type":"error"},{"inputs":[],"name":"ClaimNotFinalized","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientOutput","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ZeroDepositId","type":"error"},{"inputs":[],"name":"ZeroRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"enum LiquidityPoolETH.AssetType","name":"inputAsset","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"stablecoinToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"stablecoinAmount","type":"uint256"}],"name":"BridgeSwapExecuted","type":"event"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"enum LiquidityPoolETH.AssetType","name":"outputAsset","type":"uint8"},{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"bytes","name":"routeData","type":"bytes"}],"name":"bridgeAndSwap","outputs":[{"internalType":"uint256","name":"stablecoinAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"canSwap","outputs":[{"internalType":"bool","name":"canSwap_","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"challengeManager","outputs":[{"internalType":"contract ChallengeManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inbox","outputs":[{"internalType":"contract InboxETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPool","outputs":[{"internalType":"contract LiquidityPoolETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract SwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Verifies claim finalization, releases from liquidity pool, executes swap, transfers stablecoin","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"bridgeAndSwap(uint256,address,uint8,address,uint256,bytes)":{"params":{"amountOutMin":"Minimum stablecoin output (slippage protection)","depositId":"Deposit ID","outputAsset":"Asset type from bridge (ETH or WETH)","recipient":"Recipient address (should match claim recipient)","routeData":"Optional route data for swap (for 1inch)","stablecoinToken":"Target stablecoin address (USDT, USDC, or DAI)"},"returns":{"stablecoinAmount":"Amount of stablecoin received"}},"canSwap(uint256)":{"params":{"depositId":"Deposit ID"},"returns":{"canSwap_":"True if claim can be swapped","reason":"Reason if cannot swap"}},"constructor":{"params":{"_challengeManager":"ChallengeManager contract address","_inbox":"InboxETH contract address","_liquidityPool":"LiquidityPoolETH contract address","_swapRouter":"SwapRouter contract address"}}},"title":"BridgeSwapCoordinator","version":1},"userdoc":{"kind":"user","methods":{"bridgeAndSwap(uint256,address,uint8,address,uint256,bytes)":{"notice":"Execute bridge release + swap to stablecoin"},"canSwap(uint256)":{"notice":"Check if claim can be swapped"},"constructor":{"notice":"Constructor"}},"notice":"Coordinates bridge release + swap in single transaction","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/BridgeSwapCoordinator.sol":"BridgeSwapCoordinator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/BondManager.sol":{"keccak256":"0xd9c903ba88cae86f3477b282c24308a3e8da48885518337e551f747576edab8f","license":"MIT","urls":["bzz-raw://77b72abe65c34dbe450d7bef2be8bf49ce2e188fb18955143cae39d1318ed510","dweb:/ipfs/QmTZXXgixwpjzcsGuqRS6X9JWwaFawg2g6ptHWLNoGzeN2"]},"contracts/bridge/trustless/BridgeSwapCoordinator.sol":{"keccak256":"0xe766302f2344fd63a4dc24f0965abf436ea5a7bc7436f1285f3518c4ed0b63d3","license":"MIT","urls":["bzz-raw://3de02116f6754206178aea890b2fb91f184f5689c75405adfe83396d5bbf70e0","dweb:/ipfs/QmZdziWiWwXBJNyY3cdSie2LGTfiMmAJQBPoL5awRfau35"]},"contracts/bridge/trustless/ChallengeManager.sol":{"keccak256":"0x1b78e36725fc1d8e0fc8f93ad6b6fb7c41205df7db81bc790338c9dbfbf9da5f","license":"MIT","urls":["bzz-raw://c6f8aa8fbf2996df80a4d8f97107c4dabebf1bd16da5c1a2c2267f67b421517f","dweb:/ipfs/QmSwYZ2mFi6fbtbZAqPerQVjuqov3QL7ramtrafS8cqijq"]},"contracts/bridge/trustless/InboxETH.sol":{"keccak256":"0x17dc0c5a4dcbd345fe0828cf41149098d5966e25235964a247da1623ce63d8ff","license":"MIT","urls":["bzz-raw://059d14196f2f160f38db2713d562975086b6be688e50553d6e90b03c3de95e4a","dweb:/ipfs/QmXm7uTYvKMmsPoahi7G17tz1ZkWnG2WzSC6NUe3Lh7MCW"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]},"contracts/bridge/trustless/SwapRouter.sol":{"keccak256":"0x46c48469998ef933a26e9a8276fe5183987664c0f0972de7fccc0489dd1d7a03","license":"MIT","urls":["bzz-raw://81fcbbe09707082aaa4a8125b69200979cbbaf56d190ffa0795fb5d5f561f84c","dweb:/ipfs/QmbJxRppS5zvoYSfdRDxhujEnEGYDdzmedZq8CarP5x5db"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/interfaces/IWETH.sol":{"keccak256":"0x2797f22d48c59542f0c7eb5d4405c7c5c2156c764faf9798de2493e5f6487977","license":"MIT","urls":["bzz-raw://e876c569dce230e2eaf208885fa3df05879363b80df005bbe1841f404c789202","dweb:/ipfs/QmTMEUjEVx2ZvKKe7L6uuEWZYbFaTUYAkabF91189J5wMf"]},"contracts/bridge/trustless/libraries/FraudProofTypes.sol":{"keccak256":"0x15e2c59fc46db2ddb33eda2bcd632392564d859942fb1e0026622201f45fe9ab","license":"MIT","urls":["bzz-raw://81e5b0e23122f0d1bccab7d8470987e3aaa787c2d02e140631ff70a83567ae2c","dweb:/ipfs/QmbxNW8tY3FnyFM5GKrEj9Vtr9kLSX6X78xKQGjPdbfd46"]},"contracts/bridge/trustless/libraries/MerkleProofVerifier.sol":{"keccak256":"0x8d92e319d3f83a0e4218d89b598ed86c478a446b4e9271fa1d284842a1aca82b","license":"MIT","urls":["bzz-raw://2aad9a1e47f6e7177b8e7f77ebbb4f9bb32df02f43d07edbd76b7442d49f4e87","dweb:/ipfs/QmXdaJGiAXHqAW9d1zEyBY1vzJhoUaFhzFdPGsxFRrnCLi"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPtWcn7cTVA62W5uLihphx2y1WyUf7nnbiCamVXFGbLWj/archive-info.json b/verification-sources/chain138-metadata-archive/QmPtWcn7cTVA62W5uLihphx2y1WyUf7nnbiCamVXFGbLWj/archive-info.json new file mode 100644 index 0000000..5aba36d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPtWcn7cTVA62W5uLihphx2y1WyUf7nnbiCamVXFGbLWj/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPtWcn7cTVA62W5uLihphx2y1WyUf7nnbiCamVXFGbLWj", + "metadata_digest": "17051f91d90aa6f012e9e739b94b74c138d50cfd9ebc46d93e7d67197bcec7e8", + "source_path": "contracts/flash/UniversalCCIPFlashBridgeAdapter.sol", + "contract_name": "UniversalCCIPFlashBridgeAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPtWcn7cTVA62W5uLihphx2y1WyUf7nnbiCamVXFGbLWj/metadata.json b/verification-sources/chain138-metadata-archive/QmPtWcn7cTVA62W5uLihphx2y1WyUf7nnbiCamVXFGbLWj/metadata.json new file mode 100644 index 0000000..95e6475 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPtWcn7cTVA62W5uLihphx2y1WyUf7nnbiCamVXFGbLWj/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"universalBridge_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"address","name":"recipientOnDestination","type":"address"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"bridgeTokensFrom","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"universalBridge","outputs":[{"internalType":"contract UniversalCCIPBridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"`extraData` (see `ICrossChainFlashBridge`): if empty, uses `assetType = 0`, `usePMM/useVault = false`, empty proofs. If non-empty: `abi.encode(bytes32 assetType, bool usePMM, bool useVault, bytes complianceProof, bytes vaultInstructions)`. Native value is forwarded for CCIP fees on the underlying bridge.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"UniversalCCIPFlashBridgeAdapter","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Pulls `token` from the caller (e.g. `CrossChainFlashBorrower`) and forwards a `UniversalCCIPBridge.bridge` call.","version":1}},"settings":{"compilationTarget":{"contracts/flash/UniversalCCIPFlashBridgeAdapter.sol":"UniversalCCIPFlashBridgeAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/UniversalCCIPBridge.sol":{"keccak256":"0xcdbe2bad1997db39d23990cc77a7e304ff228d4de878b0a897285e9eaf1f39ca","license":"MIT","urls":["bzz-raw://fe0c40c17b7869587ecacd0fe72f880a3e1e8a836d7f93650d52123bbc9efce2","dweb:/ipfs/QmXqoeHhNAJqJqA7NHw4WjpqWW8SXwVJ7TosQkTp74NiDY"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/flash/UniversalCCIPFlashBridgeAdapter.sol":{"keccak256":"0x79368b19eee4620dd4af62c71592d16b73a0dbdd16f86100234ae1077593c89f","license":"MIT","urls":["bzz-raw://e3ed10e4ffa3291a7033566f9597c829487dc6578e20d5a595718cb174665e23","dweb:/ipfs/QmeBAZTLYTPk6PANtTQP32bFFxLzP9JLYT8JveexKy8oRC"]},"contracts/flash/interfaces/ICrossChainFlashBridge.sol":{"keccak256":"0xe27559ab0d9cb3fd2b733cbfabb857970baebd16e81a2ba0358e826050e9b3e8","license":"MIT","urls":["bzz-raw://da208d8e6dcc07c3fa09ee53bb679fc8213f476612335df1991700bce4e1404e","dweb:/ipfs/QmeT6KD6LwwgEEnQdLC1dyZP5iHHaysm3waWoNC3sxyj5P"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmPvG2yiHHp9JvaJiecyJKGJh85DnmFCfLVoGHJ5LFDgvg/archive-info.json b/verification-sources/chain138-metadata-archive/QmPvG2yiHHp9JvaJiecyJKGJh85DnmFCfLVoGHJ5LFDgvg/archive-info.json new file mode 100644 index 0000000..06284e4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPvG2yiHHp9JvaJiecyJKGJh85DnmFCfLVoGHJ5LFDgvg/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmPvG2yiHHp9JvaJiecyJKGJh85DnmFCfLVoGHJ5LFDgvg", + "metadata_digest": "1777cbd111425a6de759adc90b77ec1f023c74f588331d76daec74fee53ae1c5", + "source_path": "contracts/emoney/interfaces/IAccountWalletRegistry.sol", + "contract_name": "IAccountWalletRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmPvG2yiHHp9JvaJiecyJKGJh85DnmFCfLVoGHJ5LFDgvg/metadata.json b/verification-sources/chain138-metadata-archive/QmPvG2yiHHp9JvaJiecyJKGJh85DnmFCfLVoGHJ5LFDgvg/metadata.json new file mode 100644 index 0000000..9b90327 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmPvG2yiHHp9JvaJiecyJKGJh85DnmFCfLVoGHJ5LFDgvg/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"walletRefId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"provider","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"linkedAt","type":"uint64"}],"name":"AccountWalletLinked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"AccountWalletUnlinked","type":"event"},{"inputs":[{"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"getAccounts","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"}],"name":"getWallets","outputs":[{"components":[{"internalType":"bytes32","name":"walletRefId","type":"bytes32"},{"internalType":"uint64","name":"linkedAt","type":"uint64"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"provider","type":"bytes32"}],"internalType":"struct WalletLink[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"isLinked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"internalType":"bytes32","name":"walletRefId","type":"bytes32"},{"internalType":"bytes32","name":"provider","type":"bytes32"}],"name":"linkAccountToWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"unlinkAccountFromWallet","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/emoney/interfaces/IAccountWalletRegistry.sol":"IAccountWalletRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/emoney/interfaces/IAccountWalletRegistry.sol":{"keccak256":"0x86ba615b8d4f52f505cc59b276e36bbd501f65d4cf3fedb7758d86e7fb78e4df","license":"MIT","urls":["bzz-raw://2a18f0b6b1a8c44f516bd3ed7ed51665fc1f50c7dfe1b1711f2ed7125db60a89","dweb:/ipfs/QmeFDv2naXrzN2vQJQKszE9KmYb3HG88zLW4RqXJAFTo73"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQ4r1A11zVwM3NrunpCu6V1Turw9CJjFqa8S3CuYJTwRE/archive-info.json b/verification-sources/chain138-metadata-archive/QmQ4r1A11zVwM3NrunpCu6V1Turw9CJjFqa8S3CuYJTwRE/archive-info.json new file mode 100644 index 0000000..23b1366 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQ4r1A11zVwM3NrunpCu6V1Turw9CJjFqa8S3CuYJTwRE/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQ4r1A11zVwM3NrunpCu6V1Turw9CJjFqa8S3CuYJTwRE", + "metadata_digest": "19aad9dc9b09e333bf34bdbb058f80bb9eb3d8385aef4e6aa32f04509a8ad815", + "source_path": "contracts/bridge/adapters/non-evm/StellarAdapter.sol", + "contract_name": "StellarAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQ4r1A11zVwM3NrunpCu6V1Turw9CJjFqa8S3CuYJTwRE/metadata.json b/verification-sources/chain138-metadata-archive/QmQ4r1A11zVwM3NrunpCu6V1Turw9CJjFqa8S3CuYJTwRE/metadata.json new file mode 100644 index 0000000..e74c956 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQ4r1A11zVwM3NrunpCu6V1Turw9CJjFqa8S3CuYJTwRE/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"string","name":"stellarTxHash","type":"string"},{"indexed":false,"internalType":"uint256","name":"ledgerSequence","type":"uint256"}],"name":"StellarBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"stellarAccount","type":"string"}],"name":"StellarBridgeInitiated","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"string","name":"stellarTxHash","type":"string"},{"internalType":"uint256","name":"ledgerSequence","type":"uint256"}],"name":"confirmStellarTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"stellarTxHashes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"estimateFee(address,uint256,bytes)":{"notice":"Estimate bridge fee"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"}},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/non-evm/StellarAdapter.sol":"StellarAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/adapters/non-evm/StellarAdapter.sol":{"keccak256":"0xd430a19ccbe8c872e8c15ef189128850311f6fd6e274a6c548d93f6010e76975","license":"MIT","urls":["bzz-raw://9e95469595dffeb62b765853a61abab805050c4e38909f114d34d52830290863","dweb:/ipfs/QmS9oYwaf3j64Zk1Mvt1ftxm4kNR8KhfzxhGJ3DPkvLezn"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQ8D6jy8u41ZhgRC7zF2wR1zp1H6Gu29hiLJP5eyJQiJw/archive-info.json b/verification-sources/chain138-metadata-archive/QmQ8D6jy8u41ZhgRC7zF2wR1zp1H6Gu29hiLJP5eyJQiJw/archive-info.json new file mode 100644 index 0000000..6445065 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQ8D6jy8u41ZhgRC7zF2wR1zp1H6Gu29hiLJP5eyJQiJw/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQ8D6jy8u41ZhgRC7zF2wR1zp1H6Gu29hiLJP5eyJQiJw", + "metadata_digest": "1a877276416bf4a95bede6e88cb9dd6bbb223a76ddd8c88cc7957195598546bc", + "source_path": "contracts/wrapped-lp-public/interfaces/IWLPProgramEvents.sol", + "contract_name": "IWLPProgramEvents", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQ8D6jy8u41ZhgRC7zF2wR1zp1H6Gu29hiLJP5eyJQiJw/metadata.json b/verification-sources/chain138-metadata-archive/QmQ8D6jy8u41ZhgRC7zF2wR1zp1H6Gu29hiLJP5eyJQiJw/metadata.json new file mode 100644 index 0000000..4b7fbe3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQ8D6jy8u41ZhgRC7zF2wR1zp1H6Gu29hiLJP5eyJQiJw/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"}],"name":"LPLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"}],"name":"LPReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"wlpAmount","type":"uint256"}],"name":"RedemptionRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WLPMinted","type":"event"}],"devdoc":{"details":"`lockRef` is the idempotency key for destination mint (replay protection).","kind":"dev","methods":{},"title":"IWLPProgramEvents","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Canonical events for wrapped-LP / bridge attestation flows (Option A).","version":1}},"settings":{"compilationTarget":{"contracts/wrapped-lp-public/interfaces/IWLPProgramEvents.sol":"IWLPProgramEvents"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/wrapped-lp-public/interfaces/IWLPProgramEvents.sol":{"keccak256":"0x71b9c9f9de8553c6c638b02cf93ce7d948021c6ca1719d42725f7eca9ea211d2","license":"MIT","urls":["bzz-raw://76c5b3e693702cd5c2cc2b5131e02046346e8b38d88208f9fa030563852f8786","dweb:/ipfs/QmXWwwAB9zjaVBGW8wCx4coiusmFxtvB24jGozaYXeH7M2"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQGMrKKbCwmz2gHHn9VxB6rrg9sSkRTbQrworryTYmqKU/archive-info.json b/verification-sources/chain138-metadata-archive/QmQGMrKKbCwmz2gHHn9VxB6rrg9sSkRTbQrworryTYmqKU/archive-info.json new file mode 100644 index 0000000..c2dc3c9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQGMrKKbCwmz2gHHn9VxB6rrg9sSkRTbQrworryTYmqKU/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQGMrKKbCwmz2gHHn9VxB6rrg9sSkRTbQrworryTYmqKU", + "metadata_digest": "1c9dfd1c09e233ca0ca2fed2fd8ac258b5c966f98fa36702fff7a4ff51660e7f", + "source_path": "contracts/iso4217w/TokenFactory.sol", + "contract_name": "TokenFactory", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQGMrKKbCwmz2gHHn9VxB6rrg9sSkRTbQrworryTYmqKU/metadata.json b/verification-sources/chain138-metadata-archive/QmQGMrKKbCwmz2gHHn9VxB6rrg9sSkRTbQrworryTYmqKU/metadata.json new file mode 100644 index 0000000..33c5475 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQGMrKKbCwmz2gHHn9VxB6rrg9sSkRTbQrworryTYmqKU/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"tokenImplementation_","type":"address"},{"internalType":"address","name":"tokenRegistry_","type":"address"},{"internalType":"address","name":"complianceGuard_","type":"address"},{"internalType":"address","name":"reserveOracle_","type":"address"},{"internalType":"address","name":"mintController_","type":"address"},{"internalType":"address","name":"burnController_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":true,"internalType":"address","name":"custodian","type":"address"}],"name":"TokenDeployed","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPLOYER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"complianceGuard","outputs":[{"internalType":"contract IComplianceGuard","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"custodian","type":"address"}],"name":"deployToken","outputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"burnController_","type":"address"}],"name":"setBurnController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"complianceGuard_","type":"address"}],"name":"setComplianceGuard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mintController_","type":"address"}],"name":"setMintController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reserveOracle_","type":"address"}],"name":"setReserveOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenRegistry_","type":"address"}],"name":"setTokenRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRegistry","outputs":[{"internalType":"contract ITokenRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Creates UUPS upgradeable proxy tokens with proper configuration","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"deployToken(string,string,string,uint8,address)":{"params":{"currencyCode":"ISO-4217 currency code (e.g., \"USD\")","custodian":"Custodian address","decimals":"Token decimals (typically 2 for fiat)","name":"Token name (e.g., \"USDW Token\")","symbol":"Token symbol (must be W, e.g., \"USDW\")"},"returns":{"token":"Address of deployed token"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"TokenFactory","version":1},"userdoc":{"kind":"user","methods":{"deployToken(string,string,string,uint8,address)":{"notice":"Deploy a new ISO-4217 W token"},"setTokenRegistry(address)":{"notice":"Set system contract addresses"}},"notice":"Factory for deploying ISO-4217 W tokens","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/TokenFactory.sol":"TokenFactory"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol":{"keccak256":"0xd518def45c722a6e803e1e26e625db25e01497f672ca566cca585d234ec903b0","license":"MIT","urls":["bzz-raw://6e7de3fccd96783244790cde282435ce0fd3a44ab4ccb10f17005c743202882f","dweb:/ipfs/QmYSepstTqs5UPJvjeJXkWU5R659yReqrSgSGGh65hkbdK"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"keccak256":"0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec","license":"MIT","urls":["bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c","dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/Proxy.sol":{"keccak256":"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd","license":"MIT","urls":["bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac","dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/iso4217w/ISO4217WToken.sol":{"keccak256":"0x8cbf914cdd061fe24d3d1d7225c658a46a2457c432b0a31f2dce51ccadf0ea4e","license":"MIT","urls":["bzz-raw://149d904a440d679b115eb457dc296373e608091b90d39f9c6d790a18042c9cae","dweb:/ipfs/QmbAEiBVExtF5J1onA65om6pLgfBfDPrgsv5euLjkNyQh2"]},"contracts/iso4217w/TokenFactory.sol":{"keccak256":"0x2615c3c2987dc4251b6e6f2d04fbf0baa39d5c8f6053c36206741ec5cb6d732c","license":"MIT","urls":["bzz-raw://faa37bb0867671a115f51ba73a611fb8d458573445194f95b815fa1c51b70664","dweb:/ipfs/QmaXqiNitpRBeHizAwGsYsFf3zZvTT6pScjKQzTuNJZJWL"]},"contracts/iso4217w/interfaces/IComplianceGuard.sol":{"keccak256":"0x2f812514f56778c271667c97288de5d8c8b4c3745491a4e787abf4ff02dc74a6","license":"MIT","urls":["bzz-raw://97e6607a8262c270d90c9497df31259e7bb616e2e4d934a1c26c556b5e7e0f9e","dweb:/ipfs/Qmcsy2CjBZVh88yktxpRKawK1xrjMCQMqosPr78HxQWFzZ"]},"contracts/iso4217w/interfaces/IISO4217WToken.sol":{"keccak256":"0xd583b83e8598f54e2f3cc5e8bf954441fa73e959a0b816522eb66528b248d412","license":"MIT","urls":["bzz-raw://103a3010d1805dc5e1bbda03ce9338e03aa0ca36a914677cd45ece3ec8868ae3","dweb:/ipfs/QmQDnC1kxKbtedmyjMN4W8oonbGQ4y6LARWWqn7jK4V8W9"]},"contracts/iso4217w/interfaces/ITokenRegistry.sol":{"keccak256":"0x819a713049356cfd7a265358d9c16813dc6e2bbac73b8ed6ff6e594250333464","license":"MIT","urls":["bzz-raw://b6010875dce14843a813a5f9a3437a140a8b84196af364672731b470729ac108","dweb:/ipfs/QmVUkBiHpgf4gWpAHayZ474My6C74T9eZvpqW9rs5MyuAn"]},"contracts/iso4217w/libraries/ISO4217WCompliance.sol":{"keccak256":"0xdfef8ded2a1d1fd8303a05b6846270a0bb882386c2da513260cc19a20c7a8b68","license":"MIT","urls":["bzz-raw://e1107bd7d443a2ef6995fbaceab0e4d06b6c36e72cf5f1b08e9fc64f8a4dc256","dweb:/ipfs/QmNter36BUWZnPHsLZWbQTeDdMiVKQNxWoBHLDoQ74B8JA"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQRHszrtDJGSfLkitprAxjLdS9yAcfzQae7nZE3g4ehAe/archive-info.json b/verification-sources/chain138-metadata-archive/QmQRHszrtDJGSfLkitprAxjLdS9yAcfzQae7nZE3g4ehAe/archive-info.json new file mode 100644 index 0000000..df6667e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQRHszrtDJGSfLkitprAxjLdS9yAcfzQae7nZE3g4ehAe/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQRHszrtDJGSfLkitprAxjLdS9yAcfzQae7nZE3g4ehAe", + "metadata_digest": "1ee7b9d89813e8611094517fd6049c4907c6fbd83aceac2818b2ba1136434127", + "source_path": "contracts/tokenization/TokenRegistry.sol", + "contract_name": "TokenRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQRHszrtDJGSfLkitprAxjLdS9yAcfzQae7nZE3g4ehAe/metadata.json b/verification-sources/chain138-metadata-archive/QmQRHszrtDJGSfLkitprAxjLdS9yAcfzQae7nZE3g4ehAe/metadata.json new file mode 100644 index 0000000..63fdff1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQRHszrtDJGSfLkitprAxjLdS9yAcfzQae7nZE3g4ehAe/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InvalidBacking","type":"error"},{"inputs":[],"name":"InvalidStatus","type":"error"},{"inputs":[],"name":"TokenAlreadyRegistered","type":"error"},{"inputs":[],"name":"TokenNotFound","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"string","name":"tokenId","type":"string"},{"indexed":false,"internalType":"string","name":"underlyingAsset","type":"string"},{"indexed":true,"internalType":"address","name":"issuer","type":"address"}],"name":"TokenRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"TokenSuspended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"enum TokenRegistry.TokenStatus","name":"oldStatus","type":"uint8"},{"indexed":false,"internalType":"enum TokenRegistry.TokenStatus","name":"newStatus","type":"uint8"}],"name":"TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTRAR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"activateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getToken","outputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"tokenId","type":"string"},{"internalType":"string","name":"underlyingAsset","type":"string"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"string","name":"backingReserve","type":"string"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"backedAmount","type":"uint256"},{"internalType":"enum TokenRegistry.TokenStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"}],"internalType":"struct TokenRegistry.TokenMetadata","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenId","type":"string"}],"name":"getTokenByFabricId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"isTokenActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"tokenId","type":"string"},{"internalType":"string","name":"underlyingAsset","type":"string"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"string","name":"backingReserve","type":"string"}],"name":"registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"reason","type":"string"}],"name":"suspendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"tokenIdToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokens","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"tokenId","type":"string"},{"internalType":"string","name":"underlyingAsset","type":"string"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"string","name":"backingReserve","type":"string"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"backedAmount","type":"uint256"},{"internalType":"enum TokenRegistry.TokenStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"backedAmount","type":"uint256"}],"name":"updateTokenBacking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum TokenRegistry.TokenStatus","name":"newStatus","type":"uint8"}],"name":"updateTokenStatus","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"activateToken(address)":{"params":{"tokenAddress":"Token address"}},"getAllTokens()":{"returns":{"_0":"Array of token addresses"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getToken(address)":{"params":{"tokenAddress":"Token address"},"returns":{"_0":"Token metadata"}},"getTokenByFabricId(string)":{"params":{"tokenId":"Fabric token ID"},"returns":{"_0":"Token address"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isTokenActive(address)":{"params":{"tokenAddress":"Token address"},"returns":{"_0":"True if active"}},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"registerToken(address,string,string,address,string)":{"params":{"backingReserve":"Reserve identifier","issuer":"Issuer address","tokenAddress":"ERC-20 token address","tokenId":"Fabric token ID","underlyingAsset":"Underlying asset type (EUR, USD, etc.)"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"suspendToken(address,string)":{"params":{"reason":"Reason for suspension","tokenAddress":"Token address"}},"updateTokenBacking(address,uint256,uint256)":{"params":{"backedAmount":"Amount backed by reserves","tokenAddress":"Token address","totalSupply":"Current total supply"}},"updateTokenStatus(address,uint8)":{"params":{"newStatus":"New status","tokenAddress":"Token address"}}},"title":"TokenRegistry","version":1},"userdoc":{"kind":"user","methods":{"activateToken(address)":{"notice":"Activate a suspended token"},"getAllTokens()":{"notice":"Get all registered tokens"},"getToken(address)":{"notice":"Get token metadata"},"getTokenByFabricId(string)":{"notice":"Get token address by Fabric token ID"},"isTokenActive(address)":{"notice":"Check if token is active"},"pause()":{"notice":"Pause registry"},"registerToken(address,string,string,address,string)":{"notice":"Register a tokenized asset"},"suspendToken(address,string)":{"notice":"Suspend a token"},"unpause()":{"notice":"Unpause registry"},"updateTokenBacking(address,uint256,uint256)":{"notice":"Update token supply and backing"},"updateTokenStatus(address,uint8)":{"notice":"Update token status"}},"notice":"Registry for all tokenized assets with metadata","version":1}},"settings":{"compilationTarget":{"contracts/tokenization/TokenRegistry.sol":"TokenRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/interop/BridgeRegistry.sol":{"keccak256":"0x7e813c5d8f9762804a35c98244f09831f1ad6ea6df8f2b562c2d031cb246bbc3","license":"MIT","urls":["bzz-raw://e1bba0b26d12b384a26b0e8c09a7c4279a309c24783f501ba4c6bcaa79f6eb7f","dweb:/ipfs/QmRkuvkgurzKtMKAe4oiKc45G3JJ4vwXfM6jPb7PHS49Ts"]},"contracts/tokenization/TokenRegistry.sol":{"keccak256":"0x03a90a9fa5c6b5f9e70ad27940d2d7057139442adb0e29cf4977c10d70ef8c1a","license":"MIT","urls":["bzz-raw://64248a98b690f5f286b9500d5d2f7ddbe4422ed37886224e473ad61239609372","dweb:/ipfs/QmSVeKE7ZrFKXthEChQRX9ca7eGEcYFTMxaUBBg2txzS7U"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQdBHKwLbAMMDcBK8659oRVDPEPNffUGCW8EmE3ZG2vUt/archive-info.json b/verification-sources/chain138-metadata-archive/QmQdBHKwLbAMMDcBK8659oRVDPEPNffUGCW8EmE3ZG2vUt/archive-info.json new file mode 100644 index 0000000..4de0c8e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQdBHKwLbAMMDcBK8659oRVDPEPNffUGCW8EmE3ZG2vUt/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQdBHKwLbAMMDcBK8659oRVDPEPNffUGCW8EmE3ZG2vUt", + "metadata_digest": "21f33c4c4fae3e2122c92fc9e13b828b6423263f889ffd27c77619ca783037dd", + "source_path": "contracts/bridge/trustless/integration/ICommodityPegManager.sol", + "contract_name": "ICommodityPegManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQdBHKwLbAMMDcBK8659oRVDPEPNffUGCW8EmE3ZG2vUt/metadata.json b/verification-sources/chain138-metadata-archive/QmQdBHKwLbAMMDcBK8659oRVDPEPNffUGCW8EmE3ZG2vUt/metadata.json new file mode 100644 index 0000000..aeecb6a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQdBHKwLbAMMDcBK8659oRVDPEPNffUGCW8EmE3ZG2vUt/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"commodity","type":"address"}],"name":"checkCommodityPeg","outputs":[{"internalType":"bool","name":"isMaintained","type":"bool"},{"internalType":"int256","name":"deviationBps","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"commodity","type":"address"}],"name":"getCommodityPegStatus","outputs":[{"internalType":"uint256","name":"currentPrice","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"},{"internalType":"int256","name":"deviationBps","type":"int256"},{"internalType":"bool","name":"isMaintained","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"commodity","type":"address"},{"internalType":"address","name":"targetCurrency","type":"address"}],"name":"getCommodityPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportedCommodities","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"commodity","type":"address"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"xauRate","type":"uint256"}],"name":"registerCommodity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"commodity","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"targetCurrency","type":"address"}],"name":"triangulateViaXAU","outputs":[{"internalType":"uint256","name":"targetAmount","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"ICommodityPegManager","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Interface for Commodity Peg Manager","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/integration/ICommodityPegManager.sol":"ICommodityPegManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/integration/ICommodityPegManager.sol":{"keccak256":"0xac6ea4e0e063e63248f9e45c67cf6e73c7a9fe78cecd6dfd653fa639a4d19523","license":"MIT","urls":["bzz-raw://283095df7e58b829bf90fe4d4a790ab407d4d0c17cb175f7f82abc0d678890e5","dweb:/ipfs/QmZ97YmiFv8KFMkZX7CALQCvdwxPcdw673HCaZe2EQMxDY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQehK6eaXUVXJB6wNqDnDutkggB5QgEXYJzhMLdZX6Zt5/archive-info.json b/verification-sources/chain138-metadata-archive/QmQehK6eaXUVXJB6wNqDnDutkggB5QgEXYJzhMLdZX6Zt5/archive-info.json new file mode 100644 index 0000000..2189e2b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQehK6eaXUVXJB6wNqDnDutkggB5QgEXYJzhMLdZX6Zt5/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQehK6eaXUVXJB6wNqDnDutkggB5QgEXYJzhMLdZX6Zt5", + "metadata_digest": "2256c5a076ecccebcc6b198d2beaa300d2e048a6856e780d7a2ffdfbf373d73a", + "source_path": "contracts/emoney/interfaces/IeMoneyToken.sol", + "contract_name": "IeMoneyToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQehK6eaXUVXJB6wNqDnDutkggB5QgEXYJzhMLdZX6Zt5/metadata.json b/verification-sources/chain138-metadata-archive/QmQehK6eaXUVXJB6wNqDnDutkggB5QgEXYJzhMLdZX6Zt5/metadata.json new file mode 100644 index 0000000..54045d6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQehK6eaXUVXJB6wNqDnDutkggB5QgEXYJzhMLdZX6Zt5/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"reasonHash","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"reasonHash","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"IeMoneyToken","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Minimal interface for eMoney tokens (mint/burn with reason)","version":1}},"settings":{"compilationTarget":{"contracts/emoney/interfaces/IeMoneyToken.sol":"IeMoneyToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQkmiCsrZKjEZYgEbcaitzStzhYLWxVEKQ9QQa1FZptu5/archive-info.json b/verification-sources/chain138-metadata-archive/QmQkmiCsrZKjEZYgEbcaitzStzhYLWxVEKQ9QQa1FZptu5/archive-info.json new file mode 100644 index 0000000..461fdfb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQkmiCsrZKjEZYgEbcaitzStzhYLWxVEKQ9QQa1FZptu5/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQkmiCsrZKjEZYgEbcaitzStzhYLWxVEKQ9QQa1FZptu5", + "metadata_digest": "23e53ae9744af77d77045ccd43d41af972ec11cf76c0d1c89e27b64626100790", + "source_path": "@openzeppelin/contracts/interfaces/IERC3156FlashLender.sol", + "contract_name": "IERC3156FlashLender", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQkmiCsrZKjEZYgEbcaitzStzhYLWxVEKQ9QQa1FZptu5/metadata.json b/verification-sources/chain138-metadata-archive/QmQkmiCsrZKjEZYgEbcaitzStzhYLWxVEKQ9QQa1FZptu5/metadata.json new file mode 100644 index 0000000..3f85b3b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQkmiCsrZKjEZYgEbcaitzStzhYLWxVEKQ9QQa1FZptu5/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC3156FlashBorrower","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"maxFlashLoan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Interface of the ERC3156 FlashLender, as defined in https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].","kind":"dev","methods":{"flashFee(address,uint256)":{"details":"The fee to be charged for a given loan.","params":{"amount":"The amount of tokens lent.","token":"The loan currency."},"returns":{"_0":"The amount of `token` to be charged for the loan, on top of the returned principal."}},"flashLoan(address,address,uint256,bytes)":{"details":"Initiate a flash loan.","params":{"amount":"The amount of tokens lent.","data":"Arbitrary data structure, intended to contain user-defined parameters.","receiver":"The receiver of the tokens in the loan, and the receiver of the callback.","token":"The loan currency."}},"maxFlashLoan(address)":{"details":"The amount of currency available to be lended.","params":{"token":"The loan currency."},"returns":{"_0":"The amount of `token` that can be borrowed."}}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/interfaces/IERC3156FlashLender.sol":"IERC3156FlashLender"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":{"keccak256":"0x9f9e6dba43fe0775c400aa384375f1f503efaf733a40187169fdfc195f5ea6fa","license":"MIT","urls":["bzz-raw://ff5fe5fac5e4ecbf9fcd34c42b6d58d1af150263dfe07bc6785a59329dd1e475","dweb:/ipfs/QmX1EhNKKL6n6RFrLLAYh6Uf3itkozjSHyGFs9DqwW4Rzy"]},"@openzeppelin/contracts/interfaces/IERC3156FlashLender.sol":{"keccak256":"0x95d9eb59f21e885406d0e28b0510f9e1a0e7b4abe6636b5c966682927c65cfdd","license":"MIT","urls":["bzz-raw://a1cbff4d620ab51abe0c4ede9e4395bae53bcc3a7edd74e0eb08d7bdef155306","dweb:/ipfs/QmQcnBK28GDH4S5uXWqAcdRY1KcusXH4CxAqp87rYLir6n"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQkshhR79uRe2WfXVoqpE42GCF9enan19s8L2p5cHzEAD/archive-info.json b/verification-sources/chain138-metadata-archive/QmQkshhR79uRe2WfXVoqpE42GCF9enan19s8L2p5cHzEAD/archive-info.json new file mode 100644 index 0000000..4620af4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQkshhR79uRe2WfXVoqpE42GCF9enan19s8L2p5cHzEAD/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQkshhR79uRe2WfXVoqpE42GCF9enan19s8L2p5cHzEAD", + "metadata_digest": "23ec01233c4f37780a908b890cbb1e684e966411181c5b99a793ee0b270fa732", + "source_path": "contracts/dbis/DBIS_EIP712Helper.sol", + "contract_name": "DBIS_EIP712Helper", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQkshhR79uRe2WfXVoqpE42GCF9enan19s8L2p5cHzEAD/metadata.json b/verification-sources/chain138-metadata-archive/QmQkshhR79uRe2WfXVoqpE42GCF9enan19s8L2p5cHzEAD/metadata.json new file mode 100644 index 0000000..4839525 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQkshhR79uRe2WfXVoqpE42GCF9enan19s8L2p5cHzEAD/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"internalType":"bytes32","name":"structHash","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"typeHash","type":"bytes32"},{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"bytes32","name":"isoType","type":"bytes32"},{"internalType":"bytes32","name":"isoHash","type":"bytes32"},{"internalType":"bytes32","name":"accountingRef","type":"bytes32"},{"internalType":"uint8","name":"fundsStatus","type":"uint8"},{"internalType":"bytes32","name":"corridor","type":"bytes32"},{"internalType":"uint8","name":"assetClass","type":"uint8"},{"internalType":"bytes32","name":"recipientsHash","type":"bytes32"},{"internalType":"bytes32","name":"amountsHash","type":"bytes32"},{"internalType":"uint64","name":"notBefore","type":"uint64"},{"internalType":"uint64","name":"expiresAt","type":"uint64"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"}],"name":"getMintAuthStructHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"internalType":"bytes32","name":"typeHash","type":"bytes32"},{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"bytes32","name":"lpaId","type":"bytes32"},{"internalType":"bytes32","name":"venue","type":"bytes32"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"quoteHash","type":"bytes32"},{"internalType":"address","name":"quoteIssuer","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"}],"name":"getSwapAuthDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"arr","type":"address[]"}],"name":"hashAddressArray","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"arr","type":"uint256[]"}],"name":"hashUint256Array","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"recoverSigners","outputs":[{"internalType":"address[]","name":"signers","type":"address[]"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"DBIS_EIP712Helper","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Helper contract for EIP-712 hashing and ecrecover (own stack when called).","version":1}},"settings":{"compilationTarget":{"contracts/dbis/DBIS_EIP712Helper.sol":"DBIS_EIP712Helper"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/dbis/DBIS_EIP712Helper.sol":{"keccak256":"0x8bee3cf94111bd22ad4daf1625aa3b1356b9361555a4b572cd827a5a3913f4eb","license":"MIT","urls":["bzz-raw://a45e49ee4f3a5490702c22f764a2df8d66a0b2c0f3e8fed2210d1872bedc560b","dweb:/ipfs/QmTWKm4cZmxToW6YbPTMGjduqzgaRZua6tZyvxkJwSFX5b"]},"contracts/dbis/IDBIS_EIP712Helper.sol":{"keccak256":"0xbf68a20c4148ff149ea88a24855664287126597c95ddf6523f6747045a85ecae","license":"MIT","urls":["bzz-raw://38c3425f4a22875b835659f5928d39a308aec5017b0e44576aa882cdeaa9a2fa","dweb:/ipfs/QmSfFwR5GZ3kad4SYMda2akmvVGHPzNxei2fLcNDUjpbWd"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQoLzjQQGc2vguLoFtf22E35RXXhZM9s5JpE67XsCHSjp/archive-info.json b/verification-sources/chain138-metadata-archive/QmQoLzjQQGc2vguLoFtf22E35RXXhZM9s5JpE67XsCHSjp/archive-info.json new file mode 100644 index 0000000..fbaa314 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQoLzjQQGc2vguLoFtf22E35RXXhZM9s5JpE67XsCHSjp/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQoLzjQQGc2vguLoFtf22E35RXXhZM9s5JpE67XsCHSjp", + "metadata_digest": "248e06f2b0b0ca5ff55fb1a7a1712fbd7324db51bdbf57f173a350d64c12f327", + "source_path": "contracts/tokens/CompliantUSDCTokenV2.sol", + "contract_name": "CompliantUSDCTokenV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQoLzjQQGc2vguLoFtf22E35RXXhZM9s5JpE67XsCHSjp/metadata.json b/verification-sources/chain138-metadata-archive/QmQoLzjQQGc2vguLoFtf22E35RXXhZM9s5JpE67XsCHSjp/metadata.json new file mode 100644 index 0000000..9f3fa3f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQoLzjQQGc2vguLoFtf22E35RXXhZM9s5JpE67XsCHSjp/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"initialOperator","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"bool","name":"forwardCanonical_","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationAlreadyUsed","type":"error"},{"inputs":[{"internalType":"uint256","name":"validBefore","type":"uint256"}],"name":"AuthorizationExpired","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"authorizer","type":"address"}],"name":"AuthorizationInvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"address","name":"caller","type":"address"}],"name":"AuthorizationMustBeUsedByPayee","type":"error"},{"inputs":[{"internalType":"uint256","name":"validAfter","type":"uint256"}],"name":"AuthorizationNotYetValid","type":"error"},{"inputs":[{"internalType":"string","name":"aliasValue","type":"string"}],"name":"DuplicateAlias","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC2612ExpiredSignature","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC2612InvalidSigner","type":"error"},{"inputs":[],"name":"EmptyAlias","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"GovernanceControllerNotConfigured","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"GovernanceControllerOnly","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidAccountNonce","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint256","name":"attemptedPeriodMint","type":"uint256"}],"name":"MintCapExceeded","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"OwnerUnauthorized","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint256","name":"attemptedTotalSupply","type":"uint256"}],"name":"SupplyCapExceeded","type":"error"},{"inputs":[],"name":"ZeroGovernanceController","type":"error"},{"inputs":[],"name":"ZeroOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AuthorizationUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"}],"name":"CanonicalUnderlyingAssetUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"operationType","type":"bytes32"},{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"reasonHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"accountingRef","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"messageCorrelationId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"CompliantOperationDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mechanism","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisputeResolutionMechanismSet","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"forwardCanonical","type":"bool"}],"name":"ForwardCanonicalUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"}],"name":"GovernanceProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"JurisdictionDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"aliasValue","type":"string"}],"name":"LegacyAliasAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LegalNotice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"}],"name":"PrimaryJurisdictionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"approvalId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"actionType","type":"string"},{"indexed":false,"internalType":"bytes32","name":"referenceHash","type":"bytes32"}],"name":"RegulatoryApprovalRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"disclosureURI","type":"string"}],"name":"RegulatoryDisclosureURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reportingURI","type":"string"}],"name":"ReportingURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"storageNamespace","type":"bytes32"}],"name":"StorageNamespaceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"supervisionRequired","type":"bool"},{"indexed":false,"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"indexed":false,"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"}],"name":"SupervisionConfigurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"}],"name":"SupervisionProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"category","type":"string"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"SupervisoryNoticeRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"supplyCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintingPeriodCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintingPeriodDuration","type":"uint256"}],"name":"SupplyControlsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbolDisplay","type":"string"}],"name":"SymbolDisplayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"TokenURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"ValueTransferDeclared","type":"event"},{"inputs":[],"name":"BRIDGE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CANCEL_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COMPLIANCE_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISPUTE_RESOLUTION_MECHANISM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNANCE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_ARBITRATION_SUPPORT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_TRADE_TERMS_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_UNIFORM_RULES_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTRUMENT_CLASSIFICATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_20022_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_27001_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_3166_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_4217_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_8601_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JURISDICTION_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_ENFORCEABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_FRAMEWORK_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_JURISDICTION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_BURN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_MINT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_RECEIVE_WITH_AUTHORIZATION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_TRANSFER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_TRANSFER_WITH_AUTHORIZATION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RECEIVE_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATORY_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_OF_PROCESS_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPERVISOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFERABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAVEL_RULE_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"aliasValue","type":"string"}],"name":"addLegacyAlias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetVersionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"authorizationState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"reasonHash","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"cancelAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canonicalUnderlyingAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currencyCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintingPeriodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"aliasValue","type":"string"}],"name":"emergencyAddLegacyAlias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"disclosureURI_","type":"string"},{"internalType":"string","name":"reportingURI_","type":"string"}],"name":"emergencySetDisclosureMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"emergencySetForwardCanonical","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"governanceProfileId_","type":"bytes32"},{"internalType":"bytes32","name":"supervisionProfileId_","type":"bytes32"},{"internalType":"bytes32","name":"storageNamespace_","type":"bytes32"},{"internalType":"string","name":"jurisdiction_","type":"string"},{"internalType":"address","name":"canonicalUnderlyingAsset_","type":"address"},{"internalType":"bool","name":"supervisionRequired_","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired_","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod_","type":"uint256"}],"name":"emergencySetGovernanceMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"forwardCanonical_","type":"bool"},{"internalType":"string","name":"tokenURI_","type":"string"},{"internalType":"string","name":"symbolDisplay_","type":"string"}],"name":"emergencySetPresentationMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwardCanonical","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governmentApprovalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legacyAliases","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumUpgradeNoticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"reasonHash","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedInCurrentPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPeriodCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPeriodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"primaryJurisdiction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"receiveWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"recordLegalNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"approvalId","type":"bytes32"},{"internalType":"string","name":"actionType","type":"string"},{"internalType":"bytes32","name":"referenceHash","type":"bytes32"}],"name":"recordRegulatoryApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"noticeId","type":"bytes32"},{"internalType":"string","name":"category","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"name":"recordSupervisoryNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"regulatoryDisclosureURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reportingURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalUnderlyingAsset_","type":"address"}],"name":"setCanonicalUnderlyingAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setForwardCanonical","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governanceController_","type":"address"}],"name":"setGovernanceController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"governanceProfileId_","type":"bytes32"}],"name":"setGovernanceProfileId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction_","type":"string"}],"name":"setPrimaryJurisdiction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"disclosureURI_","type":"string"}],"name":"setRegulatoryDisclosureURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"reportingURI_","type":"string"}],"name":"setReportingURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"storageNamespace_","type":"bytes32"}],"name":"setStorageNamespace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"supervisionRequired_","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired_","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod_","type":"uint256"}],"name":"setSupervisionConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"supervisionProfileId_","type":"bytes32"}],"name":"setSupervisionProfileId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supplyCap_","type":"uint256"},{"internalType":"uint256","name":"mintingPeriodCap_","type":"uint256"},{"internalType":"uint256","name":"mintingPeriodDuration_","type":"uint256"}],"name":"setSupplyControls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbolDisplay_","type":"string"}],"name":"setSymbolDisplay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storageNamespace","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbolDisplay","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"versionTag","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedTransport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"InvalidAccountNonce(address,uint256)":[{"details":"The nonce used for an `account` is not the expected current nonce."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"EIP712DomainChanged()":{"details":"MAY be emitted to signal that the domain could have changed."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}."},"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"eip712Domain()":{"details":"See {IERC-5267}."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"name()":{"details":"Returns the name of the token."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"title":"CompliantUSDCTokenV2","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Thin cUSDC V2 specialization over the shared compliant fiat token base.","version":1}},"settings":{"compilationTarget":{"contracts/tokens/CompliantUSDCTokenV2.sol":"CompliantUSDCTokenV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Nonces.sol":{"keccak256":"0x0082767004fca261c332e9ad100868327a863a88ef724e844857128845ab350f","license":"MIT","urls":["bzz-raw://132dce9686a54e025eb5ba5d2e48208f847a1ec3e60a3e527766d7bf53fb7f9e","dweb:/ipfs/QmXn1a2nUZMpu2z6S88UoTfMVtY2YNh86iGrzJDYmMkKeZ"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/compliance/LegallyCompliantBaseV2.sol":{"keccak256":"0x8097270ea1c6c78c9d39861536d19d01318a136d425c85d758105de4eeb0049c","license":"MIT","urls":["bzz-raw://4a629636fc02ed9cfd4134274d8a2125e440d0b024793c1ab0d12a96422596d9","dweb:/ipfs/QmdvmzFw21CJzKAL4Cf89dssoSFCPhurNGn1fCDkAS3bBN"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/tokens/CompliantFiatTokenV2.sol":{"keccak256":"0x397d0a74841b3fdafb237597c704ae2e143cf77210ca2890c844935ea6c14995","license":"MIT","urls":["bzz-raw://572326b14b654fcab80768037fff300282cae505aef1bac34e78df358a842f36","dweb:/ipfs/QmNmYsUHEM9ZJbcrPTu2gYpqLwsbKAjtDG74ZX8hfKNp23"]},"contracts/tokens/CompliantUSDCTokenV2.sol":{"keccak256":"0x4a33b87c3ff79aefa43611fe124814d37d031c8e3389cefaaa93223dd4d9e8ec","license":"MIT","urls":["bzz-raw://585e838b8199ea12689eb652a49d35daf171498de610835d6c7fcc558d382716","dweb:/ipfs/QmdHxiyRLUEb8Y8yXWFSF7ZyqTSDKJzYpaJioFudRdJHrY"]},"contracts/tokens/interfaces/ICompliantFiatTokenV2.sol":{"keccak256":"0xe3c7a30c697eb0b1088ac434537edb848e41e7575f2f8c278879d87ace145145","license":"MIT","urls":["bzz-raw://85b112dc21132487dd6a7361d142748005721ae16d7ed2647c0df4630048f55c","dweb:/ipfs/QmNr8eX8kR82ZR388uhAJDKZopn3pLX3YN7pDqELwiWo8w"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQoYiEBCtGKAo28SLKLGn2HnLJm3D2dbt6AXCSecAjCcY/archive-info.json b/verification-sources/chain138-metadata-archive/QmQoYiEBCtGKAo28SLKLGn2HnLJm3D2dbt6AXCSecAjCcY/archive-info.json new file mode 100644 index 0000000..3b6bb8c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQoYiEBCtGKAo28SLKLGn2HnLJm3D2dbt6AXCSecAjCcY/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQoYiEBCtGKAo28SLKLGn2HnLJm3D2dbt6AXCSecAjCcY", + "metadata_digest": "249b461a7e5c85fbd30377cb513d6c9ba2d0a25e445eae382086217a4e4aee59", + "source_path": "contracts/treasury/ReceiverExecutorMainnet.sol", + "contract_name": "ReceiverExecutorMainnet", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQoYiEBCtGKAo28SLKLGn2HnLJm3D2dbt6AXCSecAjCcY/metadata.json b/verification-sources/chain138-metadata-archive/QmQoYiEBCtGKAo28SLKLGn2HnLJm3D2dbt6AXCSecAjCcY/metadata.json new file mode 100644 index 0000000..538b190 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQoYiEBCtGKAo28SLKLGn2HnLJm3D2dbt6AXCSecAjCcY/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InsufficientOutput","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"source","type":"address"}],"name":"ExpectedWeth9SourceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"SwappedToUsdc","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"SwappedToUsdt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unwrapped","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KEEPER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC_MAINNET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT_MAINNET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH9_MAINNET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expectedWeth9Source","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExpectedWeth9Source","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"source","type":"address"}],"name":"setExpectedWeth9Source","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swapWeth9ToUsdc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swapWeth9ToUsdt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"unwrapWeth9","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Only hardcoded WETH9, USDC, USDT. No calldata-provided stablecoin address. WETH9 is expected to be transferred only from the mainnet CCIPWETH9Bridge (the bridge receives from CCIP Router and transfers here). Use setExpectedWeth9Source() to record the bridge address for operator/off-chain checks; no on-chain transfer restriction. See docs/treasury/EXECUTOR_ALLOWLIST_MATRIX.md and EXPORT_STATE_MACHINE.md.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"ReceiverExecutorMainnet","version":1},"userdoc":{"kind":"user","methods":{"expectedWeth9Source()":{"notice":"When set, operator should treat WETH9 as valid only when transferred from this address (e.g. mainnet CCIPWETH9Bridge)."},"getExpectedWeth9Source()":{"notice":"Returns the address from which WETH9 is expected. Zero means not configured."},"setExpectedWeth9Source(address)":{"notice":"Set the address from which WETH9 is expected (e.g. mainnet CCIPWETH9Bridge). For documentation and off-chain checks only; no on-chain transfer restriction."}},"notice":"Receives WETH9 from CCIP (via mainnet CCIPWETH9Bridge transfer). Unwraps to ETH or swaps to canonical USDC/USDT only.","version":1}},"settings":{"compilationTarget":{"contracts/treasury/ReceiverExecutorMainnet.sol":"ReceiverExecutorMainnet"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/treasury/ReceiverExecutorMainnet.sol":{"keccak256":"0x56dba1b0d8515b9bd833f930a75c91c9ea23671caa5a50c84f946a85ea70b982","license":"MIT","urls":["bzz-raw://09dd69caf917c8fef5e8cf82bdcfb426441bd6821fb5188f084ae29489e582eb","dweb:/ipfs/QmWcqeZjKiTTqWB8zrWG3myLn6ugq5TK3TMmM5aPmkupXo"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQqYvRupEVzDocbc5sWAKmzyp2r4XTTuAQcDqbiJTJ6Qt/archive-info.json b/verification-sources/chain138-metadata-archive/QmQqYvRupEVzDocbc5sWAKmzyp2r4XTTuAQcDqbiJTJ6Qt/archive-info.json new file mode 100644 index 0000000..c3cc1f1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQqYvRupEVzDocbc5sWAKmzyp2r4XTTuAQcDqbiJTJ6Qt/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQqYvRupEVzDocbc5sWAKmzyp2r4XTTuAQcDqbiJTJ6Qt", + "metadata_digest": "251eac6031f8176b7a1b19ac74b01343a858b790ff79f7f35fab94a942c94845", + "source_path": "contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol", + "contract_name": "IRouteExecutorAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQqYvRupEVzDocbc5sWAKmzyp2r4XTTuAQcDqbiJTJ6Qt/metadata.json b/verification-sources/chain138-metadata-archive/QmQqYvRupEVzDocbc5sWAKmzyp2r4XTTuAQcDqbiJTJ6Qt/metadata.json new file mode 100644 index 0000000..56e21ce --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQqYvRupEVzDocbc5sWAKmzyp2r4XTTuAQcDqbiJTJ6Qt/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"execute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"}],"name":"validate","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":"IRouteExecutorAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQrqU84DQ8ue9JCNE3wbhpA42izoQS5Y5HgpfJkiPuLTs/archive-info.json b/verification-sources/chain138-metadata-archive/QmQrqU84DQ8ue9JCNE3wbhpA42izoQS5Y5HgpfJkiPuLTs/archive-info.json new file mode 100644 index 0000000..9d30c28 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQrqU84DQ8ue9JCNE3wbhpA42izoQS5Y5HgpfJkiPuLTs/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQrqU84DQ8ue9JCNE3wbhpA42izoQS5Y5HgpfJkiPuLTs", + "metadata_digest": "2572f697326b2bad6855e33ba8f2c55710512b146a4d63edf76c158bfd05ed22", + "source_path": "contracts/tokens/CompliantWrappedToken.sol", + "contract_name": "CompliantWrappedToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQrqU84DQ8ue9JCNE3wbhpA42izoQS5Y5HgpfJkiPuLTs/metadata.json b/verification-sources/chain138-metadata-archive/QmQrqU84DQ8ue9JCNE3wbhpA42izoQS5Y5HgpfJkiPuLTs/metadata.json new file mode 100644 index 0000000..0bf3a8f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQrqU84DQ8ue9JCNE3wbhpA42izoQS5Y5HgpfJkiPuLTs/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address","name":"admin_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"GovernanceControllerNotConfigured","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"GovernanceControllerOnly","type":"error"},{"inputs":[],"name":"OperationalRolesAreFrozen","type":"error"},{"inputs":[],"name":"ZeroGovernanceController","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"}],"name":"CanonicalUnderlyingAssetUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"}],"name":"GovernanceProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"OperationalRolesFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"}],"name":"PrimaryJurisdictionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"approvalId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"actionType","type":"string"},{"indexed":false,"internalType":"bytes32","name":"referenceHash","type":"bytes32"}],"name":"RegulatoryApprovalRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"disclosureURI","type":"string"}],"name":"RegulatoryDisclosureURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reportingURI","type":"string"}],"name":"ReportingURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"storageNamespace","type":"bytes32"}],"name":"StorageNamespaceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"supervisionRequired","type":"bool"},{"indexed":false,"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"indexed":false,"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"}],"name":"SupervisionConfigurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"}],"name":"SupervisionProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"category","type":"string"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"SupervisoryNoticeRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNANCE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JURISDICTION_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPERVISOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetVersionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canonicalUnderlyingAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"disclosureURI_","type":"string"},{"internalType":"string","name":"reportingURI_","type":"string"}],"name":"emergencySetDisclosureMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"governanceProfileId_","type":"bytes32"},{"internalType":"bytes32","name":"supervisionProfileId_","type":"bytes32"},{"internalType":"bytes32","name":"storageNamespace_","type":"bytes32"},{"internalType":"string","name":"jurisdiction_","type":"string"},{"internalType":"address","name":"canonicalUnderlyingAsset_","type":"address"},{"internalType":"bool","name":"supervisionRequired_","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired_","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod_","type":"uint256"}],"name":"emergencySetGovernanceMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeOperationalRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governmentApprovalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumUpgradeNoticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationalRolesFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryJurisdiction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"approvalId","type":"bytes32"},{"internalType":"string","name":"actionType","type":"string"},{"internalType":"bytes32","name":"referenceHash","type":"bytes32"}],"name":"recordRegulatoryApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"noticeId","type":"bytes32"},{"internalType":"string","name":"category","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"name":"recordSupervisoryNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"regulatoryDisclosureURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reportingURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalUnderlyingAsset_","type":"address"}],"name":"setCanonicalUnderlyingAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governanceController_","type":"address"}],"name":"setGovernanceController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"governanceProfileId_","type":"bytes32"}],"name":"setGovernanceProfileId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction_","type":"string"}],"name":"setPrimaryJurisdiction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"disclosureURI_","type":"string"}],"name":"setRegulatoryDisclosureURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"reportingURI_","type":"string"}],"name":"setReportingURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"storageNamespace_","type":"bytes32"}],"name":"setStorageNamespace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"supervisionRequired_","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired_","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod_","type":"uint256"}],"name":"setSupervisionConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"supervisionProfileId_","type":"bytes32"}],"name":"setSupervisionProfileId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storageNamespace","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedTransport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"Only MINTER_ROLE can mint (e.g. CCIP receiver/bridge); BURNER_ROLE can burn (bridge-back). Admin can grant/revoke roles. Used for cW* representation of Chain 138 compliant tokens.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"freezeOperationalRoles()":{"details":"Existing bridge roles keep working; only admin churn is disabled."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"name()":{"details":"Returns the name of the token."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"title":"CompliantWrappedToken","version":1},"userdoc":{"kind":"user","methods":{"burn(address,uint256)":{"notice":"Burn from account (only BURNER_ROLE, e.g. bridge for burn-on-exit)."},"burnFrom(address,uint256)":{"notice":"Burn from account (only BURNER_ROLE). Enables TwoWayTokenBridgeL2 and other bridges that call burnFrom(user, amount) for outbound."},"freezeOperationalRoles()":{"notice":"Permanently freeze future MINTER_ROLE / BURNER_ROLE changes."},"mint(address,uint256)":{"notice":"Mint to account (only MINTER_ROLE, e.g. bridge receiver)."}},"notice":"ERC-20 wrapper for bridged compliant tokens (cWUSDT, cWUSDC, etc.) on public chains.","version":1}},"settings":{"compilationTarget":{"contracts/tokens/CompliantWrappedToken.sol":"CompliantWrappedToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/tokens/CompliantWrappedToken.sol":{"keccak256":"0x370fd87f34d9d2243819657f41c4e43eb9c5273fb251586fe77889cb3f1e71ea","license":"MIT","urls":["bzz-raw://8a636fd70a2194adf2863b2b1f351c7255610edb5102dbf57ee8dd34f432121f","dweb:/ipfs/QmfTJczNL5NrBxNR3xT63hRsXUhuECfiJfqqf43gKiG7Up"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQsCGGuCUZrfNhoiqFGJC8dWrkuh2N5m8og87o4cTPdyH/archive-info.json b/verification-sources/chain138-metadata-archive/QmQsCGGuCUZrfNhoiqFGJC8dWrkuh2N5m8og87o4cTPdyH/archive-info.json new file mode 100644 index 0000000..1b8219c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQsCGGuCUZrfNhoiqFGJC8dWrkuh2N5m8og87o4cTPdyH/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQsCGGuCUZrfNhoiqFGJC8dWrkuh2N5m8og87o4cTPdyH", + "metadata_digest": "258a7a203d2408278db46c61eb3750b5e7d47c027bb1745e55c2476941181b80", + "source_path": "contracts/vault/interfaces/IRegulatedEntityRegistry.sol", + "contract_name": "IRegulatedEntityRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQsCGGuCUZrfNhoiqFGJC8dWrkuh2N5m8og87o4cTPdyH/metadata.json b/verification-sources/chain138-metadata-archive/QmQsCGGuCUZrfNhoiqFGJC8dWrkuh2N5m8og87o4cTPdyH/metadata.json new file mode 100644 index 0000000..f30fc42 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQsCGGuCUZrfNhoiqFGJC8dWrkuh2N5m8og87o4cTPdyH/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"AuthorizedWalletAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"AuthorizedWalletRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"bytes32","name":"jurisdictionHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EntityRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EntitySuspended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EntityUnsuspended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"OperatorSet","type":"event"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"addAuthorizedWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"}],"name":"getEntity","outputs":[{"internalType":"bool","name":"registered","type":"bool"},{"internalType":"bool","name":"suspended","type":"bool"},{"internalType":"bytes32","name":"jurisdictionHash","type":"bytes32"},{"internalType":"address[]","name":"authorizedWallets","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"}],"name":"isEligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"bytes32","name":"jurisdictionHash","type":"bytes32"},{"internalType":"address[]","name":"authorizedWallets","type":"address[]"}],"name":"registerEntity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"removeAuthorizedWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"}],"name":"suspendEntity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"}],"name":"unsuspendEntity","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Tracks regulated financial entities eligible for vault operations","kind":"dev","methods":{"addAuthorizedWallet(address,address)":{"params":{"entity":"Entity address","wallet":"Wallet address to authorize"}},"getEntity(address)":{"params":{"entity":"Entity address"},"returns":{"authorizedWallets":"List of authorized wallets","jurisdictionHash":"Jurisdiction hash","registered":"True if entity is registered","suspended":"True if entity is suspended"}},"isAuthorized(address,address)":{"params":{"entity":"Entity address","wallet":"Wallet address"},"returns":{"_0":"isAuthorized True if wallet is authorized"}},"isEligible(address)":{"params":{"entity":"Entity address"},"returns":{"_0":"isEligible True if entity is registered and not suspended"}},"isOperator(address,address)":{"params":{"entity":"Entity address","operator":"Operator address"},"returns":{"_0":"isOperator True if address is an operator"}},"registerEntity(address,bytes32,address[])":{"params":{"authorizedWallets":"Initial authorized wallets","entity":"Entity address","jurisdictionHash":"Hash of jurisdiction identifier"}},"removeAuthorizedWallet(address,address)":{"params":{"entity":"Entity address","wallet":"Wallet address to remove"}},"setOperator(address,address,bool)":{"params":{"entity":"Entity address","operator":"Operator address","status":"True to grant operator status, false to revoke"}},"suspendEntity(address)":{"params":{"entity":"Entity address"}},"unsuspendEntity(address)":{"params":{"entity":"Entity address"}}},"title":"IRegulatedEntityRegistry","version":1},"userdoc":{"kind":"user","methods":{"addAuthorizedWallet(address,address)":{"notice":"Add authorized wallet to an entity"},"getEntity(address)":{"notice":"Get entity information"},"isAuthorized(address,address)":{"notice":"Check if a wallet is authorized for an entity"},"isEligible(address)":{"notice":"Check if an entity is registered and eligible"},"isOperator(address,address)":{"notice":"Check if an address is an operator for an entity"},"registerEntity(address,bytes32,address[])":{"notice":"Register a regulated entity"},"removeAuthorizedWallet(address,address)":{"notice":"Remove authorized wallet from an entity"},"setOperator(address,address,bool)":{"notice":"Set operator status for an entity"},"suspendEntity(address)":{"notice":"Suspend an entity"},"unsuspendEntity(address)":{"notice":"Unsuspend an entity"}},"notice":"Interface for Regulated Entity Registry","version":1}},"settings":{"compilationTarget":{"contracts/vault/interfaces/IRegulatedEntityRegistry.sol":"IRegulatedEntityRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vault/interfaces/IRegulatedEntityRegistry.sol":{"keccak256":"0xf3ec40774d215299eae68db073b733885023d6f8d1d9a00575c02842a8c54af4","license":"MIT","urls":["bzz-raw://ea06721c4f4ca7f59e3c9e14fc376e3c43d7cd83f544dbdf18c6e182441186b0","dweb:/ipfs/QmRFbfhyDp9UJBepDinYvs7TC6pLbZBgajnZbtPXqmpcWp"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQv6vMazjMRrAnXbjdbeKWMDVVVvzxfHvP52jzDoDrmKQ/archive-info.json b/verification-sources/chain138-metadata-archive/QmQv6vMazjMRrAnXbjdbeKWMDVVVvzxfHvP52jzDoDrmKQ/archive-info.json new file mode 100644 index 0000000..9c4fa75 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQv6vMazjMRrAnXbjdbeKWMDVVVvzxfHvP52jzDoDrmKQ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQv6vMazjMRrAnXbjdbeKWMDVVVvzxfHvP52jzDoDrmKQ", + "metadata_digest": "26492d79e06b3e03db0869ecabe5c26c7b58447855158d81f4bd5cb41768dd03", + "source_path": "contracts/vault/VaultFactory.sol", + "contract_name": "VaultFactory", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQv6vMazjMRrAnXbjdbeKWMDVVVvzxfHvP52jzDoDrmKQ/metadata.json b/verification-sources/chain138-metadata-archive/QmQv6vMazjMRrAnXbjdbeKWMDVVVvzxfHvP52jzDoDrmKQ/metadata.json new file mode 100644 index 0000000..7c3db21 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQv6vMazjMRrAnXbjdbeKWMDVVVvzxfHvP52jzDoDrmKQ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"vaultImplementation_","type":"address"},{"internalType":"address","name":"depositTokenImplementation_","type":"address"},{"internalType":"address","name":"debtTokenImplementation_","type":"address"},{"internalType":"address","name":"ledger_","type":"address"},{"internalType":"address","name":"entityRegistry_","type":"address"},{"internalType":"address","name":"collateralAdapter_","type":"address"},{"internalType":"address","name":"eMoneyJoin_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"depositToken","type":"address"},{"indexed":false,"internalType":"address","name":"debtToken","type":"address"}],"name":"VaultCreated","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_DEPLOYER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralAdapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"currency","type":"address"}],"name":"createVault","outputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"address","name":"debtToken","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint8","name":"depositDecimals","type":"uint8"},{"internalType":"uint8","name":"debtDecimals","type":"uint8"},{"internalType":"bool","name":"debtTransferable","type":"bool"}],"name":"createVaultWithDecimals","outputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"address","name":"debtToken","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"debtTokenImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositTokenImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eMoneyJoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entityRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"}],"name":"getVaultsByEntity","outputs":[{"internalType":"address[]","name":"vaults","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ledger","outputs":[{"internalType":"contract ILedger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultToEntity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaultsByEntity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Creates Vault, DepositToken, and DebtToken instances","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"createVault(address,address,address,address)":{"params":{"asset":"Collateral asset address (for deposit token)","currency":"eMoney currency address (for debt token)","entity":"Regulated entity address","owner":"Vault owner address"},"returns":{"debtToken":"Address of debt token","depositToken":"Address of deposit token","vault":"Address of created vault"}},"createVaultWithDecimals(address,address,address,address,uint8,uint8,bool)":{"params":{"debtDecimals":"Debt token decimals (0 = 18)","debtTransferable":"If true, debt token is freely transferable (DEX-ready)","depositDecimals":"Deposit token decimals (e.g. 6 for stablecoins; 0 = 18)"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getVaultsByEntity(address)":{"params":{"entity":"Entity address"},"returns":{"vaults":"Array of vault addresses"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"VaultFactory","version":1},"userdoc":{"kind":"user","methods":{"createVault(address,address,address,address)":{"notice":"Create a new vault for a regulated entity"},"createVaultWithDecimals(address,address,address,address,uint8,uint8,bool)":{"notice":"Create a vault with explicit decimals and debt transferability (DEX-ready)"},"getVaultsByEntity(address)":{"notice":"Get vaults for an entity"}},"notice":"Factory for creating vault instances with associated tokens","version":1}},"settings":{"compilationTarget":{"contracts/vault/VaultFactory.sol":"VaultFactory"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol":{"keccak256":"0xd518def45c722a6e803e1e26e625db25e01497f672ca566cca585d234ec903b0","license":"MIT","urls":["bzz-raw://6e7de3fccd96783244790cde282435ce0fd3a44ab4ccb10f17005c743202882f","dweb:/ipfs/QmYSepstTqs5UPJvjeJXkWU5R659yReqrSgSGGh65hkbdK"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"keccak256":"0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec","license":"MIT","urls":["bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c","dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/Proxy.sol":{"keccak256":"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd","license":"MIT","urls":["bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac","dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/vault/Vault.sol":{"keccak256":"0x9a064d7713140a036c81c34f4cde7b964eff46e9f9a0ed128b3b30e79216e646","license":"MIT","urls":["bzz-raw://c8077104750c8578014c60914558c21489bb83d84086a127bc31897558f0668b","dweb:/ipfs/Qme5eDJizvYQdBjUKunhsyeTVLycCkSWPQY8g3TPfqKYh6"]},"contracts/vault/VaultFactory.sol":{"keccak256":"0x48f8f2dc1d3460b8b061b34e5f6d9a9f99a05ee94d7a2d8d9966cc2e2372eee4","license":"MIT","urls":["bzz-raw://8f2ccaf6b7756e3885bd50a5545a2d9bdd80af179da1d1022e08d50f519b7828","dweb:/ipfs/QmcR6krjQ3dxbkXwRbsd6KAB7FFoVpTLi86fMRuusNCS64"]},"contracts/vault/interfaces/ICollateralAdapter.sol":{"keccak256":"0x45c2214f58500a3ad92ea1ea2c018bb0e71e1dd441e6c293cfbb88ffa5629efc","license":"MIT","urls":["bzz-raw://92e981007a82373da7f08bd7ec4de0b92126091b73356e641adaaf3d46531a1b","dweb:/ipfs/QmbcB6qSdN9imJEEdQQngBkokhtXNMK5eTUyjccpjyLSVd"]},"contracts/vault/interfaces/ILedger.sol":{"keccak256":"0x3a8e8a2d48458202fffe065e691c1abeae50ccb8fc2af8971af7e94ae23d9273","license":"MIT","urls":["bzz-raw://6214e1b92f519cb100b315b2eb64b61e21479f75ebecd3a2e74524806347a5d4","dweb:/ipfs/QmRzswWJmFPa5BAy2npMN2WwrdmNd8pymySMHo1EdSZXED"]},"contracts/vault/interfaces/IRegulatedEntityRegistry.sol":{"keccak256":"0xf3ec40774d215299eae68db073b733885023d6f8d1d9a00575c02842a8c54af4","license":"MIT","urls":["bzz-raw://ea06721c4f4ca7f59e3c9e14fc376e3c43d7cd83f544dbdf18c6e182441186b0","dweb:/ipfs/QmRFbfhyDp9UJBepDinYvs7TC6pLbZBgajnZbtPXqmpcWp"]},"contracts/vault/interfaces/IVault.sol":{"keccak256":"0x8d8b34ee40744f19fc1c758cd08815b748750059ea87eb89b25b0490c3613c9c","license":"MIT","urls":["bzz-raw://af6f236b0a80f6eb36c4c006df04c5199247c021182c5afb08184503b187a552","dweb:/ipfs/QmSobXGKCjL8WfvKA312zK3dtE7M5DmioKEucN4MP4TZEZ"]},"contracts/vault/interfaces/IeMoneyJoin.sol":{"keccak256":"0x61df69d6ee9f5966c1b3bfb9bdf938506af7895b0afa8543d73588fb6470ca49","license":"MIT","urls":["bzz-raw://063843b2dfc41802c80bb808e1783701273ce23ef773aa08827f3b923d7102d3","dweb:/ipfs/QmXwc26Y1yAgetLapiUGPLCPoxkp3tAHf5cuSfPBC4PPLw"]},"contracts/vault/tokens/DebtToken.sol":{"keccak256":"0xb791a91845fa03b3b69fb92165dd8c716a270920171ff63de7b17489eb4871da","license":"MIT","urls":["bzz-raw://84a630592b68a85070e26195cc5a24ed085078f5bf04d4b2b35037e6295c1e45","dweb:/ipfs/QmTXHxwdnPZKMKNyvgXtKh8AYvqSPKxMBL6eR5KzsJRs1T"]},"contracts/vault/tokens/DepositToken.sol":{"keccak256":"0xa1220a078010b1554f80da8f4883b2c339eca95ef1d20e070c97cccc3ab1723c","license":"MIT","urls":["bzz-raw://5879ab048f39cff3bcef678959740643a43eecb7fe8a864192339f5fe8591f17","dweb:/ipfs/QmRq6Jd25dkF7dt3YLbtvPQosegBEA1xqdU7Sgc1C1Tpep"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQvTk49jaDHeoYfRfZRS5zDLyLtywi9BApRhMynBYbeBb/archive-info.json b/verification-sources/chain138-metadata-archive/QmQvTk49jaDHeoYfRfZRS5zDLyLtywi9BApRhMynBYbeBb/archive-info.json new file mode 100644 index 0000000..0f28417 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQvTk49jaDHeoYfRfZRS5zDLyLtywi9BApRhMynBYbeBb/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQvTk49jaDHeoYfRfZRS5zDLyLtywi9BApRhMynBYbeBb", + "metadata_digest": "2660b8bb420863e82165b2aa1099e0cedc0ae66f1dde548768e4ad550f0be05a", + "source_path": "contracts/bridge/trustless/integration/IISOCurrencyManager.sol", + "contract_name": "IISOCurrencyManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQvTk49jaDHeoYfRfZRS5zDLyLtywi9BApRhMynBYbeBb/metadata.json b/verification-sources/chain138-metadata-archive/QmQvTk49jaDHeoYfRfZRS5zDLyLtywi9BApRhMynBYbeBb/metadata.json new file mode 100644 index 0000000..173bdce --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQvTk49jaDHeoYfRfZRS5zDLyLtywi9BApRhMynBYbeBb/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"fromCurrency","type":"string"},{"internalType":"string","name":"toCurrency","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"convertViaXAU","outputs":[{"internalType":"uint256","name":"targetAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllSupportedCurrencies","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getCurrencyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fromCurrency","type":"string"},{"internalType":"string","name":"toCurrency","type":"string"}],"name":"getCurrencyRate","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"xauRate","type":"uint256"}],"name":"registerCurrency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"IISOCurrencyManager","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Interface for ISO-4217 Currency Manager","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/integration/IISOCurrencyManager.sol":"IISOCurrencyManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/integration/IISOCurrencyManager.sol":{"keccak256":"0x86621efe39480253f7b4036ab06c9e2b5beb6e4232a837e9935148c2f4ff484b","license":"MIT","urls":["bzz-raw://95a7d0837173661744d191570b1b27dd3351f1b8e74d446a80aed044e1e37391","dweb:/ipfs/QmcXXu9chU9Ame3gC215y3QSAd3ujX1XEJ7pof8A5dRQ1G"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmQwxgMWUUEqZnHvVzpeFNQzvBgRbt6VLRe2W8obqKPPwv/archive-info.json b/verification-sources/chain138-metadata-archive/QmQwxgMWUUEqZnHvVzpeFNQzvBgRbt6VLRe2W8obqKPPwv/archive-info.json new file mode 100644 index 0000000..4caf982 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQwxgMWUUEqZnHvVzpeFNQzvBgRbt6VLRe2W8obqKPPwv/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmQwxgMWUUEqZnHvVzpeFNQzvBgRbt6VLRe2W8obqKPPwv", + "metadata_digest": "26c3054afedda952e887b22a8c4251a09e993777e3d0359067145792a6382299", + "source_path": "contracts/flash/DODOIntegrationExternalUnwinder.sol", + "contract_name": "DODOIntegrationExternalUnwinder", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmQwxgMWUUEqZnHvVzpeFNQzvBgRbt6VLRe2W8obqKPPwv/metadata.json b/verification-sources/chain138-metadata-archive/QmQwxgMWUUEqZnHvVzpeFNQzvBgRbt6VLRe2W8obqKPPwv/metadata.json new file mode 100644 index 0000000..972f518 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmQwxgMWUUEqZnHvVzpeFNQzvBgRbt6VLRe2W8obqKPPwv/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"integration_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadParams","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"integration","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unwind","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"`data` must be `abi.encode(address pool)` selecting the registered pool to use.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"DODOIntegrationExternalUnwinder","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Unwinds base -> quote through a DODO PMM integration.","version":1}},"settings":{"compilationTarget":{"contracts/flash/DODOIntegrationExternalUnwinder.sol":"DODOIntegrationExternalUnwinder"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/flash/DODOIntegrationExternalUnwinder.sol":{"keccak256":"0xd4ee730fafea99efa29420827321aea736a4ae8079786addc533dd43f6266ecb","license":"MIT","urls":["bzz-raw://1be16bf01fa8e3af5a396aa71d560727a904f910b1c94f7e57ef702f3d452e9c","dweb:/ipfs/QmZDuSEyY8LoyB4EV5orLfY9Dhy5kAWCMr9w2bUYNXFZ1Y"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmR1YyVhLVk9CjRLrbSb936FzUm4DKDAD3RBdsCxHnUdam/archive-info.json b/verification-sources/chain138-metadata-archive/QmR1YyVhLVk9CjRLrbSb936FzUm4DKDAD3RBdsCxHnUdam/archive-info.json new file mode 100644 index 0000000..c10969a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmR1YyVhLVk9CjRLrbSb936FzUm4DKDAD3RBdsCxHnUdam/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmR1YyVhLVk9CjRLrbSb936FzUm4DKDAD3RBdsCxHnUdam", + "metadata_digest": "27ae8a8b744ccb9d66ac115a56be318bb7f7a96a0c6a47c6d144045eec3435fe", + "source_path": "contracts/vault/interfaces/ILedger.sol", + "contract_name": "ILedger", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmR1YyVhLVk9CjRLrbSb936FzUm4DKDAD3RBdsCxHnUdam/metadata.json b/verification-sources/chain138-metadata-archive/QmR1YyVhLVk9CjRLrbSb936FzUm4DKDAD3RBdsCxHnUdam/metadata.json new file mode 100644 index 0000000..3304e72 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmR1YyVhLVk9CjRLrbSb936FzUm4DKDAD3RBdsCxHnUdam/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"int256","name":"delta","type":"int256"}],"name":"CollateralModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"int256","name":"delta","type":"int256"}],"name":"DebtModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"debtCeiling","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidationRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creditMultiplier","type":"uint256"}],"name":"RiskParametersSet","type":"event"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"canBorrow","outputs":[{"internalType":"bool","name":"canBorrow","type":"bool"},{"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"asset","type":"address"}],"name":"collateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"creditMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"currency","type":"address"}],"name":"debt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"debtCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"getVaultHealth","outputs":[{"internalType":"uint256","name":"healthRatio","type":"uint256"},{"internalType":"uint256","name":"collateralValue","type":"uint256"},{"internalType":"uint256","name":"debtValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"grantVaultRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"liquidationRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"int256","name":"delta","type":"int256"}],"name":"modifyCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"int256","name":"delta","type":"int256"}],"name":"modifyDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"rateAccumulator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"debtCeiling_","type":"uint256"},{"internalType":"uint256","name":"liquidationRatio_","type":"uint256"},{"internalType":"uint256","name":"creditMultiplier_","type":"uint256"}],"name":"setRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Single source of truth for collateral and debt balances","kind":"dev","methods":{"canBorrow(address,address,uint256)":{"params":{"amount":"Amount to borrow (in currency units)","currency":"Debt currency address","vault":"Vault address"},"returns":{"canBorrow":"True if borrow is allowed","reasonCode":"Reason code if borrow is not allowed"}},"collateral(address,address)":{"params":{"asset":"Collateral asset address","vault":"Vault address"},"returns":{"_0":"balance Collateral balance"}},"creditMultiplier(address)":{"params":{"asset":"Asset address"},"returns":{"_0":"multiplier Credit multiplier in basis points (50000 = 5x)"}},"debt(address,address)":{"params":{"currency":"Debt currency address","vault":"Vault address"},"returns":{"_0":"balance Debt balance"}},"debtCeiling(address)":{"params":{"asset":"Asset address"},"returns":{"_0":"ceiling Debt ceiling"}},"getVaultHealth(address)":{"params":{"vault":"Vault address"},"returns":{"collateralValue":"Total collateral value in XAU (18 decimals)","debtValue":"Total debt value in XAU (18 decimals)","healthRatio":"Collateralization ratio in basis points (10000 = 100%)"}},"grantVaultRole(address)":{"params":{"account":"Address to grant role to"}},"liquidationRatio(address)":{"params":{"asset":"Asset address"},"returns":{"_0":"ratio Liquidation ratio in basis points"}},"modifyCollateral(address,address,int256)":{"params":{"asset":"Collateral asset address","delta":"Amount to add (positive) or subtract (negative)","vault":"Vault address"}},"modifyDebt(address,address,int256)":{"params":{"currency":"Debt currency address (eMoney token)","delta":"Amount to add (positive) or subtract (negative)","vault":"Vault address"}},"rateAccumulator(address)":{"params":{"asset":"Asset address"},"returns":{"_0":"accumulator Rate accumulator"}},"setRiskParameters(address,uint256,uint256,uint256)":{"params":{"asset":"Asset address","creditMultiplier_":"Credit multiplier in basis points","debtCeiling_":"Debt ceiling","liquidationRatio_":"Liquidation ratio in basis points"}}},"title":"ILedger","version":1},"userdoc":{"kind":"user","methods":{"canBorrow(address,address,uint256)":{"notice":"Check if a vault can borrow a specific amount"},"collateral(address,address)":{"notice":"Get collateral balance for a vault"},"creditMultiplier(address)":{"notice":"Get credit multiplier for an asset"},"debt(address,address)":{"notice":"Get debt balance for a vault"},"debtCeiling(address)":{"notice":"Get debt ceiling for an asset"},"getVaultHealth(address)":{"notice":"Get vault health (collateralization ratio in XAU)"},"grantVaultRole(address)":{"notice":"Grant VAULT_ROLE to an address (for factory use)"},"liquidationRatio(address)":{"notice":"Get liquidation ratio for an asset"},"modifyCollateral(address,address,int256)":{"notice":"Modify collateral balance for a vault"},"modifyDebt(address,address,int256)":{"notice":"Modify debt balance for a vault"},"rateAccumulator(address)":{"notice":"Get rate accumulator for an asset"},"setRiskParameters(address,uint256,uint256,uint256)":{"notice":"Set risk parameters for an asset"}},"notice":"Interface for the Core Ledger contract","version":1}},"settings":{"compilationTarget":{"contracts/vault/interfaces/ILedger.sol":"ILedger"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vault/interfaces/ILedger.sol":{"keccak256":"0x3a8e8a2d48458202fffe065e691c1abeae50ccb8fc2af8971af7e94ae23d9273","license":"MIT","urls":["bzz-raw://6214e1b92f519cb100b315b2eb64b61e21479f75ebecd3a2e74524806347a5d4","dweb:/ipfs/QmRzswWJmFPa5BAy2npMN2WwrdmNd8pymySMHo1EdSZXED"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmR2Ux4FPtezzesUiTeN7HyTKiVcemBSNuz48L9YNNqHHT/archive-info.json b/verification-sources/chain138-metadata-archive/QmR2Ux4FPtezzesUiTeN7HyTKiVcemBSNuz48L9YNNqHHT/archive-info.json new file mode 100644 index 0000000..3e6db31 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmR2Ux4FPtezzesUiTeN7HyTKiVcemBSNuz48L9YNNqHHT/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmR2Ux4FPtezzesUiTeN7HyTKiVcemBSNuz48L9YNNqHHT", + "metadata_digest": "27eb9236068f49c4742c06c64bd4ef779c0921258f5a26c6b0bdc6ad504208aa", + "source_path": "contracts/reserve/ReserveSystem.sol", + "contract_name": "ReserveSystem", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmR2Ux4FPtezzesUiTeN7HyTKiVcemBSNuz48L9YNNqHHT/metadata.json b/verification-sources/chain138-metadata-archive/QmR2Ux4FPtezzesUiTeN7HyTKiVcemBSNuz48L9YNNqHHT/metadata.json new file mode 100644 index 0000000..8d87b1e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmR2Ux4FPtezzesUiTeN7HyTKiVcemBSNuz48L9YNNqHHT/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceAsset","type":"address"},{"indexed":true,"internalType":"address","name":"targetAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"sourceAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"targetAmount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"conversionId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"}],"name":"ConversionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PriceFeedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"bytes32","name":"redemptionId","type":"bytes32"}],"name":"RedemptionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"bytes32","name":"reserveId","type":"bytes32"}],"name":"ReserveDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"bytes32","name":"reserveId","type":"bytes32"}],"name":"ReserveWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"BASE_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONVERSION_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LARGE_TRANSACTION_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LARGE_TRANSACTION_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SLIPPAGE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_FEED_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_STALENESS_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLIPPAGE_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"bool","name":"isLiquid","type":"bool"}],"name":"addSupportedAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sourceAsset","type":"address"},{"internalType":"address","name":"targetAsset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateConversion","outputs":[{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"conversionIds","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"conversions","outputs":[{"internalType":"address","name":"sourceAsset","type":"address"},{"internalType":"address","name":"targetAsset","type":"address"},{"internalType":"uint256","name":"sourceAmount","type":"uint256"},{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sourceAsset","type":"address"},{"internalType":"address","name":"targetAsset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"convertAssets","outputs":[{"internalType":"bytes32","name":"conversionId","type":"bytes32"},{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositReserve","outputs":[{"internalType":"bytes32","name":"reserveId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sourceAsset","type":"address"},{"internalType":"address","name":"targetAsset","type":"address"}],"name":"getConversionPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getReserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reserveId","type":"bytes32"}],"name":"getReserveById","outputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportedAssets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSupportedAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"priceFeeds","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"isValid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"redeem","outputs":[{"internalType":"bytes32","name":"redemptionId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"removeSupportedAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveIds","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"reserves","outputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedAssets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"updatePriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawReserve","outputs":[{"internalType":"bytes32","name":"reserveId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Manages reserves in multiple asset classes (XAU, digital assets, sovereign instruments) Implements XAU triangulation conversion algorithm and redemption mechanisms","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"calculateConversion(address,address,uint256)":{"params":{"amount":"Amount to convert","sourceAsset":"Address of the source asset","targetAsset":"Address of the target asset"},"returns":{"fees":"Expected fees","path":"Optimal conversion path","targetAmount":"Expected amount after conversion"}},"convertAssets(address,address,uint256)":{"params":{"amount":"Amount to convert","sourceAsset":"Address of the source asset","targetAsset":"Address of the target asset"},"returns":{"conversionId":"Unique identifier for this conversion","fees":"Total fees charged","targetAmount":"Amount received after conversion"}},"depositReserve(address,uint256)":{"params":{"amount":"Amount to deposit","asset":"Address of the asset to deposit"},"returns":{"reserveId":"Unique identifier for this reserve deposit"}},"getConversionPrice(address,address)":{"params":{"sourceAsset":"Address of the source asset","targetAsset":"Address of the target asset"},"returns":{"_0":"Conversion price (target per source)"}},"getPrice(address)":{"params":{"asset":"Address of the asset"},"returns":{"price":"Current price","timestamp":"Price timestamp"}},"getReserveBalance(address)":{"params":{"asset":"Address of the asset"},"returns":{"_0":"Total reserve balance"}},"getReserveById(bytes32)":{"params":{"reserveId":"Unique identifier for the reserve"},"returns":{"asset":"Address of the asset","balance":"Reserve balance"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"redeem(address,uint256,address)":{"params":{"amount":"Amount to redeem","asset":"Address of the asset to redeem","recipient":"Address to receive the redeemed assets"},"returns":{"redemptionId":"Unique identifier for this redemption"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"updatePriceFeed(address,uint256,uint256)":{"params":{"asset":"Address of the asset","price":"Current price","timestamp":"Price timestamp"}},"withdrawReserve(address,uint256,address)":{"params":{"amount":"Amount to withdraw","asset":"Address of the asset to withdraw","recipient":"Address to receive the withdrawn assets"},"returns":{"reserveId":"Unique identifier for this reserve withdrawal"}}},"title":"ReserveSystem","version":1},"userdoc":{"kind":"user","methods":{"calculateConversion(address,address,uint256)":{"notice":"Calculate conversion amount without executing"},"convertAssets(address,address,uint256)":{"notice":"Convert assets using optimal path (XAU triangulation)"},"depositReserve(address,uint256)":{"notice":"Deposit assets into the reserve system"},"getConversionPrice(address,address)":{"notice":"Get price for conversion between two assets"},"getPrice(address)":{"notice":"Get current price for an asset"},"getReserveBalance(address)":{"notice":"Get the total reserve balance for an asset"},"getReserveById(bytes32)":{"notice":"Get reserve balance for a specific reserve ID"},"redeem(address,uint256,address)":{"notice":"Redeem assets from the reserve system"},"updatePriceFeed(address,uint256,uint256)":{"notice":"Update price feed for an asset"},"withdrawReserve(address,uint256,address)":{"notice":"Withdraw assets from the reserve system"}},"notice":"Core implementation of the GRU Reserve System","version":1}},"settings":{"compilationTarget":{"contracts/reserve/ReserveSystem.sol":"ReserveSystem"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]},"contracts/reserve/ReserveSystem.sol":{"keccak256":"0x8c1097ecb83e0bdae75ec887fe02586d6cf230c7e98d92c3cbb8dacf8bb5fc9c","license":"MIT","urls":["bzz-raw://6bfe50705fb0679460f27ce5c48c88bfc7bb163acab713c84eda0b651261300a","dweb:/ipfs/QmZwrmRJGJXKswxpdSjEfLVdrKbQhVHvoayM7oTJBu5Gpx"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmR59Xxw49rusFDbE42cgivCdEQzCpgULUdAPCageSyGGP/archive-info.json b/verification-sources/chain138-metadata-archive/QmR59Xxw49rusFDbE42cgivCdEQzCpgULUdAPCageSyGGP/archive-info.json new file mode 100644 index 0000000..33d6678 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmR59Xxw49rusFDbE42cgivCdEQzCpgULUdAPCageSyGGP/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmR59Xxw49rusFDbE42cgivCdEQzCpgULUdAPCageSyGGP", + "metadata_digest": "289a5c4bc8a34ee9e124b4fc22ca38420f70d09b086cfe2ee5a5d10cf2bb9148", + "source_path": "contracts/bridge/integration/WTokenBridgeIntegration.sol", + "contract_name": "WTokenBridgeIntegration", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmR59Xxw49rusFDbE42cgivCdEQzCpgULUdAPCageSyGGP/metadata.json b/verification-sources/chain138-metadata-archive/QmR59Xxw49rusFDbE42cgivCdEQzCpgULUdAPCageSyGGP/metadata.json new file mode 100644 index 0000000..fd412b5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmR59Xxw49rusFDbE42cgivCdEQzCpgULUdAPCageSyGGP/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"tokenFactory_","type":"address"},{"internalType":"address","name":"bridgeRegistry_","type":"address"},{"internalType":"address","name":"wTokenRegistry_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"uint256[]","name":"destinationChainIds","type":"uint256[]"}],"name":"WTokenRegistered","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INTEGRATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeRegistry","outputs":[{"internalType":"contract BridgeRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultBridgeFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"defaultEvmDestinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMaxBridgeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMinBridgeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"defaultNonEvmDestinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultRiskLevel","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"currencyCodes","type":"string[]"}],"name":"registerMultipleWTokensDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"uint256[]","name":"destinationChainIds","type":"uint256[]"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint8","name":"riskLevel","type":"uint8"},{"internalType":"uint256","name":"bridgeFeeBps","type":"uint256"}],"name":"registerWToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"registerWTokenDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeBps","type":"uint256"}],"name":"setDefaultBridgeFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"chainIds","type":"uint256[]"}],"name":"setDefaultEvmDestinations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"setDefaultMaxBridgeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"setDefaultMinBridgeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"chainIds","type":"uint256[]"}],"name":"setDefaultNonEvmDestinations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"riskLevel","type":"uint8"}],"name":"setDefaultRiskLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenFactory","outputs":[{"internalType":"contract TokenFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wTokenRegistry","outputs":[{"internalType":"contract ITokenRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Extends TokenFactory to auto-register W tokens on creation","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"registerMultipleWTokensDefault(string[])":{"params":{"currencyCodes":"Array of ISO-4217 currency codes"}},"registerWToken(string,uint256[],uint256,uint256,uint8,uint256)":{"params":{"bridgeFeeBps":"Bridge fee in basis points","currencyCode":"ISO-4217 currency code (e.g., \"USD\")","destinationChainIds":"Array of allowed destination chain IDs","maxAmount":"Maximum bridge amount (in token decimals)","minAmount":"Minimum bridge amount (in token decimals)","riskLevel":"Risk level (0-255)"}},"registerWTokenDefault(string)":{"params":{"currencyCode":"ISO-4217 currency code"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"WTokenBridgeIntegration","version":1},"userdoc":{"kind":"user","methods":{"registerMultipleWTokensDefault(string[])":{"notice":"Register multiple W tokens with default configuration"},"registerWToken(string,uint256[],uint256,uint256,uint8,uint256)":{"notice":"Register a W token with bridge registry"},"registerWTokenDefault(string)":{"notice":"Register a W token with default configuration"},"setDefaultMinBridgeAmount(uint256)":{"notice":"Set default bridge configuration"}},"notice":"Automatically registers ISO-4217 W tokens with BridgeRegistry","version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/WTokenBridgeIntegration.sol":"WTokenBridgeIntegration"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol":{"keccak256":"0xd518def45c722a6e803e1e26e625db25e01497f672ca566cca585d234ec903b0","license":"MIT","urls":["bzz-raw://6e7de3fccd96783244790cde282435ce0fd3a44ab4ccb10f17005c743202882f","dweb:/ipfs/QmYSepstTqs5UPJvjeJXkWU5R659yReqrSgSGGh65hkbdK"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"keccak256":"0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec","license":"MIT","urls":["bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c","dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/Proxy.sol":{"keccak256":"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd","license":"MIT","urls":["bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac","dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/WTokenBridgeIntegration.sol":{"keccak256":"0x14e6d1a7f949620a038989ec5c9188a37e93ba93be19d52d826c850a76ceb487","license":"MIT","urls":["bzz-raw://498d8d42964f17f92a9725f58c27d3dfc3a4b42bd646bf9177e9a45bc0afc324","dweb:/ipfs/QmcXogSrzahEVhbaiR5keyCozhLCwPay9TFfWNH41Wgd9t"]},"contracts/bridge/interop/BridgeRegistry.sol":{"keccak256":"0x7e813c5d8f9762804a35c98244f09831f1ad6ea6df8f2b562c2d031cb246bbc3","license":"MIT","urls":["bzz-raw://e1bba0b26d12b384a26b0e8c09a7c4279a309c24783f501ba4c6bcaa79f6eb7f","dweb:/ipfs/QmRkuvkgurzKtMKAe4oiKc45G3JJ4vwXfM6jPb7PHS49Ts"]},"contracts/iso4217w/ISO4217WToken.sol":{"keccak256":"0x8cbf914cdd061fe24d3d1d7225c658a46a2457c432b0a31f2dce51ccadf0ea4e","license":"MIT","urls":["bzz-raw://149d904a440d679b115eb457dc296373e608091b90d39f9c6d790a18042c9cae","dweb:/ipfs/QmbAEiBVExtF5J1onA65om6pLgfBfDPrgsv5euLjkNyQh2"]},"contracts/iso4217w/TokenFactory.sol":{"keccak256":"0x2615c3c2987dc4251b6e6f2d04fbf0baa39d5c8f6053c36206741ec5cb6d732c","license":"MIT","urls":["bzz-raw://faa37bb0867671a115f51ba73a611fb8d458573445194f95b815fa1c51b70664","dweb:/ipfs/QmaXqiNitpRBeHizAwGsYsFf3zZvTT6pScjKQzTuNJZJWL"]},"contracts/iso4217w/interfaces/IComplianceGuard.sol":{"keccak256":"0x2f812514f56778c271667c97288de5d8c8b4c3745491a4e787abf4ff02dc74a6","license":"MIT","urls":["bzz-raw://97e6607a8262c270d90c9497df31259e7bb616e2e4d934a1c26c556b5e7e0f9e","dweb:/ipfs/Qmcsy2CjBZVh88yktxpRKawK1xrjMCQMqosPr78HxQWFzZ"]},"contracts/iso4217w/interfaces/IISO4217WToken.sol":{"keccak256":"0xd583b83e8598f54e2f3cc5e8bf954441fa73e959a0b816522eb66528b248d412","license":"MIT","urls":["bzz-raw://103a3010d1805dc5e1bbda03ce9338e03aa0ca36a914677cd45ece3ec8868ae3","dweb:/ipfs/QmQDnC1kxKbtedmyjMN4W8oonbGQ4y6LARWWqn7jK4V8W9"]},"contracts/iso4217w/interfaces/ITokenRegistry.sol":{"keccak256":"0x819a713049356cfd7a265358d9c16813dc6e2bbac73b8ed6ff6e594250333464","license":"MIT","urls":["bzz-raw://b6010875dce14843a813a5f9a3437a140a8b84196af364672731b470729ac108","dweb:/ipfs/QmVUkBiHpgf4gWpAHayZ474My6C74T9eZvpqW9rs5MyuAn"]},"contracts/iso4217w/libraries/ISO4217WCompliance.sol":{"keccak256":"0xdfef8ded2a1d1fd8303a05b6846270a0bb882386c2da513260cc19a20c7a8b68","license":"MIT","urls":["bzz-raw://e1107bd7d443a2ef6995fbaceab0e4d06b6c36e72cf5f1b08e9fc64f8a4dc256","dweb:/ipfs/QmNter36BUWZnPHsLZWbQTeDdMiVKQNxWoBHLDoQ74B8JA"]},"contracts/iso4217w/registry/TokenRegistry.sol":{"keccak256":"0x7106cc45496bba1372e271173d4dcde8d0662dbc2bda53f749e42895c3a99cb3","license":"MIT","urls":["bzz-raw://430950484cf5904a964802a595e487293f9d14381d0ff6c59cdede778af3c52c","dweb:/ipfs/QmaacTge822r82LvwN8nXNtK7FuS8pEwJswZNXwZmFqKuL"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmR6wX9VRRYM1RYisVq9StakdigdxbgLvWtTzwjuVSsXnx/archive-info.json b/verification-sources/chain138-metadata-archive/QmR6wX9VRRYM1RYisVq9StakdigdxbgLvWtTzwjuVSsXnx/archive-info.json new file mode 100644 index 0000000..542e460 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmR6wX9VRRYM1RYisVq9StakdigdxbgLvWtTzwjuVSsXnx/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmR6wX9VRRYM1RYisVq9StakdigdxbgLvWtTzwjuVSsXnx", + "metadata_digest": "290ff0110c3ff6ba997d2f0d171dc0fe75ee6b15d40a9263c3907c3945e4e281", + "source_path": "contracts/bridge/trustless/interfaces/ICurvePool.sol", + "contract_name": "ICurvePool", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmR6wX9VRRYM1RYisVq9StakdigdxbgLvWtTzwjuVSsXnx/metadata.json b/verification-sources/chain138-metadata-archive/QmR6wX9VRRYM1RYisVq9StakdigdxbgLvWtTzwjuVSsXnx/metadata.json new file mode 100644 index 0000000..0680581 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmR6wX9VRRYM1RYisVq9StakdigdxbgLvWtTzwjuVSsXnx/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"coins","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int128","name":"i","type":"int128"},{"internalType":"int128","name":"j","type":"int128"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"min_dy","type":"uint256"}],"name":"exchange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"int128","name":"i","type":"int128"},{"internalType":"int128","name":"j","type":"int128"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"min_dy","type":"uint256"}],"name":"exchange_underlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"int128","name":"i","type":"int128"},{"internalType":"int128","name":"j","type":"int128"},{"internalType":"uint256","name":"dx","type":"uint256"}],"name":"get_dy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Based on Curve StableSwap pools","kind":"dev","methods":{},"title":"ICurvePool - Curve Pool Interface","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Minimal interface for Curve stable pools (e.g., 3pool)","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/interfaces/ICurvePool.sol":"ICurvePool"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmR73gcAzvatCgrqpF3XpKUgnhz9V8L9R3TcTf4M9S8HEc/archive-info.json b/verification-sources/chain138-metadata-archive/QmR73gcAzvatCgrqpF3XpKUgnhz9V8L9R3TcTf4M9S8HEc/archive-info.json new file mode 100644 index 0000000..a46dcf7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmR73gcAzvatCgrqpF3XpKUgnhz9V8L9R3TcTf4M9S8HEc/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmR73gcAzvatCgrqpF3XpKUgnhz9V8L9R3TcTf4M9S8HEc", + "metadata_digest": "2916e80a1b40ef2b7fc51f2be1b0929f959ff93326ed880727d1171099c4a27d", + "source_path": "contracts/flash/QuotePushFlashWorkflowBorrower.sol", + "contract_name": "QuotePushFlashWorkflowBorrower", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmR73gcAzvatCgrqpF3XpKUgnhz9V8L9R3TcTf4M9S8HEc/metadata.json b/verification-sources/chain138-metadata-archive/QmR73gcAzvatCgrqpF3XpKUgnhz9V8L9R3TcTf4M9S8HEc/metadata.json new file mode 100644 index 0000000..8e683b5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmR73gcAzvatCgrqpF3XpKUgnhz9V8L9R3TcTf4M9S8HEc/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"trustedLender_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadParams","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientToRepay","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UntrustedLender","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"borrowedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unwindOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"surplus","type":"uint256"}],"name":"QuotePushExecuted","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onFlashLoan","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedLender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"`data` must be `abi.encode(QuotePushParams)`. The caller is responsible for choosing trusted integrations, setting conservative minimums, and sweeping any retained surplus from this contract after execution.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"QuotePushFlashWorkflowBorrower","version":1},"userdoc":{"kind":"user","methods":{},"notice":"ERC-3156 borrower for a quote-push loop: flash `quoteToken` -> buy `baseToken` from a DODO-style PMM -> unwind externally back into `quoteToken` -> repay `amount + fee`, leaving any quote surplus on this contract.","version":1}},"settings":{"compilationTarget":{"contracts/flash/QuotePushFlashWorkflowBorrower.sol":"QuotePushFlashWorkflowBorrower"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":{"keccak256":"0x9f9e6dba43fe0775c400aa384375f1f503efaf733a40187169fdfc195f5ea6fa","license":"MIT","urls":["bzz-raw://ff5fe5fac5e4ecbf9fcd34c42b6d58d1af150263dfe07bc6785a59329dd1e475","dweb:/ipfs/QmX1EhNKKL6n6RFrLLAYh6Uf3itkozjSHyGFs9DqwW4Rzy"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/flash/QuotePushFlashWorkflowBorrower.sol":{"keccak256":"0xcd8b38f86477005ca9b889945493c4d35137c97f8c29cd10bfa2bee3b02861e2","license":"MIT","urls":["bzz-raw://e1ecc34f9b0ae9abc3cd59c9801edc3a80d7ec1219f2675d2f9c16460831bf02","dweb:/ipfs/QmZGq4BvB96XsfHXrmQPWNyp6q6Pjumsb68Rqrh5K5Gp2x"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRA5ZXGrxQnvxcur9gUBULNg6r68wPtoFaKf5rRJpTt1H/archive-info.json b/verification-sources/chain138-metadata-archive/QmRA5ZXGrxQnvxcur9gUBULNg6r68wPtoFaKf5rRJpTt1H/archive-info.json new file mode 100644 index 0000000..bdebfc6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRA5ZXGrxQnvxcur9gUBULNg6r68wPtoFaKf5rRJpTt1H/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRA5ZXGrxQnvxcur9gUBULNg6r68wPtoFaKf5rRJpTt1H", + "metadata_digest": "29ddc5aa2adf75ba182be0549c112763aa6cdd42debe021ee958e85edd60445c", + "source_path": "contracts/iso4217w/libraries/ISO4217WCompliance.sol", + "contract_name": "ISO4217WCompliance", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRA5ZXGrxQnvxcur9gUBULNg6r68wPtoFaKf5rRJpTt1H/metadata.json b/verification-sources/chain138-metadata-archive/QmRA5ZXGrxQnvxcur9gUBULNg6r68wPtoFaKf5rRJpTt1H/metadata.json new file mode 100644 index 0000000..b1a7b57 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRA5ZXGrxQnvxcur9gUBULNg6r68wPtoFaKf5rRJpTt1H/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MONEY_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Enforces hard constraints: m=1.0, GRU isolation, reserve constraints MANDATORY CONSTRAINTS: - Classification: M1 eMoney (NOT legal tender, NOT synthetic, NOT commodity-backed) - Money Multiplier: m = 1.0 (hard-fixed, no fractional reserve) - Backing: 1:1 with fiat currency in segregated custodial accounts - GRU Isolation: Direct or indirect GRU conversion prohibited","kind":"dev","methods":{},"stateVariables":{"MONEY_MULTIPLIER":{"details":"MANDATORY: m = 1.0 (no fractional reserve)"}},"title":"ISO4217WCompliance","version":1},"userdoc":{"kind":"user","methods":{"MONEY_MULTIPLIER()":{"notice":"Money multiplier constant (hard-fixed at 1.0)"}},"notice":"Compliance library for ISO-4217 W tokens","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/libraries/ISO4217WCompliance.sol":"ISO4217WCompliance"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/iso4217w/libraries/ISO4217WCompliance.sol":{"keccak256":"0xdfef8ded2a1d1fd8303a05b6846270a0bb882386c2da513260cc19a20c7a8b68","license":"MIT","urls":["bzz-raw://e1107bd7d443a2ef6995fbaceab0e4d06b6c36e72cf5f1b08e9fc64f8a4dc256","dweb:/ipfs/QmNter36BUWZnPHsLZWbQTeDdMiVKQNxWoBHLDoQ74B8JA"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRA8hiwA2hy5x8GcV1nP3XhHndYSaK7D6SatNt3Td7PcL/archive-info.json b/verification-sources/chain138-metadata-archive/QmRA8hiwA2hy5x8GcV1nP3XhHndYSaK7D6SatNt3Td7PcL/archive-info.json new file mode 100644 index 0000000..5f272dd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRA8hiwA2hy5x8GcV1nP3XhHndYSaK7D6SatNt3Td7PcL/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRA8hiwA2hy5x8GcV1nP3XhHndYSaK7D6SatNt3Td7PcL", + "metadata_digest": "29e152f9543fb2f449f097cca81a0b115e5285574c10113255f897a98abbf189", + "source_path": "contracts/bridge/integration/eMoneyBridgeIntegration.sol", + "contract_name": "eMoneyBridgeIntegration", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRA8hiwA2hy5x8GcV1nP3XhHndYSaK7D6SatNt3Td7PcL/metadata.json b/verification-sources/chain138-metadata-archive/QmRA8hiwA2hy5x8GcV1nP3XhHndYSaK7D6SatNt3Td7PcL/metadata.json new file mode 100644 index 0000000..21a3c5c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRA8hiwA2hy5x8GcV1nP3XhHndYSaK7D6SatNt3Td7PcL/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"bridgeRegistry_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"uint256[]","name":"destinationChainIds","type":"uint256[]"}],"name":"eMoneyTokenRegistered","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INTEGRATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeRegistry","outputs":[{"internalType":"contract BridgeRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultBridgeFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"defaultDestinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMaxBridgeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMinBridgeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultRiskLevel","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultDestinations","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"uint256[]","name":"destinationChainIds","type":"uint256[]"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint8","name":"riskLevel","type":"uint8"},{"internalType":"uint256","name":"bridgeFeeBps","type":"uint256"}],"name":"registereMoneyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"currencyCode","type":"string"}],"name":"registereMoneyTokenDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeBps","type":"uint256"}],"name":"setDefaultBridgeFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"chainIds","type":"uint256[]"}],"name":"setDefaultDestinations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"setDefaultMaxBridgeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"setDefaultMinBridgeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"riskLevel","type":"uint8"}],"name":"setDefaultRiskLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Extends eMoney token system to auto-register tokens with bridge","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"registereMoneyToken(address,string,uint256[],uint256,uint256,uint8,uint256)":{"params":{"bridgeFeeBps":"Bridge fee in basis points","currencyCode":"Currency code (for tracking)","destinationChainIds":"Array of allowed destination chain IDs","maxAmount":"Maximum bridge amount","minAmount":"Minimum bridge amount","riskLevel":"Risk level (0-255)","token":"eMoney token address"}},"registereMoneyTokenDefault(address,string)":{"params":{"currencyCode":"Currency code","token":"eMoney token address"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"eMoneyBridgeIntegration","version":1},"userdoc":{"kind":"user","methods":{"getDefaultDestinations()":{"notice":"Get default destinations"},"registereMoneyToken(address,string,uint256[],uint256,uint256,uint8,uint256)":{"notice":"Register an eMoney token with bridge registry"},"registereMoneyTokenDefault(address,string)":{"notice":"Register an eMoney token with default configuration"},"setDefaultMinBridgeAmount(uint256)":{"notice":"Set default bridge configuration"}},"notice":"Automatically registers eMoney tokens with BridgeRegistry","version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/eMoneyBridgeIntegration.sol":"eMoneyBridgeIntegration"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/eMoneyBridgeIntegration.sol":{"keccak256":"0x653b4309ff3ae785cb5297bbec8b2593ab1ec57e6cf3ebdfe8b84dce67542f27","license":"MIT","urls":["bzz-raw://42a9ee6fa0cd02deccc8edbe919af2f1a609d9dcea1bfa68544165de5cb98897","dweb:/ipfs/QmdfKj9Tw65AFZkWgtL4uPVQHmUL4dwNQChRAgsbXw4baC"]},"contracts/bridge/interop/BridgeRegistry.sol":{"keccak256":"0x7e813c5d8f9762804a35c98244f09831f1ad6ea6df8f2b562c2d031cb246bbc3","license":"MIT","urls":["bzz-raw://e1bba0b26d12b384a26b0e8c09a7c4279a309c24783f501ba4c6bcaa79f6eb7f","dweb:/ipfs/QmRkuvkgurzKtMKAe4oiKc45G3JJ4vwXfM6jPb7PHS49Ts"]},"contracts/emoney/TokenFactory138.sol":{"keccak256":"0xa4ae210bf5c4f221c9617bbb1433a6ba3909c55bd7990207532dad79be318170","license":"MIT","urls":["bzz-raw://892291dddc72a9d7c90f8873b6d56307b3d7a5ea13681583b80b1ece3fbb3c54","dweb:/ipfs/QmTeoXruNhva5vbfY4PWHocGKS547qm3P9f6YhUcGXEEcr"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRDebsJTxzoeBooDRzSa8gY2SNwVmqPis2Tdwt2Y1w6GQ/archive-info.json b/verification-sources/chain138-metadata-archive/QmRDebsJTxzoeBooDRzSa8gY2SNwVmqPis2Tdwt2Y1w6GQ/archive-info.json new file mode 100644 index 0000000..3efabb0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRDebsJTxzoeBooDRzSa8gY2SNwVmqPis2Tdwt2Y1w6GQ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRDebsJTxzoeBooDRzSa8gY2SNwVmqPis2Tdwt2Y1w6GQ", + "metadata_digest": "2ac7df9d657f94f2fe722225e1da2b52c601ec0dae3152af2d37928fc48ad3c1", + "source_path": "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol", + "contract_name": "ERC4626", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRDebsJTxzoeBooDRzSa8gY2SNwVmqPis2Tdwt2Y1w6GQ/metadata.json b/verification-sources/chain138-metadata-archive/QmRDebsJTxzoeBooDRzSa8gY2SNwVmqPis2Tdwt2Y1w6GQ/metadata.json new file mode 100644 index 0000000..43fc2ae --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRDebsJTxzoeBooDRzSa8gY2SNwVmqPis2Tdwt2Y1w6GQ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxDeposit","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxMint","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxRedeem","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxWithdraw","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"MathOverflowedMulDiv","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Implementation of the ERC4626 \"Tokenized Vault Standard\" as defined in https://eips.ethereum.org/EIPS/eip-4626[EIP-4626]. This extension allows the minting and burning of \"shares\" (represented using the ERC20 inheritance) in exchange for underlying \"assets\" through standardized {deposit}, {mint}, {redeem} and {burn} workflows. This contract extends the ERC20 standard. Any additional extensions included along it would affect the \"shares\" token represented by this contract and not the \"assets\" token which is an independent contract. [CAUTION] ==== In empty (or nearly empty) ERC-4626 vaults, deposits are at high risk of being stolen through frontrunning with a \"donation\" to the vault that inflates the price of a share. This is variously known as a donation or inflation attack and is essentially a problem of slippage. Vault deployers can protect against this attack by making an initial deposit of a non-trivial amount of the asset, such that price manipulation becomes infeasible. Withdrawals may similarly be affected by slippage. Users can protect against this attack as well as unexpected slippage in general by verifying the amount received is as expected, using a wrapper that performs these checks such as https://github.com/fei-protocol/ERC4626#erc4626router-and-base[ERC4626Router]. Since v4.9, this implementation uses virtual assets and shares to mitigate that risk. The `_decimalsOffset()` corresponds to an offset in the decimal representation between the underlying asset's decimals and the vault decimals. This offset also determines the rate of virtual shares to virtual assets in the vault, which itself determines the initial exchange rate. While not fully preventing the attack, analysis shows that the default offset (0) makes it non-profitable, as a result of the value being captured by the virtual shares (out of the attacker's donation) matching the attacker's expected gains. With a larger offset, the attack becomes orders of magnitude more expensive than it is profitable. More details about the underlying math can be found xref:erc4626.adoc#inflation-attack[here]. The drawback of this approach is that the virtual shares do capture (a very small) part of the value being accrued to the vault. Also, if the vault experiences losses, the users try to exit the vault, the virtual shares and assets will cause the first user to exit to experience reduced losses in detriment to the last users that will experience bigger losses. Developers willing to revert back to the pre-v4.9 behavior just need to override the `_convertToShares` and `_convertToAssets` functions. To learn more, check out our xref:ROOT:erc4626.adoc[ERC-4626 guide]. ====","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC4626ExceededMaxDeposit(address,uint256,uint256)":[{"details":"Attempted to deposit more assets than the max amount for `receiver`."}],"ERC4626ExceededMaxMint(address,uint256,uint256)":[{"details":"Attempted to mint more shares than the max amount for `receiver`."}],"ERC4626ExceededMaxRedeem(address,uint256,uint256)":[{"details":"Attempted to redeem more shares than the max amount for `receiver`."}],"ERC4626ExceededMaxWithdraw(address,uint256,uint256)":[{"details":"Attempted to withdraw more assets than the max amount for `receiver`."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"MathOverflowedMulDiv()":[{"details":"Muldiv operation overflow."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"asset()":{"details":"See {IERC4626-asset}. "},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"constructor":{"details":"Set the underlying asset contract. This must be an ERC20-compatible contract (ERC20 or ERC777)."},"convertToAssets(uint256)":{"details":"See {IERC4626-convertToAssets}. "},"convertToShares(uint256)":{"details":"See {IERC4626-convertToShares}. "},"decimals()":{"details":"Decimals are computed by adding the decimal offset on top of the underlying asset's decimals. This \"original\" value is cached during construction of the vault contract. If this read operation fails (e.g., the asset has not been created yet), a default of 18 is used to represent the underlying asset's decimals. See {IERC20Metadata-decimals}."},"deposit(uint256,address)":{"details":"See {IERC4626-deposit}. "},"maxDeposit(address)":{"details":"See {IERC4626-maxDeposit}. "},"maxMint(address)":{"details":"See {IERC4626-maxMint}. "},"maxRedeem(address)":{"details":"See {IERC4626-maxRedeem}. "},"maxWithdraw(address)":{"details":"See {IERC4626-maxWithdraw}. "},"mint(uint256,address)":{"details":"See {IERC4626-mint}. As opposed to {deposit}, minting is allowed even if the vault is in a state where the price of a share is zero. In this case, the shares will be minted without requiring any assets to be deposited."},"name()":{"details":"Returns the name of the token."},"previewDeposit(uint256)":{"details":"See {IERC4626-previewDeposit}. "},"previewMint(uint256)":{"details":"See {IERC4626-previewMint}. "},"previewRedeem(uint256)":{"details":"See {IERC4626-previewRedeem}. "},"previewWithdraw(uint256)":{"details":"See {IERC4626-previewWithdraw}. "},"redeem(uint256,address,address)":{"details":"See {IERC4626-redeem}. "},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalAssets()":{"details":"See {IERC4626-totalAssets}. "},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"withdraw(uint256,address,address)":{"details":"See {IERC4626-withdraw}. "}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol":"ERC4626"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC4626.sol":{"keccak256":"0x207f64371bc0fcc5be86713aa5da109a870cc3a6da50e93b64ee881e369b593d","license":"MIT","urls":["bzz-raw://548667cfa76683767c2c610b577f6c2f0675d0ce28f53c3f37b969c84a56b205","dweb:/ipfs/QmUzA1CKC6bDdULuS44wGd7PWBNLiHb6bh7oHwJBDZSLAx"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol":{"keccak256":"0x1837547e04d5fe5334eeb77a345683c22995f1e7aa033020757ddf83a80fc72d","license":"MIT","urls":["bzz-raw://40d6031bc0e6f70edceb4e63fd624fe6be09dc48f5201c7a9078c26e6a9ef95f","dweb:/ipfs/QmPTEBH7dmU3NgE6vtjMy7xEK54as9VHSgf9ojupwnvoke"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRJA4m1NPePbpdHuzBWZhFyCrFkmvYMHouPiAjb4gVYSz/archive-info.json b/verification-sources/chain138-metadata-archive/QmRJA4m1NPePbpdHuzBWZhFyCrFkmvYMHouPiAjb4gVYSz/archive-info.json new file mode 100644 index 0000000..cf1412c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRJA4m1NPePbpdHuzBWZhFyCrFkmvYMHouPiAjb4gVYSz/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRJA4m1NPePbpdHuzBWZhFyCrFkmvYMHouPiAjb4gVYSz", + "metadata_digest": "2bef82e9f6b5acccbdc13b0b56df9268f9f4002dc1748b161196675ef463d06f", + "source_path": "contracts/registry/UniversalAssetRegistry.sol", + "contract_name": "UniversalAssetRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRJA4m1NPePbpdHuzBWZhFyCrFkmvYMHouPiAjb4gVYSz/metadata.json b/verification-sources/chain138-metadata-archive/QmRJA4m1NPePbpdHuzBWZhFyCrFkmvYMHouPiAjb4gVYSz/metadata.json new file mode 100644 index 0000000..aa3532b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRJA4m1NPePbpdHuzBWZhFyCrFkmvYMHouPiAjb4gVYSz/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"GovernanceControllerNotConfigured","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"GovernanceControllerOnly","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"inputs":[],"name":"ZeroGovernanceController","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"indexed":false,"internalType":"enum UniversalAssetRegistry.ComplianceLevel","name":"complianceLevel","type":"uint8"}],"name":"AssetApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"storageNamespace","type":"bytes32"}],"name":"AssetGovernanceProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"}],"name":"AssetProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"}],"name":"AssetRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"},{"indexed":false,"internalType":"bool","name":"isWrappedTransport","type":"bool"},{"indexed":false,"internalType":"bool","name":"supervisionRequired","type":"bool"},{"indexed":false,"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"indexed":false,"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"}],"name":"AssetSupervisionProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"jurisdictionId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":true,"internalType":"address","name":"authority","type":"address"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"},{"indexed":false,"internalType":"bool","name":"canApproveGovernance","type":"bool"},{"indexed":false,"internalType":"bool","name":"canApproveUpgrades","type":"bool"},{"indexed":false,"internalType":"bool","name":"canPause","type":"bool"},{"indexed":false,"internalType":"bool","name":"canReceiveReports","type":"bool"}],"name":"JurisdictionAuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"jurisdictionId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"},{"indexed":false,"internalType":"bool","name":"requiresGovernmentApproval","type":"bool"},{"indexed":false,"internalType":"bool","name":"requiresPeriodicReports","type":"bool"},{"indexed":false,"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"},{"indexed":false,"internalType":"string","name":"supervisionURI","type":"string"},{"indexed":false,"internalType":"bytes32","name":"policyHash","type":"bytes32"}],"name":"JurisdictionProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"}],"name":"ProposalCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"}],"name":"ProposalVoted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"validator","type":"address"}],"name":"ValidatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"validator","type":"address"}],"name":"ValidatorRemoved","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JURISDICTION_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROPOSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTRAR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPERVISOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMELOCK_HIGH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMELOCK_MODERATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMELOCK_STANDARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"name":"addValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assets","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"internalType":"enum UniversalAssetRegistry.ComplianceLevel","name":"complianceLevel","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"uint8","name":"volatilityScore","type":"uint8"},{"internalType":"uint256","name":"minBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"maxBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"dailyVolumeLimit","type":"uint256"},{"internalType":"address","name":"pmmPool","type":"address"},{"internalType":"bool","name":"hasLiquidity","type":"bool"},{"internalType":"uint256","name":"liquidityReserveUSD","type":"uint256"},{"internalType":"bool","name":"requiresGovernance","type":"bool"},{"internalType":"uint256","name":"validationThreshold","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"registeredAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"},{"internalType":"bytes32","name":"assetId","type":"bytes32"},{"internalType":"bytes32","name":"assetVersionId","type":"bytes32"},{"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"},{"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"},{"internalType":"bytes32","name":"storageNamespace","type":"bytes32"},{"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"},{"internalType":"bool","name":"isWrappedTransport","type":"bool"},{"internalType":"bool","name":"supervisionRequired","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"},{"internalType":"string","name":"regulatoryDisclosureURI","type":"string"},{"internalType":"string","name":"reportingURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum UniversalAssetRegistry.AssetType","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"assetsByType","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"},{"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"},{"internalType":"bytes32","name":"storageNamespace","type":"bytes32"},{"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"},{"internalType":"bool","name":"isWrappedTransport","type":"bool"},{"internalType":"bool","name":"supervisionRequired","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"},{"internalType":"string","name":"regulatoryDisclosureURI","type":"string"},{"internalType":"string","name":"reportingURI","type":"string"}],"name":"emergencySetAssetGovernanceProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"address","name":"authority","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"canApproveGovernance","type":"bool"},{"internalType":"bool","name":"canApproveUpgrades","type":"bool"},{"internalType":"bool","name":"canPause","type":"bool"},{"internalType":"bool","name":"canReceiveReports","type":"bool"}],"name":"emergencySetJurisdictionAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"requiresGovernmentApproval","type":"bool"},{"internalType":"bool","name":"requiresPeriodicReports","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"},{"internalType":"string","name":"supervisionURI","type":"string"},{"internalType":"bytes32","name":"policyHash","type":"bytes32"}],"name":"emergencySetJurisdictionProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"emergencySyncAssetMetadataFromToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"proposalId","type":"bytes32"}],"name":"executeProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getAsset","outputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"internalType":"enum UniversalAssetRegistry.ComplianceLevel","name":"complianceLevel","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"uint8","name":"volatilityScore","type":"uint8"},{"internalType":"uint256","name":"minBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"maxBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"dailyVolumeLimit","type":"uint256"},{"internalType":"address","name":"pmmPool","type":"address"},{"internalType":"bool","name":"hasLiquidity","type":"bool"},{"internalType":"uint256","name":"liquidityReserveUSD","type":"uint256"},{"internalType":"bool","name":"requiresGovernance","type":"bool"},{"internalType":"address[]","name":"validators","type":"address[]"},{"internalType":"uint256","name":"validationThreshold","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"registeredAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"},{"internalType":"bytes32","name":"assetId","type":"bytes32"},{"internalType":"bytes32","name":"assetVersionId","type":"bytes32"},{"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"},{"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"},{"internalType":"bytes32","name":"storageNamespace","type":"bytes32"},{"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"},{"internalType":"bool","name":"isWrappedTransport","type":"bool"},{"internalType":"bool","name":"supervisionRequired","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"},{"internalType":"string","name":"regulatoryDisclosureURI","type":"string"},{"internalType":"string","name":"reportingURI","type":"string"}],"internalType":"struct UniversalAssetRegistry.UniversalAsset","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getAssetJurisdictionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getAssetType","outputs":[{"internalType":"enum UniversalAssetRegistry.AssetType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"}],"name":"getAssetsByType","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"address","name":"authority","type":"address"}],"name":"getJurisdictionAuthority","outputs":[{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"canApproveGovernance","type":"bool"},{"internalType":"bool","name":"canApproveUpgrades","type":"bool"},{"internalType":"bool","name":"canPause","type":"bool"},{"internalType":"bool","name":"canReceiveReports","type":"bool"}],"internalType":"struct UniversalAssetRegistry.JurisdictionAuthority","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"jurisdictionId","type":"bytes32"}],"name":"getJurisdictionMinimumUpgradeNotice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction","type":"string"}],"name":"getJurisdictionProfile","outputs":[{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"requiresGovernmentApproval","type":"bool"},{"internalType":"bool","name":"requiresPeriodicReports","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"},{"internalType":"string","name":"supervisionURI","type":"string"},{"internalType":"bytes32","name":"policyHash","type":"bytes32"}],"internalType":"struct UniversalAssetRegistry.JurisdictionProfile","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"proposalId","type":"bytes32"}],"name":"getProposal","outputs":[{"components":[{"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"internalType":"enum UniversalAssetRegistry.ProposalType","name":"proposalType","type":"uint8"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"proposedAt","type":"uint256"},{"internalType":"uint256","name":"executeAfter","type":"uint256"},{"internalType":"uint256","name":"votesFor","type":"uint256"},{"internalType":"uint256","name":"votesAgainst","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"cancelled","type":"bool"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"internalType":"enum UniversalAssetRegistry.ComplianceLevel","name":"complianceLevel","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"uint8","name":"volatilityScore","type":"uint8"},{"internalType":"uint256","name":"minBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"maxBridgeAmount","type":"uint256"}],"internalType":"struct UniversalAssetRegistry.PendingAssetProposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"hasVoted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isAssetActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"jurisdictionId","type":"bytes32"},{"internalType":"address","name":"authority","type":"address"}],"name":"isGovernanceAuthority","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction","type":"string"}],"name":"jurisdictionIdFor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"proposals","outputs":[{"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"internalType":"enum UniversalAssetRegistry.ProposalType","name":"proposalType","type":"uint8"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"proposedAt","type":"uint256"},{"internalType":"uint256","name":"executeAfter","type":"uint256"},{"internalType":"uint256","name":"votesFor","type":"uint256"},{"internalType":"uint256","name":"votesAgainst","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"cancelled","type":"bool"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"internalType":"enum UniversalAssetRegistry.ComplianceLevel","name":"complianceLevel","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"uint8","name":"volatilityScore","type":"uint8"},{"internalType":"uint256","name":"minBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"maxBridgeAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"internalType":"enum UniversalAssetRegistry.ComplianceLevel","name":"complianceLevel","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"uint8","name":"volatilityScore","type":"uint8"},{"internalType":"uint256","name":"minBridge","type":"uint256"},{"internalType":"uint256","name":"maxBridge","type":"uint256"}],"name":"proposeAsset","outputs":[{"internalType":"bytes32","name":"proposalId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quorumPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"jurisdiction","type":"string"}],"name":"registerGRUCompliantAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"name":"removeValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"},{"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"},{"internalType":"bytes32","name":"storageNamespace","type":"bytes32"},{"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"},{"internalType":"bool","name":"isWrappedTransport","type":"bool"},{"internalType":"bool","name":"supervisionRequired","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"},{"internalType":"string","name":"regulatoryDisclosureURI","type":"string"},{"internalType":"string","name":"reportingURI","type":"string"}],"name":"setAssetGovernanceProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"authority","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"canApproveGovernance","type":"bool"},{"internalType":"bool","name":"canApproveUpgrades","type":"bool"},{"internalType":"bool","name":"canPause","type":"bool"},{"internalType":"bool","name":"canReceiveReports","type":"bool"}],"name":"setDerivedJurisdictionAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"requiresGovernmentApproval","type":"bool"},{"internalType":"bool","name":"requiresPeriodicReports","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"},{"internalType":"string","name":"supervisionURI","type":"string"},{"internalType":"bytes32","name":"policyHash","type":"bytes32"}],"name":"setDerivedJurisdictionProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governanceController_","type":"address"}],"name":"setGovernanceController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"address","name":"authority","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"canApproveGovernance","type":"bool"},{"internalType":"bool","name":"canApproveUpgrades","type":"bool"},{"internalType":"bool","name":"canPause","type":"bool"},{"internalType":"bool","name":"canReceiveReports","type":"bool"}],"name":"setJurisdictionAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"requiresGovernmentApproval","type":"bool"},{"internalType":"bool","name":"requiresPeriodicReports","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"},{"internalType":"string","name":"supervisionURI","type":"string"},{"internalType":"bytes32","name":"policyHash","type":"bytes32"}],"name":"setJurisdictionProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"syncAssetMetadataFromToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"pmmPool","type":"address"}],"name":"updatePMMPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"validators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"internalType":"bool","name":"support","type":"bool"}],"name":"voteOnProposal","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Supports 10+ asset types with hybrid governance based on risk levels","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"registerGRUCompliantAsset(address,string,string,uint8,string)":{"details":"Only REGISTRAR_ROLE. Registers as AssetType.GRU so GRUCCIPBridge and PoolManager accept the token."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"title":"UniversalAssetRegistry","version":1},"userdoc":{"kind":"user","methods":{"addValidator(address)":{"notice":"Add validator"},"executeProposal(bytes32)":{"notice":"Execute proposal after timelock"},"proposeAsset(address,uint8,uint8,string,string,uint8,string,uint8,uint256,uint256)":{"notice":"Propose new asset with timelock governance"},"registerGRUCompliantAsset(address,string,string,uint8,string)":{"notice":"Register a GRU compliant token (c*) directly \u2014 no timelock. For use by deploy scripts to integrate all c* with GRU ERC-2535 / bridge."},"removeValidator(address)":{"notice":"Remove validator"},"updatePMMPool(address,address)":{"notice":"Update PMM pool for asset"},"voteOnProposal(bytes32,bool)":{"notice":"Vote on asset proposal"}},"notice":"Central registry for all asset types with governance and compliance","version":1}},"settings":{"compilationTarget":{"contracts/registry/UniversalAssetRegistry.sol":"UniversalAssetRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRMmy4hRJGWTh8KRRPoeMXFNfqVVShFjAJjA8M2L2HuRk/archive-info.json b/verification-sources/chain138-metadata-archive/QmRMmy4hRJGWTh8KRRPoeMXFNfqVVShFjAJjA8M2L2HuRk/archive-info.json new file mode 100644 index 0000000..16c2aee --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRMmy4hRJGWTh8KRRPoeMXFNfqVVShFjAJjA8M2L2HuRk/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRMmy4hRJGWTh8KRRPoeMXFNfqVVShFjAJjA8M2L2HuRk", + "metadata_digest": "2cdcd91e25f5c0d1c1fe6ae97f913a22f7b7f0c756edebaa29fde0ad8d19049b", + "source_path": "contracts/vault/interfaces/IeMoneyJoin.sol", + "contract_name": "IeMoneyJoin", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRMmy4hRJGWTh8KRRPoeMXFNfqVVShFjAJjA8M2L2HuRk/metadata.json b/verification-sources/chain138-metadata-archive/QmRMmy4hRJGWTh8KRRPoeMXFNfqVVShFjAJjA8M2L2HuRk/metadata.json new file mode 100644 index 0000000..9aab644 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRMmy4hRJGWTh8KRRPoeMXFNfqVVShFjAJjA8M2L2HuRk/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"eMoneyBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"eMoneyMinted","type":"event"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Handles minting and burning of eMoney tokens","kind":"dev","methods":{"burn(address,address,uint256)":{"params":{"amount":"Amount to burn","currency":"eMoney currency address","from":"Source address"}},"mint(address,address,uint256)":{"params":{"amount":"Amount to mint","currency":"eMoney currency address","to":"Recipient address"}}},"title":"IeMoneyJoin","version":1},"userdoc":{"kind":"user","methods":{"burn(address,address,uint256)":{"notice":"Burn eMoney from a repayer"},"mint(address,address,uint256)":{"notice":"Mint eMoney to a borrower"}},"notice":"Interface for eMoney Join Adapter","version":1}},"settings":{"compilationTarget":{"contracts/vault/interfaces/IeMoneyJoin.sol":"IeMoneyJoin"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vault/interfaces/IeMoneyJoin.sol":{"keccak256":"0x61df69d6ee9f5966c1b3bfb9bdf938506af7895b0afa8543d73588fb6470ca49","license":"MIT","urls":["bzz-raw://063843b2dfc41802c80bb808e1783701273ce23ef773aa08827f3b923d7102d3","dweb:/ipfs/QmXwc26Y1yAgetLapiUGPLCPoxkp3tAHf5cuSfPBC4PPLw"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRMnGKtPPoSiJLpL54mRrciV4b5dFGhSjTCdqyUkwRN4n/archive-info.json b/verification-sources/chain138-metadata-archive/QmRMnGKtPPoSiJLpL54mRrciV4b5dFGhSjTCdqyUkwRN4n/archive-info.json new file mode 100644 index 0000000..37b9b2b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRMnGKtPPoSiJLpL54mRrciV4b5dFGhSjTCdqyUkwRN4n/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRMnGKtPPoSiJLpL54mRrciV4b5dFGhSjTCdqyUkwRN4n", + "metadata_digest": "2cdd2f4438e9f136623393b593b70147bc5fac985dceac0e301cb8f27a6a948f", + "source_path": "contracts/reserve/StablecoinReserveVault.sol", + "contract_name": "ICompliantTokenOwnerControl", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRMnGKtPPoSiJLpL54mRrciV4b5dFGhSjTCdqyUkwRN4n/metadata.json b/verification-sources/chain138-metadata-archive/QmRMnGKtPPoSiJLpL54mRrciV4b5dFGhSjTCdqyUkwRN4n/metadata.json new file mode 100644 index 0000000..c006e81 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRMnGKtPPoSiJLpL54mRrciV4b5dFGhSjTCdqyUkwRN4n/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/reserve/StablecoinReserveVault.sol":"ICompliantTokenOwnerControl"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/reserve/StablecoinReserveVault.sol":{"keccak256":"0xf902dc091df3fce8100193f51a2c52e8f33036f825e69c74a301ab0fac9e4100","license":"MIT","urls":["bzz-raw://5538e2055cf488a0430a147e7fe1588f0ef3a80640e6892452c6d42fc4068282","dweb:/ipfs/QmZY81ZtSvmE2yw6eN5Sufyxjbm2Nfd4kCUCNvhKMbePqx"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRTB9F7iszzpJiZTDowj2PtCZ1SVYiVaRkyU82gagCVFw/archive-info.json b/verification-sources/chain138-metadata-archive/QmRTB9F7iszzpJiZTDowj2PtCZ1SVYiVaRkyU82gagCVFw/archive-info.json new file mode 100644 index 0000000..9cfeaff --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRTB9F7iszzpJiZTDowj2PtCZ1SVYiVaRkyU82gagCVFw/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRTB9F7iszzpJiZTDowj2PtCZ1SVYiVaRkyU82gagCVFw", + "metadata_digest": "2e3ef4f08c89d526956bcd66cd4eb17ed24674be375edee66236ef28721d755a", + "source_path": "contracts/bridge/trustless/SwapRouter.sol", + "contract_name": "SwapRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRTB9F7iszzpJiZTDowj2PtCZ1SVYiVaRkyU82gagCVFw/metadata.json b/verification-sources/chain138-metadata-archive/QmRTB9F7iszzpJiZTDowj2PtCZ1SVYiVaRkyU82gagCVFw/metadata.json new file mode 100644 index 0000000..0c5d879 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRTB9F7iszzpJiZTDowj2PtCZ1SVYiVaRkyU82gagCVFw/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_uniswapV3Router","type":"address"},{"internalType":"address","name":"_curve3Pool","type":"address"},{"internalType":"address","name":"_oneInchRouter","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_dai","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientOutput","type":"error"},{"inputs":[],"name":"InvalidAssetType","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"SwapFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum SwapRouter.SwapProvider","name":"provider","type":"uint8"},{"indexed":false,"internalType":"enum LiquidityPoolETH.AssetType","name":"inputAsset","type":"uint8"},{"indexed":false,"internalType":"address","name":"inputToken","type":"address"},{"indexed":false,"internalType":"address","name":"outputToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"SwapExecuted","type":"event"},{"inputs":[],"name":"FEE_TIER_HIGH","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_TIER_LOW","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_TIER_MEDIUM","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve3Pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneInchRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum LiquidityPoolETH.AssetType","name":"inputAsset","type":"uint8"},{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"swapToStablecoin","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"uniswapV3Router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Primary: Uniswap V3, Secondary: Curve, Optional: 1inch aggregation","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"constructor":{"params":{"_curve3Pool":"Curve 3pool address","_dai":"DAI address","_oneInchRouter":"1inch Router address (can be address(0) if not used)","_uniswapV3Router":"Uniswap V3 SwapRouter address","_usdc":"USDC address","_usdt":"USDT address","_weth":"WETH address"}},"swapToStablecoin(uint8,address,uint256,uint256,bytes)":{"params":{"amountIn":"Input amount","amountOutMin":"Minimum output amount (slippage protection)","inputAsset":"Input asset type (ETH or WETH)","stablecoinToken":"Target stablecoin address (USDT, USDC, or DAI)"},"returns":{"amountOut":"Output amount"}}},"title":"SwapRouter","version":1},"userdoc":{"kind":"user","methods":{"constructor":{"notice":"Constructor"},"swapToStablecoin(uint8,address,uint256,uint256,bytes)":{"notice":"Swap to stablecoin using best available route"}},"notice":"Swaps ETH/WETH to stablecoins via Uniswap V3, Curve, or 1inch","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/SwapRouter.sol":"SwapRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]},"contracts/bridge/trustless/SwapRouter.sol":{"keccak256":"0x46c48469998ef933a26e9a8276fe5183987664c0f0972de7fccc0489dd1d7a03","license":"MIT","urls":["bzz-raw://81fcbbe09707082aaa4a8125b69200979cbbaf56d190ffa0795fb5d5f561f84c","dweb:/ipfs/QmbJxRppS5zvoYSfdRDxhujEnEGYDdzmedZq8CarP5x5db"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/interfaces/IWETH.sol":{"keccak256":"0x2797f22d48c59542f0c7eb5d4405c7c5c2156c764faf9798de2493e5f6487977","license":"MIT","urls":["bzz-raw://e876c569dce230e2eaf208885fa3df05879363b80df005bbe1841f404c789202","dweb:/ipfs/QmTMEUjEVx2ZvKKe7L6uuEWZYbFaTUYAkabF91189J5wMf"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRXH2sn4n8FQppN41StJDf6yKeuJiMxPbUoyFJygQfT3P/archive-info.json b/verification-sources/chain138-metadata-archive/QmRXH2sn4n8FQppN41StJDf6yKeuJiMxPbUoyFJygQfT3P/archive-info.json new file mode 100644 index 0000000..f359052 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRXH2sn4n8FQppN41StJDf6yKeuJiMxPbUoyFJygQfT3P/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRXH2sn4n8FQppN41StJDf6yKeuJiMxPbUoyFJygQfT3P", + "metadata_digest": "2f4bf0ab28800bd3746f68015d6f8aca9f2a4bfdae07bc009ff1b96e49cbae72", + "source_path": "contracts/flash/CrossChainFlashRepayReceiver.sol", + "contract_name": "CrossChainFlashRepayReceiver", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRXH2sn4n8FQppN41StJDf6yKeuJiMxPbUoyFJygQfT3P/metadata.json b/verification-sources/chain138-metadata-archive/QmRXH2sn4n8FQppN41StJDf6yKeuJiMxPbUoyFJygQfT3P/metadata.json new file mode 100644 index 0000000..63942cb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRXH2sn4n8FQppN41StJDf6yKeuJiMxPbUoyFJygQfT3P/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ccipRouter_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadData","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"NoTokens","type":"error"},{"inputs":[],"name":"OnlyRouter","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"CrossChainDelivered","type":"event"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ccipRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Intended pairing with `CrossChainFlashBorrower` / bridge senders. `msg.sender` must be the CCIP router. `data` encoding: `abi.encode(address recipient, bytes32 obligationId)` where `obligationId` is opaque (indexing / ops). **Repaying the source-chain flash vault** requires a **separate** flow (second tx / bridge back); this contract does not pull debt on source.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"CrossChainFlashRepayReceiver","version":1},"userdoc":{"kind":"user","methods":{},"notice":"**Destination-chain** CCIP receiver: forwards received ERC-20s to a recipient encoded in `message.data`.","version":1}},"settings":{"compilationTarget":{"contracts/flash/CrossChainFlashRepayReceiver.sol":"CrossChainFlashRepayReceiver"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/flash/CrossChainFlashRepayReceiver.sol":{"keccak256":"0xdd32328615834fd20fcdc2d11d24163f82d6be9ac32cc11307b54b5ebf60ecee","license":"MIT","urls":["bzz-raw://a43e34e6a9dc3cacd35e4aa1d3d915cab1d655c3be0589300369a23191ea79da","dweb:/ipfs/QmPomdaZHwv2xKZwzqw6aCq98bZGYnr1Vk4RRA4vugQCHz"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRYQaY4mJM4u22PzSwpCLad9Xu4og6v9yGaT1YBo3u6oF/archive-info.json b/verification-sources/chain138-metadata-archive/QmRYQaY4mJM4u22PzSwpCLad9Xu4og6v9yGaT1YBo3u6oF/archive-info.json new file mode 100644 index 0000000..1b0cbe9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRYQaY4mJM4u22PzSwpCLad9Xu4og6v9yGaT1YBo3u6oF/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRYQaY4mJM4u22PzSwpCLad9Xu4og6v9yGaT1YBo3u6oF", + "metadata_digest": "2f960d952219b89b3a9c2eb8018b72c0fa01bd32a29bff21b4625b4fcff95d2e", + "source_path": "contracts/bridge/trustless/interfaces/ISwapRouter.sol", + "contract_name": "ISwapRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRYQaY4mJM4u22PzSwpCLad9Xu4og6v9yGaT1YBo3u6oF/metadata.json b/verification-sources/chain138-metadata-archive/QmRYQaY4mJM4u22PzSwpCLad9Xu4og6v9yGaT1YBo3u6oF/metadata.json new file mode 100644 index 0000000..2af66ed --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRYQaY4mJM4u22PzSwpCLad9Xu4og6v9yGaT1YBo3u6oF/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"}],"internalType":"struct ISwapRouter.ExactInputParams","name":"params","type":"tuple"}],"name":"exactInput","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct ISwapRouter.ExactInputSingleParams","name":"params","type":"tuple"}],"name":"exactInputSingle","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"Matches the legacy Uniswap V3 SwapRouter exactInputSingle / exactInput ABI.","kind":"dev","methods":{},"title":"ISwapRouter - Uniswap V3 SwapRouter Interface","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Minimal interface for Uniswap V3 SwapRouter","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/interfaces/ISwapRouter.sol":"ISwapRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRZZLQDuT6BLgEaiAKcFKyPaHM4gfrQXDKJhRKWdYbEei/archive-info.json b/verification-sources/chain138-metadata-archive/QmRZZLQDuT6BLgEaiAKcFKyPaHM4gfrQXDKJhRKWdYbEei/archive-info.json new file mode 100644 index 0000000..62dc23b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRZZLQDuT6BLgEaiAKcFKyPaHM4gfrQXDKJhRKWdYbEei/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRZZLQDuT6BLgEaiAKcFKyPaHM4gfrQXDKJhRKWdYbEei", + "metadata_digest": "2fe188ddc4d2c666dc8d56b35e6295f4f15b12027f02a4e7bbcd7a5e7d9d5a5f", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Factory.sol", + "contract_name": "IUniswapV2Factory", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRZZLQDuT6BLgEaiAKcFKyPaHM4gfrQXDKJhRKWdYbEei/metadata.json b/verification-sources/chain138-metadata-archive/QmRZZLQDuT6BLgEaiAKcFKyPaHM4gfrQXDKJhRKWdYbEei/metadata.json new file mode 100644 index 0000000..f40f4f4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRZZLQDuT6BLgEaiAKcFKyPaHM4gfrQXDKJhRKWdYbEei/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PairCreated","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setFeeToSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Factory.sol":"IUniswapV2Factory"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xcaec675e6250bf4cd3364459a0cbf789262af2aaa377d61d4d463f657aea7b50","license":"GPL-3.0","urls":["bzz-raw://2c09e004aa8654e1ad2a1e9d8500883f618d754e5a77c840e2c9064c7a80b5cb","dweb:/ipfs/QmamoA2xnZpLsu4gjNaWkfdYcL5VjRpFmR5shpoJ8wYjZw"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRftNFdNKja7VLMMEHqQiWMg9uPEDbAeaWeqX2Hayoxr5/archive-info.json b/verification-sources/chain138-metadata-archive/QmRftNFdNKja7VLMMEHqQiWMg9uPEDbAeaWeqX2Hayoxr5/archive-info.json new file mode 100644 index 0000000..e364ff9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRftNFdNKja7VLMMEHqQiWMg9uPEDbAeaWeqX2Hayoxr5/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRftNFdNKja7VLMMEHqQiWMg9uPEDbAeaWeqX2Hayoxr5", + "metadata_digest": "318089f91f33a79e271db89a48854a7c0ec35e28fb65a65ae9ff56c29d470eaa", + "source_path": "contracts/reserve/IReserveSystem.sol", + "contract_name": "IReserveSystem", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRftNFdNKja7VLMMEHqQiWMg9uPEDbAeaWeqX2Hayoxr5/metadata.json b/verification-sources/chain138-metadata-archive/QmRftNFdNKja7VLMMEHqQiWMg9uPEDbAeaWeqX2Hayoxr5/metadata.json new file mode 100644 index 0000000..b0b2465 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRftNFdNKja7VLMMEHqQiWMg9uPEDbAeaWeqX2Hayoxr5/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceAsset","type":"address"},{"indexed":true,"internalType":"address","name":"targetAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"sourceAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"targetAmount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"conversionId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"}],"name":"ConversionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PriceFeedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"bytes32","name":"redemptionId","type":"bytes32"}],"name":"RedemptionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"bytes32","name":"reserveId","type":"bytes32"}],"name":"ReserveDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"bytes32","name":"reserveId","type":"bytes32"}],"name":"ReserveWithdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"sourceAsset","type":"address"},{"internalType":"address","name":"targetAsset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateConversion","outputs":[{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sourceAsset","type":"address"},{"internalType":"address","name":"targetAsset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"convertAssets","outputs":[{"internalType":"bytes32","name":"conversionId","type":"bytes32"},{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositReserve","outputs":[{"internalType":"bytes32","name":"reserveId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sourceAsset","type":"address"},{"internalType":"address","name":"targetAsset","type":"address"}],"name":"getConversionPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getReserveBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reserveId","type":"bytes32"}],"name":"getReserveById","outputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"redeem","outputs":[{"internalType":"bytes32","name":"redemptionId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"updatePriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawReserve","outputs":[{"internalType":"bytes32","name":"reserveId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Defines the core functionality for reserve management, conversion, and redemption","kind":"dev","methods":{"calculateConversion(address,address,uint256)":{"params":{"amount":"Amount to convert","sourceAsset":"Address of the source asset","targetAsset":"Address of the target asset"},"returns":{"fees":"Expected fees","path":"Optimal conversion path","targetAmount":"Expected amount after conversion"}},"convertAssets(address,address,uint256)":{"params":{"amount":"Amount to convert","sourceAsset":"Address of the source asset","targetAsset":"Address of the target asset"},"returns":{"conversionId":"Unique identifier for this conversion","fees":"Total fees charged","targetAmount":"Amount received after conversion"}},"depositReserve(address,uint256)":{"params":{"amount":"Amount to deposit","asset":"Address of the asset to deposit"},"returns":{"reserveId":"Unique identifier for this reserve deposit"}},"getConversionPrice(address,address)":{"params":{"sourceAsset":"Address of the source asset","targetAsset":"Address of the target asset"},"returns":{"price":"Conversion price (target per source)"}},"getPrice(address)":{"params":{"asset":"Address of the asset"},"returns":{"price":"Current price","timestamp":"Price timestamp"}},"getReserveBalance(address)":{"params":{"asset":"Address of the asset"},"returns":{"balance":"Total reserve balance"}},"getReserveById(bytes32)":{"params":{"reserveId":"Unique identifier for the reserve"},"returns":{"asset":"Address of the asset","balance":"Reserve balance"}},"redeem(address,uint256,address)":{"params":{"amount":"Amount to redeem","asset":"Address of the asset to redeem","recipient":"Address to receive the redeemed assets"},"returns":{"redemptionId":"Unique identifier for this redemption"}},"updatePriceFeed(address,uint256,uint256)":{"params":{"asset":"Address of the asset","price":"Current price","timestamp":"Price timestamp"}},"withdrawReserve(address,uint256,address)":{"params":{"amount":"Amount to withdraw","asset":"Address of the asset to withdraw","recipient":"Address to receive the withdrawn assets"},"returns":{"reserveId":"Unique identifier for this reserve withdrawal"}}},"title":"IReserveSystem","version":1},"userdoc":{"kind":"user","methods":{"calculateConversion(address,address,uint256)":{"notice":"Calculate conversion amount without executing"},"convertAssets(address,address,uint256)":{"notice":"Convert assets using optimal path (XAU triangulation)"},"depositReserve(address,uint256)":{"notice":"Deposit assets into the reserve system"},"getConversionPrice(address,address)":{"notice":"Get price for conversion between two assets"},"getPrice(address)":{"notice":"Get current price for an asset"},"getReserveBalance(address)":{"notice":"Get the total reserve balance for an asset"},"getReserveById(bytes32)":{"notice":"Get reserve balance for a specific reserve ID"},"redeem(address,uint256,address)":{"notice":"Redeem assets from the reserve system"},"updatePriceFeed(address,uint256,uint256)":{"notice":"Update price feed for an asset"},"withdrawReserve(address,uint256,address)":{"notice":"Withdraw assets from the reserve system"}},"notice":"Interface for the GRU Reserve System","version":1}},"settings":{"compilationTarget":{"contracts/reserve/IReserveSystem.sol":"IReserveSystem"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRhAthXUMVrHAe4XeMV87oZhbc2p8MUtLCmEukrMzQYqU/archive-info.json b/verification-sources/chain138-metadata-archive/QmRhAthXUMVrHAe4XeMV87oZhbc2p8MUtLCmEukrMzQYqU/archive-info.json new file mode 100644 index 0000000..8569345 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRhAthXUMVrHAe4XeMV87oZhbc2p8MUtLCmEukrMzQYqU/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRhAthXUMVrHAe4XeMV87oZhbc2p8MUtLCmEukrMzQYqU", + "metadata_digest": "31d4cdf8afda9c4828b9fac4ded421a1054279a448d80832a963506a6f9168bf", + "source_path": "@openzeppelin/contracts/utils/Pausable.sol", + "contract_name": "Pausable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRhAthXUMVrHAe4XeMV87oZhbc2p8MUtLCmEukrMzQYqU/metadata.json b/verification-sources/chain138-metadata-archive/QmRhAthXUMVrHAe4XeMV87oZhbc2p8MUtLCmEukrMzQYqU/metadata.json new file mode 100644 index 0000000..284697a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRhAthXUMVrHAe4XeMV87oZhbc2p8MUtLCmEukrMzQYqU/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Contract module which allows children to implement an emergency stop mechanism that can be triggered by an authorized account. This module is used through inheritance. It will make available the modifiers `whenNotPaused` and `whenPaused`, which can be applied to the functions of your contract. Note that they will not be pausable by simply including this module, only once the modifiers are put in place.","errors":{"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"constructor":{"details":"Initializes the contract in unpaused state."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/Pausable.sol":"Pausable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRhshYf6QQTqj3emW6B6YFvc7bhtDfnnDhaqtAFtTTBKL/archive-info.json b/verification-sources/chain138-metadata-archive/QmRhshYf6QQTqj3emW6B6YFvc7bhtDfnnDhaqtAFtTTBKL/archive-info.json new file mode 100644 index 0000000..ba035a5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRhshYf6QQTqj3emW6B6YFvc7bhtDfnnDhaqtAFtTTBKL/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRhshYf6QQTqj3emW6B6YFvc7bhtDfnnDhaqtAFtTTBKL", + "metadata_digest": "3202f22cfddafd04e859c4929bec58ed43c9e9ad6fb3bf9b68bbd3096a7ebf1f", + "source_path": "@openzeppelin/contracts/interfaces/draft-IERC6093.sol", + "contract_name": "IERC721Errors", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRhshYf6QQTqj3emW6B6YFvc7bhtDfnnDhaqtAFtTTBKL/metadata.json b/verification-sources/chain138-metadata-archive/QmRhshYf6QQTqj3emW6B6YFvc7bhtDfnnDhaqtAFtTTBKL/metadata.json new file mode 100644 index 0000000..d70a5c6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRhshYf6QQTqj3emW6B6YFvc7bhtDfnnDhaqtAFtTTBKL/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"}],"devdoc":{"details":"Standard ERC721 Errors Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.","errors":{"ERC721IncorrectOwner(address,uint256,address)":[{"details":"Indicates an error related to the ownership over a particular token. Used in transfers.","params":{"owner":"Address of the current owner of a token.","sender":"Address whose tokens are being transferred.","tokenId":"Identifier number of a token."}}],"ERC721InsufficientApproval(address,uint256)":[{"details":"Indicates a failure with the `operator`\u2019s approval. Used in transfers.","params":{"operator":"Address that may be allowed to operate on tokens without being their owner.","tokenId":"Identifier number of a token."}}],"ERC721InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC721InvalidOperator(address)":[{"details":"Indicates a failure with the `operator` to be approved. Used in approvals.","params":{"operator":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC721InvalidOwner(address)":[{"details":"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. Used in balance queries.","params":{"owner":"Address of the current owner of a token."}}],"ERC721InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC721InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC721NonexistentToken(uint256)":[{"details":"Indicates a `tokenId` whose `owner` is the zero address.","params":{"tokenId":"Identifier number of a token."}}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":"IERC721Errors"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRjCM8FBNmUJ8rcyrG9bojnoCCjTkGTiChmuJGzEgoZXP/archive-info.json b/verification-sources/chain138-metadata-archive/QmRjCM8FBNmUJ8rcyrG9bojnoCCjTkGTiChmuJGzEgoZXP/archive-info.json new file mode 100644 index 0000000..f2985d1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRjCM8FBNmUJ8rcyrG9bojnoCCjTkGTiChmuJGzEgoZXP/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRjCM8FBNmUJ8rcyrG9bojnoCCjTkGTiChmuJGzEgoZXP", + "metadata_digest": "32599cb0d6ce3626f60474d7f795b0922d9f393021183faec3c04ae3917e6fe2", + "source_path": "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol", + "contract_name": "IERC20Permit", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRjCM8FBNmUJ8rcyrG9bojnoCCjTkGTiChmuJGzEgoZXP/metadata.json b/verification-sources/chain138-metadata-archive/QmRjCM8FBNmUJ8rcyrG9bojnoCCjTkGTiChmuJGzEgoZXP/metadata.json new file mode 100644 index 0000000..379979f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRjCM8FBNmUJ8rcyrG9bojnoCCjTkGTiChmuJGzEgoZXP/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all. ==== Security Considerations There are two important considerations concerning the use of `permit`. The first is that a valid permit signature expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be considered as an intention to spend the allowance in any specific way. The second is that because permits have built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be generally recommended is: ```solidity function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} doThing(..., value); } function doThing(..., uint256 value) public { token.safeTransferFrom(msg.sender, address(this), value); ... } ``` Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also {SafeERC20-safeTransferFrom}). Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so contracts should have entry points that don't rely on permit.","kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}."},"nonces(address)":{"details":"Returns the current nonce for `owner`. This value must be included whenever a signature is generated for {permit}. Every successful call to {permit} increases ``owner``'s nonce by one. This prevents a signature from being used multiple times."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Sets `value` as the allowance of `spender` over ``owner``'s tokens, given ``owner``'s signed approval. IMPORTANT: The same issues {IERC20-approve} has related to transaction ordering also apply here. Emits an {Approval} event. Requirements: - `spender` cannot be the zero address. - `deadline` must be a timestamp in the future. - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` over the EIP712-formatted function arguments. - the signature must use ``owner``'s current nonce (see {nonces}). For more information on the signature format, see the https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section]. CAUTION: See Security Considerations above."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":"IERC20Permit"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRmFtSMZC6TfmQGi8cTEyWRwmCZ8JwU6zPce3muYog6af/archive-info.json b/verification-sources/chain138-metadata-archive/QmRmFtSMZC6TfmQGi8cTEyWRwmCZ8JwU6zPce3muYog6af/archive-info.json new file mode 100644 index 0000000..23c44d8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRmFtSMZC6TfmQGi8cTEyWRwmCZ8JwU6zPce3muYog6af/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRmFtSMZC6TfmQGi8cTEyWRwmCZ8JwU6zPce3muYog6af", + "metadata_digest": "32e0c6b712e80fc47528e162a3cee3c80c08e1dbffb9975235e449dddd253fac", + "source_path": "@openzeppelin/contracts/utils/ShortStrings.sol", + "contract_name": "ShortStrings", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRmFtSMZC6TfmQGi8cTEyWRwmCZ8JwU6zPce3muYog6af/metadata.json b/verification-sources/chain138-metadata-archive/QmRmFtSMZC6TfmQGi8cTEyWRwmCZ8JwU6zPce3muYog6af/metadata.json new file mode 100644 index 0000000..a7cb7c1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRmFtSMZC6TfmQGi8cTEyWRwmCZ8JwU6zPce3muYog6af/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"}],"devdoc":{"details":"This library provides functions to convert short memory strings into a `ShortString` type that can be used as an immutable variable. Strings of arbitrary length can be optimized using this library if they are short enough (up to 31 bytes) by packing them with their length (1 byte) in a single EVM word (32 bytes). Additionally, a fallback mechanism can be used for every other case. Usage example: ```solidity contract Named { using ShortStrings for *; ShortString private immutable _name; string private _nameFallback; constructor(string memory contractName) { _name = contractName.toShortStringWithFallback(_nameFallback); } function name() external view returns (string memory) { return _name.toStringWithFallback(_nameFallback); } } ```","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/ShortStrings.sol":"ShortStrings"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRraTTzUXaXDFm5RZ3b2ApidnHgNc3BxHRk91GBNdPuMn/archive-info.json b/verification-sources/chain138-metadata-archive/QmRraTTzUXaXDFm5RZ3b2ApidnHgNc3BxHRk91GBNdPuMn/archive-info.json new file mode 100644 index 0000000..a126742 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRraTTzUXaXDFm5RZ3b2ApidnHgNc3BxHRk91GBNdPuMn/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRraTTzUXaXDFm5RZ3b2ApidnHgNc3BxHRk91GBNdPuMn", + "metadata_digest": "343dad44404e3f65d9ce748941a4ae6c914c858827b569bc89f9ab683a5a63d5", + "source_path": "@openzeppelin/contracts/utils/cryptography/EIP712.sol", + "contract_name": "EIP712", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRraTTzUXaXDFm5RZ3b2ApidnHgNc3BxHRk91GBNdPuMn/metadata.json b/verification-sources/chain138-metadata-archive/QmRraTTzUXaXDFm5RZ3b2ApidnHgNc3BxHRk91GBNdPuMn/metadata.json new file mode 100644 index 0000000..1cca91e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRraTTzUXaXDFm5RZ3b2ApidnHgNc3BxHRk91GBNdPuMn/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"}],"devdoc":{"custom:oz-upgrades-unsafe-allow":"state-variable-immutable","details":"https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to produce the hash of their typed data using a combination of `abi.encode` and `keccak256`. This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA ({_hashTypedDataV4}). The implementation of the domain separator was designed to be as efficient as possible while still properly updating the chain id to protect against replay attacks on an eventual fork of the chain. NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the separator from the immutable values, which is cheaper than accessing a cached version in cold storage.","events":{"EIP712DomainChanged()":{"details":"MAY be emitted to signal that the domain could have changed."}},"kind":"dev","methods":{"constructor":{"details":"Initializes the domain separator and parameter caches. The meaning of `name` and `version` is specified in https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. - `version`: the current major version of the signing domain. NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart contract upgrade]."},"eip712Domain()":{"details":"See {IERC-5267}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/cryptography/EIP712.sol":"EIP712"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRsSRSB7Pw3rJYYxe6vg5mULJg4VbPjjJk2LCJgAn2cnp/archive-info.json b/verification-sources/chain138-metadata-archive/QmRsSRSB7Pw3rJYYxe6vg5mULJg4VbPjjJk2LCJgAn2cnp/archive-info.json new file mode 100644 index 0000000..da76e66 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRsSRSB7Pw3rJYYxe6vg5mULJg4VbPjjJk2LCJgAn2cnp/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRsSRSB7Pw3rJYYxe6vg5mULJg4VbPjjJk2LCJgAn2cnp", + "metadata_digest": "34762c229295555f5fc1230da92c3680f1cfd70a8ddd3d03bde1ad2de5d86a25", + "source_path": "contracts/vault/RegulatedEntityRegistry.sol", + "contract_name": "RegulatedEntityRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRsSRSB7Pw3rJYYxe6vg5mULJg4VbPjjJk2LCJgAn2cnp/metadata.json b/verification-sources/chain138-metadata-archive/QmRsSRSB7Pw3rJYYxe6vg5mULJg4VbPjjJk2LCJgAn2cnp/metadata.json new file mode 100644 index 0000000..e9f0d6d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRsSRSB7Pw3rJYYxe6vg5mULJg4VbPjjJk2LCJgAn2cnp/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"AuthorizedWalletAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"AuthorizedWalletRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"bytes32","name":"jurisdictionHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EntityRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EntitySuspended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EntityUnsuspended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"OperatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTRAR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"addAuthorizedWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"}],"name":"getEntity","outputs":[{"internalType":"bool","name":"registered","type":"bool"},{"internalType":"bool","name":"suspended","type":"bool"},{"internalType":"bytes32","name":"jurisdictionHash","type":"bytes32"},{"internalType":"address[]","name":"authorizedWallets","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"}],"name":"isEligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"bytes32","name":"jurisdictionHash","type":"bytes32"},{"internalType":"address[]","name":"authorizedWallets","type":"address[]"}],"name":"registerEntity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"removeAuthorizedWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"}],"name":"suspendEntity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"entity","type":"address"}],"name":"unsuspendEntity","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Separate from eMoney ComplianceRegistry (used for transfers)","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"addAuthorizedWallet(address,address)":{"params":{"entity":"Entity address","wallet":"Wallet address to authorize"}},"getEntity(address)":{"params":{"entity":"Entity address"},"returns":{"authorizedWallets":"List of authorized wallets","jurisdictionHash":"Jurisdiction hash","registered":"True if entity is registered","suspended":"True if entity is suspended"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isAuthorized(address,address)":{"params":{"entity":"Entity address","wallet":"Wallet address"},"returns":{"_0":"isAuthorized True if wallet is authorized"}},"isEligible(address)":{"params":{"entity":"Entity address"},"returns":{"_0":"isEligible True if entity is registered and not suspended"}},"isOperator(address,address)":{"params":{"entity":"Entity address","operator":"Operator address"},"returns":{"_0":"isOperator True if address is an operator"}},"registerEntity(address,bytes32,address[])":{"params":{"authorizedWallets":"Initial authorized wallets","entity":"Entity address","jurisdictionHash":"Hash of jurisdiction identifier"}},"removeAuthorizedWallet(address,address)":{"params":{"entity":"Entity address","wallet":"Wallet address to remove"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setOperator(address,address,bool)":{"params":{"entity":"Entity address","operator":"Operator address","status":"True to grant operator status, false to revoke"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"suspendEntity(address)":{"params":{"entity":"Entity address"}},"unsuspendEntity(address)":{"params":{"entity":"Entity address"}}},"title":"RegulatedEntityRegistry","version":1},"userdoc":{"kind":"user","methods":{"addAuthorizedWallet(address,address)":{"notice":"Add authorized wallet to an entity"},"getEntity(address)":{"notice":"Get entity information"},"isAuthorized(address,address)":{"notice":"Check if a wallet is authorized for an entity"},"isEligible(address)":{"notice":"Check if an entity is registered and eligible"},"isOperator(address,address)":{"notice":"Check if an address is an operator for an entity"},"registerEntity(address,bytes32,address[])":{"notice":"Register a regulated entity"},"removeAuthorizedWallet(address,address)":{"notice":"Remove authorized wallet from an entity"},"setOperator(address,address,bool)":{"notice":"Set operator status for an entity"},"suspendEntity(address)":{"notice":"Suspend an entity"},"unsuspendEntity(address)":{"notice":"Unsuspend an entity"}},"notice":"Registry for tracking regulated financial entities eligible for vault operations","version":1}},"settings":{"compilationTarget":{"contracts/vault/RegulatedEntityRegistry.sol":"RegulatedEntityRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/vault/RegulatedEntityRegistry.sol":{"keccak256":"0x0306900e38f32a43c64dee961f367716554becdc981304df6ccc019629c272c3","license":"MIT","urls":["bzz-raw://8f53f20c6b06a1fa81f2d9393d89f924d52d7cc44fed07feb2600458941f5216","dweb:/ipfs/QmYzPeNx9XmYXWcNHYHnQGyDUAregUHipXe9tEC91eDTds"]},"contracts/vault/interfaces/IRegulatedEntityRegistry.sol":{"keccak256":"0xf3ec40774d215299eae68db073b733885023d6f8d1d9a00575c02842a8c54af4","license":"MIT","urls":["bzz-raw://ea06721c4f4ca7f59e3c9e14fc376e3c43d7cd83f544dbdf18c6e182441186b0","dweb:/ipfs/QmRFbfhyDp9UJBepDinYvs7TC6pLbZBgajnZbtPXqmpcWp"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRuJhp8TnEL9TccCUiXXv6agRZC1fjosWWrMbAxHVG3vu/archive-info.json b/verification-sources/chain138-metadata-archive/QmRuJhp8TnEL9TccCUiXXv6agRZC1fjosWWrMbAxHVG3vu/archive-info.json new file mode 100644 index 0000000..157cbc2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRuJhp8TnEL9TccCUiXXv6agRZC1fjosWWrMbAxHVG3vu/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRuJhp8TnEL9TccCUiXXv6agRZC1fjosWWrMbAxHVG3vu", + "metadata_digest": "34f09b918775b48163cba3428ce4cd7d44a0d5311cdc18d76ca860375e84b2d6", + "source_path": "contracts/flash/DODOToUniswapV3MultiHopExternalUnwinder.sol", + "contract_name": "DODOToUniswapV3MultiHopExternalUnwinder", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRuJhp8TnEL9TccCUiXXv6agRZC1fjosWWrMbAxHVG3vu/metadata.json b/verification-sources/chain138-metadata-archive/QmRuJhp8TnEL9TccCUiXXv6agRZC1fjosWWrMbAxHVG3vu/metadata.json new file mode 100644 index 0000000..f1ccae2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRuJhp8TnEL9TccCUiXXv6agRZC1fjosWWrMbAxHVG3vu/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"integration_","type":"address"},{"internalType":"address","name":"router_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadParams","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"integration","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unwind","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"`data` must be abi.encode(address dodoPool, address intermediateToken, uint256 minIntermediateOut, bytes uniswapPath). `uniswapPath` is the standard exactInput path beginning with `intermediateToken` and ending with `tokenOut`.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"DODOToUniswapV3MultiHopExternalUnwinder","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Unwinds through a DODO PMM first hop and a Uniswap V3 final hop.","version":1}},"settings":{"compilationTarget":{"contracts/flash/DODOToUniswapV3MultiHopExternalUnwinder.sol":"DODOToUniswapV3MultiHopExternalUnwinder"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/flash/DODOToUniswapV3MultiHopExternalUnwinder.sol":{"keccak256":"0xc08d891c09ff16566d1ac2d06325bdf87d88ae6e34266b509254af41fd57984c","license":"MIT","urls":["bzz-raw://5505965afec47b6c9db357775ae1656e478b62968723675eb48c7241cf56cbd1","dweb:/ipfs/QmQFpXGACUkeGf39ZhcCLHVdLwPAZZ5LzNJnYm5emgPMaE"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmRvnKwfnW3pnRhKTbMkd4WjMMMrUz3DCoF2NLLZnRr2fu/archive-info.json b/verification-sources/chain138-metadata-archive/QmRvnKwfnW3pnRhKTbMkd4WjMMMrUz3DCoF2NLLZnRr2fu/archive-info.json new file mode 100644 index 0000000..f00eda5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRvnKwfnW3pnRhKTbMkd4WjMMMrUz3DCoF2NLLZnRr2fu/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmRvnKwfnW3pnRhKTbMkd4WjMMMrUz3DCoF2NLLZnRr2fu", + "metadata_digest": "35516bfe1bb4a5496376eab37973696fb1866cb575daffe263def1b992c596bc", + "source_path": "contracts/interfaces/IRegulatedAssetMetadata.sol", + "contract_name": "IRegulatedAssetMetadata", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmRvnKwfnW3pnRhKTbMkd4WjMMMrUz3DCoF2NLLZnRr2fu/metadata.json b/verification-sources/chain138-metadata-archive/QmRvnKwfnW3pnRhKTbMkd4WjMMMrUz3DCoF2NLLZnRr2fu/metadata.json new file mode 100644 index 0000000..d6b047c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmRvnKwfnW3pnRhKTbMkd4WjMMMrUz3DCoF2NLLZnRr2fu/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"assetId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetVersionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canonicalUnderlyingAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governmentApprovalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumUpgradeNoticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryJurisdiction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"regulatoryDisclosureURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reportingURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"storageNamespace","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedTransport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"IRegulatedAssetMetadata","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Shared governance, supervision, and storage metadata surface for GRU monetary assets.","version":1}},"settings":{"compilationTarget":{"contracts/interfaces/IRegulatedAssetMetadata.sol":"IRegulatedAssetMetadata"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmS3aBYwTQQ3HKNb33WqmcYGuLTY9YojJxwcLb55g8dCBR/archive-info.json b/verification-sources/chain138-metadata-archive/QmS3aBYwTQQ3HKNb33WqmcYGuLTY9YojJxwcLb55g8dCBR/archive-info.json new file mode 100644 index 0000000..80e9d9f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmS3aBYwTQQ3HKNb33WqmcYGuLTY9YojJxwcLb55g8dCBR/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmS3aBYwTQQ3HKNb33WqmcYGuLTY9YojJxwcLb55g8dCBR", + "metadata_digest": "370ec1664f3006bcb18a69525cbf143b454ffb901e2e0ad096e20df4ebe9c658", + "source_path": "contracts/bridge/GRUCCIPBridge.sol", + "contract_name": "GRUCCIPBridge", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmS3aBYwTQQ3HKNb33WqmcYGuLTY9YojJxwcLb55g8dCBR/metadata.json b/verification-sources/chain138-metadata-archive/QmS3aBYwTQQ3HKNb33WqmcYGuLTY9YojJxwcLb55g8dCBR/metadata.json new file mode 100644 index 0000000..627350a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmS3aBYwTQQ3HKNb33WqmcYGuLTY9YojJxwcLb55g8dCBR/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"destinationChain","type":"uint64"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"bool","name":"usedPMM","type":"bool"}],"name":"BridgeExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiverBridge","type":"address"}],"name":"DestinationAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"DestinationRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"sourceToken","type":"address"},{"indexed":false,"internalType":"address","name":"destToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"GRUCrossCurrencyBridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"sourceLayer","type":"string"},{"indexed":false,"internalType":"string","name":"targetLayer","type":"string"},{"indexed":false,"internalType":"uint256","name":"sourceAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"targetAmount","type":"uint256"}],"name":"GRULayerConversion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiverBridge","type":"address"}],"name":"addDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetRegistry","outputs":[{"internalType":"contract UniversalAssetRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32","name":"assetType","type":"bytes32"},{"internalType":"bool","name":"usePMM","type":"bool"},{"internalType":"bool","name":"useVault","type":"bool"},{"internalType":"bytes","name":"complianceProof","type":"bytes"},{"internalType":"bytes","name":"vaultInstructions","type":"bytes"}],"internalType":"struct UniversalCCIPBridge.BridgeOperation","name":"op","type":"tuple"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"sourceLayer","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"string","name":"targetLayer","type":"string"},{"internalType":"address","name":"recipient","type":"address"}],"name":"bridgeGRUWithConversion","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ccipRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"destinations","outputs":[{"internalType":"address","name":"receiverBridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"addedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"getDestination","outputs":[{"components":[{"internalType":"address","name":"receiverBridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"addedAt","type":"uint256"}],"internalType":"struct UniversalCCIPBridge.Destination","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_assetRegistry","type":"address"},{"internalType":"address","name":"_ccipRouter","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"removeDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ccipRouter","type":"address"}],"name":"setCCIPRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityManager","type":"address"}],"name":"setLiquidityManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultFactory","type":"address"}],"name":"setVaultFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userVaults","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Supports layer conversions (M00/M0/M1) and XAU triangulation","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"title":"GRUCCIPBridge","version":1},"userdoc":{"kind":"user","methods":{"addDestination(address,uint64,address)":{"notice":"Add destination for token"},"bridge((address,uint256,uint64,address,bytes32,bool,bool,bytes,bytes))":{"notice":"Main bridge function with asset type routing"},"bridgeGRUWithConversion(address,string,uint256,uint64,string,address)":{"notice":"Bridge GRU with layer conversion"},"removeDestination(address,uint64)":{"notice":"Remove destination"},"setCCIPRouter(address)":{"notice":"Set CCIP router (for deterministic deployment: initialize with router=0, then set per chain)"},"setLiquidityManager(address)":{"notice":"Set liquidity manager"},"setVaultFactory(address)":{"notice":"Set vault factory"},"withdraw()":{"notice":"Withdraw native tokens"}},"notice":"Specialized bridge for Global Reserve Unit (GRU) tokens","version":1}},"settings":{"compilationTarget":{"contracts/bridge/GRUCCIPBridge.sol":"GRUCCIPBridge"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/GRUCCIPBridge.sol":{"keccak256":"0xee6d151937ae8296940bde181a39e7db788fb6ea164aa3c763f059c8f52cddf0","license":"MIT","urls":["bzz-raw://1983eb8e472f8a496be9a4f3743f2ace4f213e20352c95cacc45eec4ebe1e081","dweb:/ipfs/QmSi1i5mpQznP92iXVSLfEND68ccFJtBihgAchqKnxFPzw"]},"contracts/bridge/UniversalCCIPBridge.sol":{"keccak256":"0xcdbe2bad1997db39d23990cc77a7e304ff228d4de878b0a897285e9eaf1f39ca","license":"MIT","urls":["bzz-raw://fe0c40c17b7869587ecacd0fe72f880a3e1e8a836d7f93650d52123bbc9efce2","dweb:/ipfs/QmXqoeHhNAJqJqA7NHw4WjpqWW8SXwVJ7TosQkTp74NiDY"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vault/libraries/GRUConstants.sol":{"keccak256":"0x288273ed3a3f9a0bd5d5e3ebc12f31d89a29eee1f71e804ee67012e312fd12fd","license":"MIT","urls":["bzz-raw://d1726e62295939cb2d70cf5b77aa0e9be8edce0fa8c92b8bbcbda2cb0b4f906a","dweb:/ipfs/QmbYK8JqAd3CEmj2CxXXo6nukuAT6kqN1yg86Tqv85pw2k"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmS4yWR3wNXmHRs3kXd1Mu5PpguhLuGWajazARFX4v9YRs/archive-info.json b/verification-sources/chain138-metadata-archive/QmS4yWR3wNXmHRs3kXd1Mu5PpguhLuGWajazARFX4v9YRs/archive-info.json new file mode 100644 index 0000000..a86cce9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmS4yWR3wNXmHRs3kXd1Mu5PpguhLuGWajazARFX4v9YRs/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmS4yWR3wNXmHRs3kXd1Mu5PpguhLuGWajazARFX4v9YRs", + "metadata_digest": "376ab5d0612e70628dddb2b9edff4dd9afae8ef1e9146013b3b9e28c96bebfee", + "source_path": "@openzeppelin/contracts/access/IAccessControl.sol", + "contract_name": "IAccessControl", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmS4yWR3wNXmHRs3kXd1Mu5PpguhLuGWajazARFX4v9YRs/metadata.json b/verification-sources/chain138-metadata-archive/QmS4yWR3wNXmHRs3kXd1Mu5PpguhLuGWajazARFX4v9YRs/metadata.json new file mode 100644 index 0000000..09f3d24 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmS4yWR3wNXmHRs3kXd1Mu5PpguhLuGWajazARFX4v9YRs/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"External interface of AccessControl declared to support ERC165 detection.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {AccessControl-_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/access/IAccessControl.sol":"IAccessControl"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmS8oLAdMYMEvLXJrhVY3KAJYP26RYiujLCjrNYJoQhSuy/archive-info.json b/verification-sources/chain138-metadata-archive/QmS8oLAdMYMEvLXJrhVY3KAJYP26RYiujLCjrNYJoQhSuy/archive-info.json new file mode 100644 index 0000000..461a090 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmS8oLAdMYMEvLXJrhVY3KAJYP26RYiujLCjrNYJoQhSuy/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmS8oLAdMYMEvLXJrhVY3KAJYP26RYiujLCjrNYJoQhSuy", + "metadata_digest": "386586d02e7cff14a61d595a86687a87c6a5e89b446fa2f7dbfaef756f53e8b4", + "source_path": "contracts/bridge/integration/USDWPublicWrapVault.sol", + "contract_name": "ICWMintBurnMetadata", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmS8oLAdMYMEvLXJrhVY3KAJYP26RYiujLCjrNYJoQhSuy/metadata.json b/verification-sources/chain138-metadata-archive/QmS8oLAdMYMEvLXJrhVY3KAJYP26RYiujLCjrNYJoQhSuy/metadata.json new file mode 100644 index 0000000..53f43ae --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmS8oLAdMYMEvLXJrhVY3KAJYP26RYiujLCjrNYJoQhSuy/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"decimals()":{"details":"Returns the decimals places of the token."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/USDWPublicWrapVault.sol":"ICWMintBurnMetadata"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/USDWPublicWrapVault.sol":{"keccak256":"0xe4ed678e4abc2e67235f4f0f940c8b8deaa27134e15b425c388f0baf6f1cd438","license":"MIT","urls":["bzz-raw://5f35be2e84783b7ac34e60121edd067ea53902126c54097c55034c648973b63b","dweb:/ipfs/QmWZD5UPtFjAbrABvav3rvBBazSEtAMoCakrx6BzExRHXc"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmS99QzGEPCAY5CasZK4QcTPEqPUgRsyWKbg5nSBGC14WM/archive-info.json b/verification-sources/chain138-metadata-archive/QmS99QzGEPCAY5CasZK4QcTPEqPUgRsyWKbg5nSBGC14WM/archive-info.json new file mode 100644 index 0000000..a3255dd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmS99QzGEPCAY5CasZK4QcTPEqPUgRsyWKbg5nSBGC14WM/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmS99QzGEPCAY5CasZK4QcTPEqPUgRsyWKbg5nSBGC14WM", + "metadata_digest": "387c3c13cb698e300e41ef24302f1d3f483827704d3f1591f18c90bf4802a822", + "source_path": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol", + "contract_name": "ContextUpgradeable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmS99QzGEPCAY5CasZK4QcTPEqPUgRsyWKbg5nSBGC14WM/metadata.json b/verification-sources/chain138-metadata-archive/QmS99QzGEPCAY5CasZK4QcTPEqPUgRsyWKbg5nSBGC14WM/metadata.json new file mode 100644 index 0000000..d7ebe93 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmS99QzGEPCAY5CasZK4QcTPEqPUgRsyWKbg5nSBGC14WM/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"}],"devdoc":{"details":"Provides information about the current execution context, including the sender of the transaction and its data. While these are generally available via msg.sender and msg.data, they should not be accessed in such a direct manner, since when dealing with meta-transactions the account sending and paying for execution may not be the actual sender (as far as an application is concerned). This contract is only required for intermediate, library-like contracts.","errors":{"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":"ContextUpgradeable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSNB7BerhGidmrWEzddwezkZUYRBegtDVo83koMFP3eHd/archive-info.json b/verification-sources/chain138-metadata-archive/QmSNB7BerhGidmrWEzddwezkZUYRBegtDVo83koMFP3eHd/archive-info.json new file mode 100644 index 0000000..599a9e8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSNB7BerhGidmrWEzddwezkZUYRBegtDVo83koMFP3eHd/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSNB7BerhGidmrWEzddwezkZUYRBegtDVo83koMFP3eHd", + "metadata_digest": "3bd2b313ea6a334b19fde342c1e120ed22a1e790ebb70005a52f7360a7087768", + "source_path": "contracts/bridge/trustless/InboxETH.sol", + "contract_name": "InboxETH", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSNB7BerhGidmrWEzddwezkZUYRBegtDVo83koMFP3eHd/metadata.json b/verification-sources/chain138-metadata-archive/QmSNB7BerhGidmrWEzddwezkZUYRBegtDVo83koMFP3eHd/metadata.json new file mode 100644 index 0000000..b6bd7f4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSNB7BerhGidmrWEzddwezkZUYRBegtDVo83koMFP3eHd/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_bondManager","type":"address"},{"internalType":"address","name":"_challengeManager","type":"address"},{"internalType":"address","name":"_liquidityPool","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ClaimAlreadyExists","type":"error"},{"inputs":[],"name":"CooldownActive","type":"error"},{"inputs":[],"name":"DepositTooSmall","type":"error"},{"inputs":[],"name":"InsufficientBond","type":"error"},{"inputs":[],"name":"RateLimitExceeded","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"RelayerFeeNotEnabled","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"inputs":[],"name":"ZeroAsset","type":"error"},{"inputs":[],"name":"ZeroDepositId","type":"error"},{"inputs":[],"name":"ZeroRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"relayer","type":"address"},{"indexed":false,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"challengeWindowEnd","type":"uint256"}],"name":"ClaimSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"relayer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RelayerFeeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFeeBps","type":"uint256"}],"name":"RelayerFeeSet","type":"event"},{"inputs":[],"name":"COOLDOWN_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CLAIMS_PER_HOUR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_DEPOSIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondManager","outputs":[{"internalType":"contract BondManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"challengeManager","outputs":[{"internalType":"contract ChallengeManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"claimRelayerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claims","outputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimsPerHour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"getClaim","outputs":[{"components":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct InboxETH.ClaimData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"getClaimStatus","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"},{"internalType":"uint256","name":"challengeWindowEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"getRelayerFee","outputs":[{"components":[{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"internalType":"struct InboxETH.RelayerFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hourStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPool","outputs":[{"internalType":"contract LiquidityPoolETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"relayerFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"relayerFees","outputs":[{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_relayerFeeBps","type":"uint256"}],"name":"setRelayerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"submitClaim","outputs":[{"internalType":"uint256","name":"bondAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"depositIds","type":"uint256[]"},{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"bytes[]","name":"proofs","type":"bytes[]"}],"name":"submitClaimsBatch","outputs":[{"internalType":"uint256","name":"totalBondAmount","type":"uint256"}],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"Permissionless claim submission requiring bonds and challenge mechanism","errors":{"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{"claimRelayerFee(uint256)":{"params":{"depositId":"Deposit ID to claim fee for"}},"constructor":{"params":{"_bondManager":"Address of BondManager contract","_challengeManager":"Address of ChallengeManager contract","_liquidityPool":"Address of LiquidityPoolETH contract"}},"getClaim(uint256)":{"params":{"depositId":"Deposit ID"},"returns":{"_0":"Claim data"}},"getClaimStatus(uint256)":{"params":{"depositId":"Deposit ID"},"returns":{"challengeWindowEnd":"Timestamp when challenge window ends","challenged":"True if claim was challenged","exists":"True if claim exists","finalized":"True if claim is finalized"}},"getRelayerFee(uint256)":{"params":{"depositId":"Deposit ID"},"returns":{"_0":"fee Relayer fee information"}},"setRelayerFee(uint256)":{"params":{"_relayerFeeBps":"New relayer fee in basis points (0 = disabled)"}},"submitClaim(uint256,address,uint256,address,bytes)":{"params":{"amount":"Deposit amount","asset":"Asset address (address(0) for native ETH)","depositId":"Deposit ID from source chain (ChainID 138)","recipient":"Recipient address on Ethereum"},"returns":{"bondAmount":"Amount of bond posted"}},"submitClaimsBatch(uint256[],address[],uint256[],address[],bytes[])":{"params":{"amounts":"Array of deposit amounts","assets":"Array of asset addresses","depositIds":"Array of deposit IDs","proofs":"Array of proof data","recipients":"Array of recipient addresses"},"returns":{"totalBondAmount":"Total bond amount posted"}}},"title":"InboxETH","version":1},"userdoc":{"kind":"user","methods":{"claimRelayerFee(uint256)":{"notice":"Claim relayer fee for a finalized deposit"},"constructor":{"notice":"Constructor"},"getClaim(uint256)":{"notice":"Get claim data"},"getClaimStatus(uint256)":{"notice":"Get claim status"},"getRelayerFee(uint256)":{"notice":"Get relayer fee for a deposit"},"setRelayerFee(uint256)":{"notice":"Set relayer fee (only callable by owner/multisig in future upgrade)"},"submitClaim(uint256,address,uint256,address,bytes)":{"notice":"Submit a claim for a deposit from source chain"},"submitClaimsBatch(uint256[],address[],uint256[],address[],bytes[])":{"notice":"Submit multiple claims in batch (gas optimization)"}},"notice":"Receives and processes claims from relayers for trustless bridge deposits","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/InboxETH.sol":"InboxETH"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/BondManager.sol":{"keccak256":"0xd9c903ba88cae86f3477b282c24308a3e8da48885518337e551f747576edab8f","license":"MIT","urls":["bzz-raw://77b72abe65c34dbe450d7bef2be8bf49ce2e188fb18955143cae39d1318ed510","dweb:/ipfs/QmTZXXgixwpjzcsGuqRS6X9JWwaFawg2g6ptHWLNoGzeN2"]},"contracts/bridge/trustless/ChallengeManager.sol":{"keccak256":"0x1b78e36725fc1d8e0fc8f93ad6b6fb7c41205df7db81bc790338c9dbfbf9da5f","license":"MIT","urls":["bzz-raw://c6f8aa8fbf2996df80a4d8f97107c4dabebf1bd16da5c1a2c2267f67b421517f","dweb:/ipfs/QmSwYZ2mFi6fbtbZAqPerQVjuqov3QL7ramtrafS8cqijq"]},"contracts/bridge/trustless/InboxETH.sol":{"keccak256":"0x17dc0c5a4dcbd345fe0828cf41149098d5966e25235964a247da1623ce63d8ff","license":"MIT","urls":["bzz-raw://059d14196f2f160f38db2713d562975086b6be688e50553d6e90b03c3de95e4a","dweb:/ipfs/QmXm7uTYvKMmsPoahi7G17tz1ZkWnG2WzSC6NUe3Lh7MCW"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]},"contracts/bridge/trustless/libraries/FraudProofTypes.sol":{"keccak256":"0x15e2c59fc46db2ddb33eda2bcd632392564d859942fb1e0026622201f45fe9ab","license":"MIT","urls":["bzz-raw://81e5b0e23122f0d1bccab7d8470987e3aaa787c2d02e140631ff70a83567ae2c","dweb:/ipfs/QmbxNW8tY3FnyFM5GKrEj9Vtr9kLSX6X78xKQGjPdbfd46"]},"contracts/bridge/trustless/libraries/MerkleProofVerifier.sol":{"keccak256":"0x8d92e319d3f83a0e4218d89b598ed86c478a446b4e9271fa1d284842a1aca82b","license":"MIT","urls":["bzz-raw://2aad9a1e47f6e7177b8e7f77ebbb4f9bb32df02f43d07edbd76b7442d49f4e87","dweb:/ipfs/QmXdaJGiAXHqAW9d1zEyBY1vzJhoUaFhzFdPGsxFRrnCLi"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSR6eAfng4eiESDUnjMnpQaomfqGJ3BXPaGkttEMRYN5n/archive-info.json b/verification-sources/chain138-metadata-archive/QmSR6eAfng4eiESDUnjMnpQaomfqGJ3BXPaGkttEMRYN5n/archive-info.json new file mode 100644 index 0000000..71bbdb1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSR6eAfng4eiESDUnjMnpQaomfqGJ3BXPaGkttEMRYN5n/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSR6eAfng4eiESDUnjMnpQaomfqGJ3BXPaGkttEMRYN5n", + "metadata_digest": "3c9264771fe5828498bf5820d7eb99f2f8bb7d5c10f0cd641f11c9d0a7cba7a1", + "source_path": "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol", + "contract_name": "IERC20Metadata", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSR6eAfng4eiESDUnjMnpQaomfqGJ3BXPaGkttEMRYN5n/metadata.json b/verification-sources/chain138-metadata-archive/QmSR6eAfng4eiESDUnjMnpQaomfqGJ3BXPaGkttEMRYN5n/metadata.json new file mode 100644 index 0000000..5bb524e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSR6eAfng4eiESDUnjMnpQaomfqGJ3BXPaGkttEMRYN5n/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface for the optional metadata functions from the ERC20 standard.","events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"decimals()":{"details":"Returns the decimals places of the token."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":"IERC20Metadata"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSTb1V2ibVUnLhGKNKWR9LT6qB4utbZjS9N8hHyh9c5M7/archive-info.json b/verification-sources/chain138-metadata-archive/QmSTb1V2ibVUnLhGKNKWR9LT6qB4utbZjS9N8hHyh9c5M7/archive-info.json new file mode 100644 index 0000000..3999094 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSTb1V2ibVUnLhGKNKWR9LT6qB4utbZjS9N8hHyh9c5M7/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSTb1V2ibVUnLhGKNKWR9LT6qB4utbZjS9N8hHyh9c5M7", + "metadata_digest": "3d35a11b807208c72f711d33cb23390a8d104e7b70e4c3ef38f412f3cf043e16", + "source_path": "contracts/bridge/trustless/integration/Stabilizer.sol", + "contract_name": "Stabilizer", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSTb1V2ibVUnLhGKNKWR9LT6qB4utbZjS9N8hHyh9c5M7/metadata.json b/verification-sources/chain138-metadata-archive/QmSTb1V2ibVUnLhGKNKWR9LT6qB4utbZjS9N8hHyh9c5M7/metadata.json new file mode 100644 index 0000000..303ad99 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSTb1V2ibVUnLhGKNKWR9LT6qB4utbZjS9N8hHyh9c5M7/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"_privatePoolRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BlockDelayNotMet","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"GasPriceTooHigh","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"NoDeviationSource","type":"error"},{"inputs":[],"name":"NoPrivatePool","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ShouldNotRebalance","type":"error"},{"inputs":[],"name":"SlippageExceeded","type":"error"},{"inputs":[],"name":"VolumeCapExceeded","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"manager","type":"address"},{"indexed":false,"internalType":"address","name":"asset","type":"address"}],"name":"PegSourceCommoditySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"manager","type":"address"},{"indexed":false,"internalType":"address","name":"asset","type":"address"}],"name":"PegSourceStablecoinSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"PrivateSwapExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DEVIATION_SAMPLES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STABILIZER_KEEPER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkDeviation","outputs":[{"internalType":"int256","name":"deviationBps","type":"int256"},{"internalType":"bool","name":"shouldRebalance","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commodityPegAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commodityPegManager","outputs":[{"internalType":"contract ICommodityPegManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tradeSize","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"executePrivateSwap","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastExecutionBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasPriceForStabilizer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSlippageBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxStabilizationVolumePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBlocksBetweenExecution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privatePoolRegistry","outputs":[{"internalType":"contract PrivatePoolRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recordDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"asset","type":"address"}],"name":"setCommodityPegSource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"name":"setMaxGasPriceForStabilizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"name":"setMaxSlippageBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"name":"setMaxStabilizationVolumePerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"name":"setMinBlocksBetweenExecution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"asset","type":"address"}],"name":"setStablecoinPegSource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"name":"setSustainedDeviationBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"name":"setThresholdBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stablecoinPegAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stablecoinPegManager","outputs":[{"internalType":"contract IStablecoinPegManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sustainedDeviationBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thresholdBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useStablecoinPeg","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"volumeBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"volumeThisBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Implements Appendix A of VAULT_SYSTEM_MASTER_TECHNICAL_PLAN. Only STABILIZER_KEEPER_ROLE may call executePrivateSwap.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"checkDeviation()":{"returns":{"deviationBps":"Current peg deviation in basis points.","shouldRebalance":"True if over threshold for sustainedDeviationBlocks samples."}},"executePrivateSwap(uint256,address,address)":{"params":{"tokenIn":"Token to sell (must have balance on this contract).","tokenOut":"Token to buy.","tradeSize":"Amount of tokenIn to swap."},"returns":{"amountOut":"Amount of tokenOut received (reverts on slippage or volume cap)."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"Stabilizer","version":1},"userdoc":{"kind":"user","methods":{"checkDeviation()":{"notice":"Get current deviation in bps and whether rebalance is recommended (sustained over threshold)."},"executePrivateSwap(uint256,address,address)":{"notice":"Execute a private swap via the private pool registry (only keeper when shouldRebalance)."},"recordDeviation()":{"notice":"Record current deviation for sustained-deviation check (call from keeper each block or before executePrivateSwap)."}},"notice":"Phase 3: Deviation-triggered private swaps via XAU-anchored pools. Phase 6: TWAP/sustained deviation, per-block cap, flash containment.","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/integration/Stabilizer.sol":"Stabilizer"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/trustless/integration/ICommodityPegManager.sol":{"keccak256":"0xac6ea4e0e063e63248f9e45c67cf6e73c7a9fe78cecd6dfd653fa639a4d19523","license":"MIT","urls":["bzz-raw://283095df7e58b829bf90fe4d4a790ab407d4d0c17cb175f7f82abc0d678890e5","dweb:/ipfs/QmZ97YmiFv8KFMkZX7CALQCvdwxPcdw673HCaZe2EQMxDY"]},"contracts/bridge/trustless/integration/IStablecoinPegManager.sol":{"keccak256":"0x781bb48403013454143b4b539427949ded1f2627475a4d9fef6d95e070f31017","license":"MIT","urls":["bzz-raw://df35bbad3d7a6fcabfc9d543b750e8c2f6736c2fc69bcd3b7f8f22f98e5d395c","dweb:/ipfs/QmQjnE74iygDFtQmXKNuHmjdf1LKekiWcrW1UxW4r1oXrG"]},"contracts/bridge/trustless/integration/Stabilizer.sol":{"keccak256":"0x1a56cb349e3690997b7f066bec842808ddf94f33b1c9829db128dab07f747bcc","license":"MIT","urls":["bzz-raw://54ed08d0e9f9783ca3f664151e31d51767ce52a9074334d103a577dd8f330efc","dweb:/ipfs/QmckymW77LEcWZVwd7a2snCosWe6w2U2keSqarf8erTiyg"]},"contracts/dex/PrivatePoolRegistry.sol":{"keccak256":"0xdea6a1e32a8be8440c9534705f8056d3a6e4ca5ec239d1368310cbbbf34bf84a","license":"MIT","urls":["bzz-raw://e9d034ff9cea19d882581da7750c9722e4a2a80f04e368a8b4d3937fda29eadd","dweb:/ipfs/QmT7jpzpu6BRDAjkDmYKWXmUJ6dSrvvCjkXbtqL28Kbo9n"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSbuvPnBxp6URbKet7kpqdmvsLx1LTbAEX2iH3inRBc5P/archive-info.json b/verification-sources/chain138-metadata-archive/QmSbuvPnBxp6URbKet7kpqdmvsLx1LTbAEX2iH3inRBc5P/archive-info.json new file mode 100644 index 0000000..a611838 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSbuvPnBxp6URbKet7kpqdmvsLx1LTbAEX2iH3inRBc5P/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSbuvPnBxp6URbKet7kpqdmvsLx1LTbAEX2iH3inRBc5P", + "metadata_digest": "3f57a8f106607428def515faf2d418cadd7769f2f79e8ef9017dcea535a48c5a", + "source_path": "contracts/bridge/trustless/adapters/DodoRouteExecutorAdapter.sol", + "contract_name": "DodoRouteExecutorAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSbuvPnBxp6URbKet7kpqdmvsLx1LTbAEX2iH3inRBc5P/metadata.json b/verification-sources/chain138-metadata-archive/QmSbuvPnBxp6URbKet7kpqdmvsLx1LTbAEX2iH3inRBc5P/metadata.json new file mode 100644 index 0000000..dcdcb8d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSbuvPnBxp6URbKet7kpqdmvsLx1LTbAEX2iH3inRBc5P/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"execute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"}],"name":"validate","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/adapters/DodoRouteExecutorAdapter.sol":"DodoRouteExecutorAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/adapters/DodoRouteExecutorAdapter.sol":{"keccak256":"0x30688f0e2857578582a38cf16d57ec915bc8b925ec3390c6aa4619aa4b4f3a2b","license":"MIT","urls":["bzz-raw://701f8b64c425d324ed21efb6416bb85b8af49b3ada81f8563dc411a90029b327","dweb:/ipfs/QmXAKQrgFJeKais7bP6Y364w6G2bYnf7LZYGap26KXhqr3"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]},"contracts/liquidity/interfaces/ILiquidityProvider.sol":{"keccak256":"0xa10b0aef06554835dc192851d0b487bc32d822f73d95558a82f9d37a29071248","license":"MIT","urls":["bzz-raw://5d579daa420f9219b117b44969f43058fbf81979f08a85403dbac621d64955b2","dweb:/ipfs/QmeDFsbuqfnFoVVZQ1S5LMriqLfB8H7qgkCS51yzCydwot"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSdtSLB8yvoUkEAEoqeudKLNYggkfngGRz9vV3HGQXM72/archive-info.json b/verification-sources/chain138-metadata-archive/QmSdtSLB8yvoUkEAEoqeudKLNYggkfngGRz9vV3HGQXM72/archive-info.json new file mode 100644 index 0000000..4247f3e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSdtSLB8yvoUkEAEoqeudKLNYggkfngGRz9vV3HGQXM72/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSdtSLB8yvoUkEAEoqeudKLNYggkfngGRz9vV3HGQXM72", + "metadata_digest": "3fd924ce5db74ee2545ac10f78bda54af9cd2272ac7dfea9c7c22087e187c8ad", + "source_path": "contracts/dbis/DBIS_GRU_MintController.sol", + "contract_name": "DBIS_GRU_MintController", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSdtSLB8yvoUkEAEoqeudKLNYggkfngGRz9vV3HGQXM72/metadata.json b/verification-sources/chain138-metadata-archive/QmSdtSLB8yvoUkEAEoqeudKLNYggkfngGRz9vV3HGQXM72/metadata.json new file mode 100644 index 0000000..9e24d39 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSdtSLB8yvoUkEAEoqeudKLNYggkfngGRz9vV3HGQXM72/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"_settlementRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"assetClass","type":"uint8"}],"name":"MintFromAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gruToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"bytes32","name":"isoType","type":"bytes32"},{"internalType":"bytes32","name":"isoHash","type":"bytes32"},{"internalType":"bytes32","name":"accountingRef","type":"bytes32"},{"internalType":"enum IDBISTypes.FundsStatus","name":"fundsStatus","type":"uint8"},{"internalType":"bytes32","name":"corridor","type":"bytes32"},{"internalType":"enum IDBISTypes.AssetClass","name":"assetClass","type":"uint8"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint64","name":"notBefore","type":"uint64"},{"internalType":"uint64","name":"expiresAt","type":"uint64"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"}],"internalType":"struct IDBISTypes.MintAuth","name":"auth","type":"tuple"}],"name":"mintFromAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setGruToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setSettlementRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settlementRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/DBIS_GRU_MintController.sol":"DBIS_GRU_MintController"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dbis/DBIS_GRU_MintController.sol":{"keccak256":"0xaf4335354ffcd7dbd347dfdee11844b30c3c41f0146ea364fefee5c423859d2a","license":"MIT","urls":["bzz-raw://973464f81ca10982aa6e88c5e51f649418d69329ce3cc14978fe2a261d346557","dweb:/ipfs/QmXgBMbsCx5J24j1Hsma7QrVdpXYWLmTmUy3Rqup1vDNaz"]},"contracts/dbis/IDBISTypes.sol":{"keccak256":"0x1bb363bec4bd479a62db2e2e52b9420b0544be3c7e09dcc88b1b4061c23b7731","license":"MIT","urls":["bzz-raw://f6160b4aa259c5b5a716194b884b4612e6f9627ab8283657ab2476fd3188dc1d","dweb:/ipfs/QmX8xSb3kMuWr7WZdWFJUrAFVZQQKs6vedJYZPNF43DjgX"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmShCUT23hoPWGAGTPsVJmtn6if6wHmctfCeb4nxNvUxA7/archive-info.json b/verification-sources/chain138-metadata-archive/QmShCUT23hoPWGAGTPsVJmtn6if6wHmctfCeb4nxNvUxA7/archive-info.json new file mode 100644 index 0000000..c305bc6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmShCUT23hoPWGAGTPsVJmtn6if6wHmctfCeb4nxNvUxA7/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmShCUT23hoPWGAGTPsVJmtn6if6wHmctfCeb4nxNvUxA7", + "metadata_digest": "40b247b84c9f2f7b0b89f6b9245976d6b13f6c225a4c1ab4ae120e1a2c4824b4", + "source_path": "contracts/bridge/adapters/evm/AlltraAdapter.sol", + "contract_name": "AlltraAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmShCUT23hoPWGAGTPsVJmtn6if6wHmctfCeb4nxNvUxA7/metadata.json b/verification-sources/chain138-metadata-archive/QmShCUT23hoPWGAGTPsVJmtn6if6wHmctfCeb4nxNvUxA7/metadata.json new file mode 100644 index 0000000..e80f06f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmShCUT23hoPWGAGTPsVJmtn6if6wHmctfCeb4nxNvUxA7/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"_bridge","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"alltraTxHash","type":"bytes32"}],"name":"AlltraBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"AlltraBridgeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"ALLTRA_MAINNET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alltraTransport","outputs":[{"internalType":"contract IAlltraTransport","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"bridgeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"bytes32","name":"alltraTxHash","type":"bytes32"}],"name":"confirmBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_transport","type":"address"}],"name":"setAlltraTransport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setBridgeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"universalBridge","outputs":[{"internalType":"contract UniversalCCIPBridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"ALL Mainnet (651940) is not supported by CCIP. Use setAlltraTransport() to set AlltraCustomBridge (or other IAlltraTransport) for 138 <-> 651940 flows.Chain ID: 651940 (0x9f2a4) - https://chainlist.org/chain/651940","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"estimateFee(address,uint256,bytes)":{"params":{"amount":"Unused.","destination":"Unused.","token":"Unused; fee is global per adapter."},"returns":{"fee":"Current bridgeFee in wei."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"AlltraAdapter","version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"bridgeFee()":{"notice":"Configurable bridge fee (default 0.001 ALL). Set via setBridgeFee() after deployment."},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"estimateFee(address,uint256,bytes)":{"notice":"Returns the current bridge fee (configurable via setBridgeFee)."},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"setAlltraTransport(address)":{"notice":"Set custom transport for 138 <-> 651940 (no CCIP). When set, bridge() uses this instead of UniversalCCIPBridge."},"setBridgeFee(uint256)":{"notice":"Update bridge fee. Call after deployment when ALL Mainnet fee structure is known."},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"}},"notice":"Bridge adapter for ALL Mainnet (EVM-compatible)","version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/evm/AlltraAdapter.sol":"AlltraAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/UniversalCCIPBridge.sol":{"keccak256":"0xcdbe2bad1997db39d23990cc77a7e304ff228d4de878b0a897285e9eaf1f39ca","license":"MIT","urls":["bzz-raw://fe0c40c17b7869587ecacd0fe72f880a3e1e8a836d7f93650d52123bbc9efce2","dweb:/ipfs/QmXqoeHhNAJqJqA7NHw4WjpqWW8SXwVJ7TosQkTp74NiDY"]},"contracts/bridge/adapters/evm/AlltraAdapter.sol":{"keccak256":"0xbcec08c40f73d847a587e6e162eba045f09594906e2099b8528962e9fe294e67","license":"MIT","urls":["bzz-raw://c1b9e7d92ac30dbf2c74fc8790d1f5e4ee6266d5460692690f16a62aeabca52b","dweb:/ipfs/QmbopTdm1vSP7PhhLmPPtMNDMwjjfnrYkH78HoUTzSia7q"]},"contracts/bridge/interfaces/IAlltraTransport.sol":{"keccak256":"0x30bdcf8b8ea4a74cdaa4e51e680b5f1faae66e9f6ad8714be1e6ed1d5d9df557","license":"MIT","urls":["bzz-raw://a4200c839b19e9d5c1d2fbc3f82e7c9627042e3db532a93fd57996c1e2e78977","dweb:/ipfs/QmVjCGgLP9Suj8xR6YL6vpCRfaK5ngTSv677dRMqxn3mfH"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSi6wX8WwJ5deJWkCrqrQVUCX5ZrdQc972xx3bLrLFQLu/archive-info.json b/verification-sources/chain138-metadata-archive/QmSi6wX8WwJ5deJWkCrqrQVUCX5ZrdQc972xx3bLrLFQLu/archive-info.json new file mode 100644 index 0000000..e4ffd6b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSi6wX8WwJ5deJWkCrqrQVUCX5ZrdQc972xx3bLrLFQLu/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSi6wX8WwJ5deJWkCrqrQVUCX5ZrdQc972xx3bLrLFQLu", + "metadata_digest": "40ed9abfaf302fb2ac120ecff7c8397750e6baef9be365ccd6eadfd98040f47e", + "source_path": "contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router02.sol", + "contract_name": "IUniswapV2Router02", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSi6wX8WwJ5deJWkCrqrQVUCX5ZrdQc972xx3bLrLFQLu/metadata.json b/verification-sources/chain138-metadata-archive/QmSi6wX8WwJ5deJWkCrqrQVUCX5ZrdQc972xx3bLrLFQLu/metadata.json new file mode 100644 index 0000000..5a6637e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSi6wX8WwJ5deJWkCrqrQVUCX5ZrdQc972xx3bLrLFQLu/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router02.sol":"IUniswapV2Router02"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router01.sol":{"keccak256":"0x8a3c5c449d4b7cd76513ed6995f4b86e4a86f222c770f8442f5fc128ce29b4d2","urls":["bzz-raw://1df63ca373dafae3bd0ee7fe70f890a1dc7c45ed869c01de68413e0e97ff9deb","dweb:/ipfs/QmefJgEYGUL8KX7kQKYTrDweF8GB7yjy3nw5Bmqzryg7PG"]},"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router02.sol":{"keccak256":"0x744e30c133bd0f7ca9e7163433cf6d72f45c6bb1508c2c9c02f1a6db796ae59d","urls":["bzz-raw://9bf2f4454ad63d4cff03a0630e787d9e8a9deed80aec89682cd8ad6379d9ef8c","dweb:/ipfs/Qme51hQNR2wpax7ooUadhtqLtXm8ffeVVYyubLkTT4wMCG"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSjZ3UQ3bEmWxssFNtZdqhCuh1F299wGUszqwCtxrsj31/archive-info.json b/verification-sources/chain138-metadata-archive/QmSjZ3UQ3bEmWxssFNtZdqhCuh1F299wGUszqwCtxrsj31/archive-info.json new file mode 100644 index 0000000..016da84 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSjZ3UQ3bEmWxssFNtZdqhCuh1F299wGUszqwCtxrsj31/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSjZ3UQ3bEmWxssFNtZdqhCuh1F299wGUszqwCtxrsj31", + "metadata_digest": "414cb31bae8ca97050d3bcba5b4eee55d8780eef928e9f641dcb1202226255dc", + "source_path": "contracts/mirror/TransactionMirror.sol", + "contract_name": "TransactionMirror", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSjZ3UQ3bEmWxssFNtZdqhCuh1F299wGUszqwCtxrsj31/metadata.json b/verification-sources/chain138-metadata-archive/QmSjZ3UQ3bEmWxssFNtZdqhCuh1F299wGUszqwCtxrsj31/metadata.json new file mode 100644 index 0000000..1cde5e0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSjZ3UQ3bEmWxssFNtZdqhCuh1F299wGUszqwCtxrsj31/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"BatchTransactionsMirrored","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasUsed","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"TransactionMirrored","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CHAIN_138","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getMirroredTransaction","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMirroredTransactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"getTransaction","outputs":[{"components":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"gasUsed","type":"uint256"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes32","name":"indexedHash","type":"bytes32"}],"internalType":"struct TransactionMirror.MirroredTransaction","name":"mirroredTx","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"isMirrored","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"txHashes","type":"bytes32[]"},{"internalType":"address[]","name":"froms","type":"address[]"},{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"uint256[]","name":"blockNumbers","type":"uint256[]"},{"internalType":"uint256[]","name":"blockTimestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"gasUseds","type":"uint256[]"},{"internalType":"bool[]","name":"successes","type":"bool[]"},{"internalType":"bytes[]","name":"datas","type":"bytes[]"}],"name":"mirrorBatchTransactions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"gasUsed","type":"uint256"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mirrorTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mirroredTxHashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"transactions","outputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"gasUsed","type":"uint256"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes32","name":"indexedHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Logs all Chain-138 transactions as events on Mainnet, making them searchable and viewable on Etherscan. This provides transparency and auditability.","kind":"dev","methods":{"getMirroredTransaction(uint256)":{"params":{"index":"Index in mirroredTxHashes array"},"returns":{"_0":"txHash Transaction hash"}},"getMirroredTransactionCount()":{"returns":{"_0":"count Number of mirrored transactions"}},"getTransaction(bytes32)":{"params":{"txHash":"Chain-138 transaction hash"},"returns":{"mirroredTx":"Mirrored transaction structure"}},"isMirrored(bytes32)":{"params":{"txHash":"Chain-138 transaction hash"},"returns":{"_0":"true if mirrored"}},"mirrorBatchTransactions(bytes32[],address[],address[],uint256[],uint256[],uint256[],uint256[],bool[],bytes[])":{"params":{"blockNumbers":"Array of block numbers","blockTimestamps":"Array of timestamps","datas":"Array of transaction data","froms":"Array of sender addresses","gasUseds":"Array of gas used","successes":"Array of success statuses","tos":"Array of recipient addresses","txHashes":"Array of transaction hashes","values":"Array of values"}},"mirrorTransaction(bytes32,address,address,uint256,uint256,uint256,uint256,bool,bytes)":{"params":{"blockNumber":"Chain-138 block number","blockTimestamp":"Block timestamp","data":"Transaction data (optional)","from":"Sender address","gasUsed":"Gas used","success":"Transaction success status","to":"Recipient address","txHash":"Chain-138 transaction hash","value":"Value transferred"}}},"title":"TransactionMirror","version":1},"userdoc":{"kind":"user","methods":{"getMirroredTransaction(uint256)":{"notice":"Get mirrored transaction hash at index"},"getMirroredTransactionCount()":{"notice":"Get total number of mirrored transactions"},"getTransaction(bytes32)":{"notice":"Get mirrored transaction details"},"isMirrored(bytes32)":{"notice":"Check if a transaction is mirrored"},"mirrorBatchTransactions(bytes32[],address[],address[],uint256[],uint256[],uint256[],uint256[],bool[],bytes[])":{"notice":"Mirror multiple Chain-138 transactions in a batch"},"mirrorTransaction(bytes32,address,address,uint256,uint256,uint256,uint256,bool,bytes)":{"notice":"Mirror a single Chain-138 transaction to Mainnet"},"setAdmin(address)":{"notice":"Admin functions"}},"notice":"Mirrors Chain-138 transactions to Ethereum Mainnet for Etherscan visibility","version":1}},"settings":{"compilationTarget":{"contracts/mirror/TransactionMirror.sol":"TransactionMirror"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/mirror/TransactionMirror.sol":{"keccak256":"0x4396afcd75a34c8ce5ce42fef0e0b67e87ae8acda0f71e56642ed6af7603d00e","license":"MIT","urls":["bzz-raw://cb24c75fc6351f31f22e6c6e48483ad426913de76856101471b5d351c8054205","dweb:/ipfs/QmcS7Ed24U53wYvThsc1dBCCVLUaYKo7Ygbd4maXCa3QGN"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSjZtFa2qCcXbf9hwJzrC9puh2JJryRsEeWdNan4SVph7/archive-info.json b/verification-sources/chain138-metadata-archive/QmSjZtFa2qCcXbf9hwJzrC9puh2JJryRsEeWdNan4SVph7/archive-info.json new file mode 100644 index 0000000..4a2301d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSjZtFa2qCcXbf9hwJzrC9puh2JJryRsEeWdNan4SVph7/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSjZtFa2qCcXbf9hwJzrC9puh2JJryRsEeWdNan4SVph7", + "metadata_digest": "414da68c5994246bbfb8db29abba994b401e9467eac578d33b0d26822be3d342", + "source_path": "contracts/oracle/OracleWithCCIP.sol", + "contract_name": "OracleWithCCIP", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSjZtFa2qCcXbf9hwJzrC9puh2JJryRsEeWdNan4SVph7/metadata.json b/verification-sources/chain138-metadata-archive/QmSjZtFa2qCcXbf9hwJzrC9puh2JJryRsEeWdNan4SVph7/metadata.json new file mode 100644 index 0000000..0276f44 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSjZtFa2qCcXbf9hwJzrC9puh2JJryRsEeWdNan4SVph7/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_description","type":"string"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_heartbeat","type":"uint256"},{"internalType":"uint256","name":"_deviationThreshold","type":"uint256"},{"internalType":"address","name":"_ccipSender","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"current","type":"int256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedAt","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"CCIPEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldSender","type":"address"},{"indexed":false,"internalType":"address","name":"newSender","type":"address"}],"name":"CCIPSenderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"answer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"CCIPUpdateSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"DeviationThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldHeartbeat","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newHeartbeat","type":"uint256"}],"name":"HeartbeatUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"startedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startedAt","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"}],"name":"TransmitterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"}],"name":"TransmitterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"transmitter","type":"address"}],"name":"addTransmitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ccipDestinationChains","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ccipEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ccipSender","outputs":[{"internalType":"contract CCIPSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deviationThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCCIPDestinations","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"getCCIPFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransmitters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"heartbeat","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTransmitter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"transmitter","type":"address"}],"name":"removeTransmitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint256","name":"answer","type":"uint256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint256","name":"answeredInRound","type":"uint256"},{"internalType":"address","name":"transmitter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCCIPEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transmitters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"answer","type":"uint256"}],"name":"updateAnswer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSender","type":"address"}],"name":"updateCCIPSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateDeviationThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newHeartbeat","type":"uint256"}],"name":"updateHeartbeat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Automatically sends oracle updates to other chains via CCIP when updates occur","kind":"dev","methods":{"updateAnswer(uint256)":{"params":{"answer":"New answer value"}}},"title":"Oracle Aggregator with CCIP Integration","version":1},"userdoc":{"kind":"user","methods":{"addTransmitter(address)":{"notice":"Add a transmitter"},"changeAdmin(address)":{"notice":"Change admin"},"getCCIPDestinations()":{"notice":"Get CCIP destinations"},"getCCIPFee(uint64)":{"notice":"Get fee for sending to CCIP destination"},"getRoundData(uint80)":{"notice":"Get round data for a specific round"},"getTransmitters()":{"notice":"Get list of transmitters"},"latestAnswer()":{"notice":"Get the latest answer"},"latestRoundData()":{"notice":"Get the latest round data"},"pause()":{"notice":"Pause the aggregator"},"removeTransmitter(address)":{"notice":"Remove a transmitter"},"setCCIPEnabled(bool)":{"notice":"Enable/disable CCIP"},"unpause()":{"notice":"Unpause the aggregator"},"updateAnswer(uint256)":{"notice":"Update the answer and send to CCIP destinations"},"updateCCIPSender(address)":{"notice":"Update CCIP sender"},"updateDeviationThreshold(uint256)":{"notice":"Update deviation threshold"},"updateHeartbeat(uint256)":{"notice":"Update heartbeat"}},"notice":"Extends Aggregator with CCIP cross-chain messaging capabilities","version":1}},"settings":{"compilationTarget":{"contracts/oracle/OracleWithCCIP.sol":"OracleWithCCIP"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/ccip/CCIPSender.sol":{"keccak256":"0xb12261f714ccb5361ca4ae3e4eb7b60ae0add3f6bb200803929014d7d17248f3","license":"MIT","urls":["bzz-raw://8689c0f3c575440e1cd9f3a0d3ee93438801cf9a2c97b8c378ff335024847361","dweb:/ipfs/QmcFEFHN6ypJN6zL6PySsjXAyLVxwmLamw1TcTTLqZ1wrF"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/oracle/Aggregator.sol":{"keccak256":"0x3fc143b0a198de17d066c05f311edfb3daecef9cc930b7cec2533c63349d6542","license":"MIT","urls":["bzz-raw://8295b365e9a3b2c659bda05e4f0f8e2c42c53e678d9d8e9a3ce98370f8e25ab4","dweb:/ipfs/QmQvtqXXpuLdspqrDXRz8q68HdpNHXKTdG8P9tWiffBrAj"]},"contracts/oracle/OracleWithCCIP.sol":{"keccak256":"0x82ea5533ecaa5717a0d9012880cddfc426a5d47397b88ecf15843fe26ff7d8cc","license":"MIT","urls":["bzz-raw://64808f9a068470a8fa5ac472eaba3202823186942e001e0a7f1f5c271f5cfdf2","dweb:/ipfs/QmSUaiKBQrpBVL89sNqdJdiR4Q6PbvDdfcRgT8qSFtNQTN"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSm236AgVGSFvWb97PQpYG4gAeEobmvFT5oT68eLP9YVX/archive-info.json b/verification-sources/chain138-metadata-archive/QmSm236AgVGSFvWb97PQpYG4gAeEobmvFT5oT68eLP9YVX/archive-info.json new file mode 100644 index 0000000..07a9284 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSm236AgVGSFvWb97PQpYG4gAeEobmvFT5oT68eLP9YVX/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSm236AgVGSFvWb97PQpYG4gAeEobmvFT5oT68eLP9YVX", + "metadata_digest": "41accd4e43f260b5795335e32b248a351d04d8ec058f96f38b5f517679ecbb12", + "source_path": "contracts/bridge/interop/BridgeRegistry.sol", + "contract_name": "BridgeRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSm236AgVGSFvWb97PQpYG4gAeEobmvFT5oT68eLP9YVX/metadata.json b/verification-sources/chain138-metadata-archive/QmSm236AgVGSFvWb97PQpYG4gAeEobmvFT5oT68eLP9YVX/metadata.json new file mode 100644 index 0000000..f69778e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSm236AgVGSFvWb97PQpYG4gAeEobmvFT5oT68eLP9YVX/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"DestinationNotFound","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidDestination","type":"error"},{"inputs":[],"name":"InvalidFee","type":"error"},{"inputs":[],"name":"TokenNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"string","name":"chainName","type":"string"},{"indexed":false,"internalType":"uint256","name":"minFinalityBlocks","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeoutSeconds","type":"uint256"}],"name":"DestinationRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"DestinationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint256","name":"settlementTime","type":"uint256"}],"name":"RouteHealthUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"minAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxAmount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"riskLevel","type":"uint8"}],"name":"TokenRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTRAR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"destinationChainIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"destinations","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainName","type":"string"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"minFinalityBlocks","type":"uint256"},{"internalType":"uint256","name":"timeoutSeconds","type":"uint256"},{"internalType":"uint256","name":"baseFee","type":"uint256"},{"internalType":"address","name":"feeRecipient","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllDestinations","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"getRouteHealthScore","outputs":[{"internalType":"uint256","name":"score","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainName","type":"string"},{"internalType":"uint256","name":"minFinalityBlocks","type":"uint256"},{"internalType":"uint256","name":"timeoutSeconds","type":"uint256"},{"internalType":"uint256","name":"baseFee","type":"uint256"},{"internalType":"address","name":"feeRecipient","type":"address"}],"name":"registerDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256[]","name":"allowedDestinations","type":"uint256[]"},{"internalType":"uint8","name":"riskLevel","type":"uint8"},{"internalType":"uint256","name":"bridgeFeeBps","type":"uint256"}],"name":"registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"routeHealth","outputs":[{"internalType":"uint256","name":"successCount","type":"uint256"},{"internalType":"uint256","name":"failureCount","type":"uint256"},{"internalType":"uint256","name":"lastUpdate","type":"uint256"},{"internalType":"uint256","name":"avgSettlementTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenConfigs","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint8","name":"riskLevel","type":"uint8"},{"internalType":"uint256","name":"bridgeFeeBps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"uint256","name":"settlementTime","type":"uint256"}],"name":"updateRouteHealth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"destinationChainId","type":"uint256"}],"name":"validateBridgeRequest","outputs":[{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"getAllDestinations()":{"returns":{"_0":"chainIds Array of chain IDs"}},"getAllTokens()":{"returns":{"_0":"tokens Array of token addresses"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getRouteHealthScore(uint256,address)":{"params":{"chainId":"Destination chain ID","token":"Token address"},"returns":{"score":"Health score"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"registerDestination(uint256,string,uint256,uint256,uint256,address)":{"params":{"baseFee":"Base fee in basis points","chainId":"Chain ID (0 for non-EVM like XRPL)","chainName":"Human-readable chain name","feeRecipient":"Address to receive fees","minFinalityBlocks":"Minimum blocks/ledgers for finality","timeoutSeconds":"Timeout for refund eligibility"}},"registerToken(address,uint256,uint256,uint256[],uint8,uint256)":{"params":{"allowedDestinations":"Array of allowed destination chain IDs","bridgeFeeBps":"Bridge fee in basis points","maxAmount":"Maximum bridge amount","minAmount":"Minimum bridge amount","riskLevel":"Risk level (0-255)","token":"Token address"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"updateDestination(uint256,bool)":{"params":{"chainId":"Chain ID","enabled":"Enabled status"}},"updateRouteHealth(uint256,address,bool,uint256)":{"params":{"chainId":"Destination chain ID","settlementTime":"Settlement time in seconds","success":"Whether the route succeeded","token":"Token address"}},"updateToken(address,bool)":{"params":{"allowed":"Allowed status","token":"Token address"}},"validateBridgeRequest(address,uint256,uint256)":{"params":{"amount":"Amount to bridge","destinationChainId":"Destination chain ID","token":"Token address (address(0) for native)"},"returns":{"fee":"Fee amount","isValid":"Whether request is valid"}}},"title":"BridgeRegistry","version":1},"userdoc":{"kind":"user","methods":{"getAllDestinations()":{"notice":"Get all registered destinations"},"getAllTokens()":{"notice":"Get all registered tokens"},"getRouteHealthScore(uint256,address)":{"notice":"Get route health score (0-10000, higher is better)"},"pause()":{"notice":"Pause registry"},"registerDestination(uint256,string,uint256,uint256,uint256,address)":{"notice":"Register a new destination chain"},"registerToken(address,uint256,uint256,uint256[],uint8,uint256)":{"notice":"Register a token for bridging"},"unpause()":{"notice":"Unpause registry"},"updateDestination(uint256,bool)":{"notice":"Update destination enabled status"},"updateRouteHealth(uint256,address,bool,uint256)":{"notice":"Update route health metrics"},"updateToken(address,bool)":{"notice":"Update token allowed status"},"validateBridgeRequest(address,uint256,uint256)":{"notice":"Validate bridge request"}},"notice":"Registry for bridge configuration: destinations, tokens, fees, and routing","version":1}},"settings":{"compilationTarget":{"contracts/bridge/interop/BridgeRegistry.sol":"BridgeRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/interop/BridgeRegistry.sol":{"keccak256":"0x7e813c5d8f9762804a35c98244f09831f1ad6ea6df8f2b562c2d031cb246bbc3","license":"MIT","urls":["bzz-raw://e1bba0b26d12b384a26b0e8c09a7c4279a309c24783f501ba4c6bcaa79f6eb7f","dweb:/ipfs/QmRkuvkgurzKtMKAe4oiKc45G3JJ4vwXfM6jPb7PHS49Ts"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmStLKyjn6fY15Cd8ANyssvamC3oUWUZEPhX6sHL4i7h9Z/archive-info.json b/verification-sources/chain138-metadata-archive/QmStLKyjn6fY15Cd8ANyssvamC3oUWUZEPhX6sHL4i7h9Z/archive-info.json new file mode 100644 index 0000000..19b7a90 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmStLKyjn6fY15Cd8ANyssvamC3oUWUZEPhX6sHL4i7h9Z/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmStLKyjn6fY15Cd8ANyssvamC3oUWUZEPhX6sHL4i7h9Z", + "metadata_digest": "438c8cafb38f6750cbaa0e73f4569a49c59213473d19b30f2395643572f50fb0", + "source_path": "contracts/dex/DODOPMMIntegration.sol", + "contract_name": "IDODOVendingMachine", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmStLKyjn6fY15Cd8ANyssvamC3oUWUZEPhX6sHL4i7h9Z/metadata.json b/verification-sources/chain138-metadata-archive/QmStLKyjn6fY15Cd8ANyssvamC3oUWUZEPhX6sHL4i7h9Z/metadata.json new file mode 100644 index 0000000..04fddc6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmStLKyjn6fY15Cd8ANyssvamC3oUWUZEPhX6sHL4i7h9Z/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"createDVM","outputs":[{"internalType":"address","name":"dvm","type":"address"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"DODO Vending Machine Interface","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Interface for creating DODO Vending Machine (DVM) pools","version":1}},"settings":{"compilationTarget":{"contracts/dex/DODOPMMIntegration.sol":"IDODOVendingMachine"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dex/DODOPMMIntegration.sol":{"keccak256":"0x1405e3af6768c64eca2f10258049ad1c6ba71facaef4efe24a97ca6d5f068132","license":"MIT","urls":["bzz-raw://cda6ca9dd862d1bbf228d774aa6eb02c4608797da335ac32be00b3f8ad5c1721","dweb:/ipfs/Qmcko5CRpsfR4hx7QmndPUDjcD3bEtQdjzPcJe1u7jDEUB"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSu9su16zW5fy5z2DoZX8TtvTppqAU2kbG4C9F19sRByz/archive-info.json b/verification-sources/chain138-metadata-archive/QmSu9su16zW5fy5z2DoZX8TtvTppqAU2kbG4C9F19sRByz/archive-info.json new file mode 100644 index 0000000..d658af1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSu9su16zW5fy5z2DoZX8TtvTppqAU2kbG4C9F19sRByz/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSu9su16zW5fy5z2DoZX8TtvTppqAU2kbG4C9F19sRByz", + "metadata_digest": "43c2509b53c901c0e4d94863fb51a017ba618a30445c584407656536c54e1b31", + "source_path": "contracts/vault/libraries/GRUConstants.sol", + "contract_name": "GRUConstants", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSu9su16zW5fy5z2DoZX8TtvTppqAU2kbG4C9F19sRByz/metadata.json b/verification-sources/chain138-metadata-archive/QmSu9su16zW5fy5z2DoZX8TtvTppqAU2kbG4C9F19sRByz/metadata.json new file mode 100644 index 0000000..c83ecbf --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSu9su16zW5fy5z2DoZX8TtvTppqAU2kbG4C9F19sRByz/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"GRU_CURRENCY_CODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRU_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRU_M0","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRU_M00","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRU_M1","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M00_TO_M0_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M00_TO_M1_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M0_TO_M1_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"GRU is a NON-ISO 4217 synthetic unit of account, NOT legal tender MANDATORY COMPLIANCE: - GRU SHALL NOT be treated as fiat currency - GRU SHALL be explicitly identified as synthetic unit of account - All GRU triangulations MUST be conducted through XAU - GRU relationships MUST be enforced exactly: 1 M00 GRU = 5 M0 GRU = 25 M1 GRU","kind":"dev","methods":{},"stateVariables":{"GRU_CURRENCY_CODE":{"details":"This constant explicitly identifies GRU as non-ISO"},"M00_TO_M0_RATIO":{"details":"1 M00 GRU = 5 M0 GRU = 25 M1 GRU"}},"title":"GRUConstants","version":1},"userdoc":{"kind":"user","methods":{"GRU_CURRENCY_CODE()":{"notice":"GRU is NOT an ISO 4217 currency"},"GRU_DECIMALS()":{"notice":"Decimals for GRU calculations (18 decimals for precision)"},"GRU_M00()":{"notice":"GRU monetary layers"},"M00_TO_M0_RATIO()":{"notice":"GRU conversion ratios (MANDATORY - must be enforced exactly)"}},"notice":"Constants and utilities for Global Reserve Unit (GRU)","version":1}},"settings":{"compilationTarget":{"contracts/vault/libraries/GRUConstants.sol":"GRUConstants"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vault/libraries/GRUConstants.sol":{"keccak256":"0x288273ed3a3f9a0bd5d5e3ebc12f31d89a29eee1f71e804ee67012e312fd12fd","license":"MIT","urls":["bzz-raw://d1726e62295939cb2d70cf5b77aa0e9be8edce0fa8c92b8bbcbda2cb0b4f906a","dweb:/ipfs/QmbYK8JqAd3CEmj2CxXXo6nukuAT6kqN1yg86Tqv85pw2k"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSudi7uEatX4U93XSk7z2KdxtSPQ5t2dQnaP8iamvHi6K/archive-info.json b/verification-sources/chain138-metadata-archive/QmSudi7uEatX4U93XSk7z2KdxtSPQ5t2dQnaP8iamvHi6K/archive-info.json new file mode 100644 index 0000000..2b23684 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSudi7uEatX4U93XSk7z2KdxtSPQ5t2dQnaP8iamvHi6K/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSudi7uEatX4U93XSk7z2KdxtSPQ5t2dQnaP8iamvHi6K", + "metadata_digest": "43e1c8b17339f7e3949a033124a9da1bbd3d18889f7681e25eb72fc76ae8c608", + "source_path": "@openzeppelin/contracts/utils/Strings.sol", + "contract_name": "Strings", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSudi7uEatX4U93XSk7z2KdxtSPQ5t2dQnaP8iamvHi6K/metadata.json b/verification-sources/chain138-metadata-archive/QmSudi7uEatX4U93XSk7z2KdxtSPQ5t2dQnaP8iamvHi6K/metadata.json new file mode 100644 index 0000000..ed58244 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSudi7uEatX4U93XSk7z2KdxtSPQ5t2dQnaP8iamvHi6K/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"StringsInsufficientHexLength","type":"error"}],"devdoc":{"details":"String operations.","errors":{"StringsInsufficientHexLength(uint256,uint256)":[{"details":"The `value` string doesn't fit in the specified `length`."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/Strings.sol":"Strings"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSydpN6ZZaMNjLSaUnDtReB4e9pfYz7gFqUwsvQ5CoyNS/archive-info.json b/verification-sources/chain138-metadata-archive/QmSydpN6ZZaMNjLSaUnDtReB4e9pfYz7gFqUwsvQ5CoyNS/archive-info.json new file mode 100644 index 0000000..dbd0473 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSydpN6ZZaMNjLSaUnDtReB4e9pfYz7gFqUwsvQ5CoyNS/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSydpN6ZZaMNjLSaUnDtReB4e9pfYz7gFqUwsvQ5CoyNS", + "metadata_digest": "44e83a9b7589d1af74747f06711167d58bba39c9898962bcf9e74e8ee489145b", + "source_path": "contracts/flash/QuotePushTreasuryManager.sol", + "contract_name": "QuotePushTreasuryManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSydpN6ZZaMNjLSaUnDtReB4e9pfYz7gFqUwsvQ5CoyNS/metadata.json b/verification-sources/chain138-metadata-archive/QmSydpN6ZZaMNjLSaUnDtReB4e9pfYz7gFqUwsvQ5CoyNS/metadata.json new file mode 100644 index 0000000..ee951ab --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSydpN6ZZaMNjLSaUnDtReB4e9pfYz7gFqUwsvQ5CoyNS/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"quoteToken_","type":"address"},{"internalType":"address","name":"operator_","type":"address"},{"internalType":"address","name":"gasRecipient_","type":"address"},{"internalType":"address","name":"recycleRecipient_","type":"address"},{"internalType":"uint256","name":"receiverReserveRetained_","type":"uint256"},{"internalType":"uint256","name":"managerReserveRetained_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadConfig","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"requested","type":"uint256"}],"name":"InsufficientAvailable","type":"error"},{"inputs":[],"name":"NothingToHarvest","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReceiverNotOwnedByManager","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"flashAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"flashAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"recycleAmount","type":"uint256"}],"name":"ManagedCycleExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"ManagedReceiverOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"purpose","type":"bytes32"}],"name":"QuoteDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receiverReserveRetained","type":"uint256"}],"name":"ReceiverSurplusHarvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gasRecipient","type":"address"},{"indexed":true,"internalType":"address","name":"recycleRecipient","type":"address"}],"name":"RecipientsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"receiverReserveRetained","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"managerReserveRetained","type":"uint256"}],"name":"ReservesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRescued","type":"event"},{"inputs":[],"name":"availableQuote","outputs":[{"internalType":"uint256","name":"available","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"purpose","type":"bytes32"}],"name":"distributeQuote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasAmount","type":"uint256"},{"internalType":"uint256","name":"recycleAmount","type":"uint256"}],"name":"distributeToConfiguredRecipients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestReceiverSurplus","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isReceiverOwnedByManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerReserveRetained","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoteBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoteToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiver","outputs":[{"internalType":"contract IQuotePushSweepableReceiver","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiverOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiverReserveRetained","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiverSweepableQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recycleRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"flashAsset","type":"address"},{"internalType":"uint256","name":"flashAmount","type":"uint256"},{"components":[{"internalType":"address","name":"integration","type":"address"},{"internalType":"address","name":"pmmPool","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"externalUnwinder","type":"address"},{"internalType":"uint256","name":"minOutPmm","type":"uint256"},{"internalType":"uint256","name":"minOutUnwind","type":"uint256"},{"internalType":"bytes","name":"unwindData","type":"bytes"},{"components":[{"internalType":"address","name":"coordinator","type":"address"},{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"destinationAsset","type":"address"},{"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"internalType":"uint256","name":"minDestinationAmount","type":"uint256"},{"internalType":"address","name":"destinationRecipient","type":"address"},{"internalType":"uint256","name":"destinationDeadline","type":"uint256"},{"internalType":"bytes32","name":"routeId","type":"bytes32"},{"internalType":"bytes32","name":"settlementMode","type":"bytes32"},{"internalType":"bool","name":"submitCommitment","type":"bool"}],"internalType":"struct AaveQuotePushFlashReceiver.AtomicBridgeParams","name":"atomicBridge","type":"tuple"}],"internalType":"struct AaveQuotePushFlashReceiver.QuotePushParams","name":"params","type":"tuple"},{"internalType":"bool","name":"harvestSurplus","type":"bool"},{"internalType":"uint256","name":"gasHoldbackTargetRaw","type":"uint256"}],"name":"runManagedCycle","outputs":[{"internalType":"uint256","name":"harvested","type":"uint256"},{"internalType":"uint256","name":"gasAmount","type":"uint256"},{"internalType":"uint256","name":"recycleAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gasRecipient_","type":"address"},{"internalType":"address","name":"recycleRecipient_","type":"address"}],"name":"setRecipients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"receiverReserveRetained_","type":"uint256"},{"internalType":"uint256","name":"managerReserveRetained_","type":"uint256"}],"name":"setReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferManagedReceiverOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"QuotePushTreasuryManager","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Minimal treasury manager for Aave quote-push retained surplus. Intended flow: 1. Receiver retains quote surplus after flash repayment. 2. This manager, as receiver owner, harvests that surplus into itself. 3. Owner/operator distributes quote to gas and recycle recipients. Gas replenishment is still an operator policy in quote units; converting quote into native gas token remains off-chain / external.","version":1}},"settings":{"compilationTarget":{"contracts/flash/QuotePushTreasuryManager.sol":"QuotePushTreasuryManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/flash/AaveQuotePushFlashReceiver.sol":{"keccak256":"0x9648a35f371bb79c4782933d66237ee759ab4d546950bf79489c87091ff5d7e5","license":"MIT","urls":["bzz-raw://e4360e49daf3f2ac0a7f0299d0083479909f5ae30de80ad647b37421f4d871c8","dweb:/ipfs/QmVAkMWwMEJwFQ5ELSLJhhoxM6oSPUpkrjTzEZkMH5cdh7"]},"contracts/flash/QuotePushTreasuryManager.sol":{"keccak256":"0x0e847c7ee84b23113ea9675f0a7a936404f58cee468cad0c5d51181e4c5b2b7f","license":"MIT","urls":["bzz-raw://67d5e9e122e27e26dad1eadf2c45f95776da694b290378cc1d11f77790e51862","dweb:/ipfs/QmfRYnYKU6v4ZeNrzifw1mZFW6c1fwAnr2oEV3sfx2LS6o"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmSz99iWGQ7Zeva1LgLHMFL5qB2Kh8e7DrK5wEheTqScP1/archive-info.json b/verification-sources/chain138-metadata-archive/QmSz99iWGQ7Zeva1LgLHMFL5qB2Kh8e7DrK5wEheTqScP1/archive-info.json new file mode 100644 index 0000000..9bc8a64 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSz99iWGQ7Zeva1LgLHMFL5qB2Kh8e7DrK5wEheTqScP1/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmSz99iWGQ7Zeva1LgLHMFL5qB2Kh8e7DrK5wEheTqScP1", + "metadata_digest": "45096587b226d12c7310354e6cda4b578d813c43503301aef444e336d3f02850", + "source_path": "contracts/bridge/TwoWayTokenBridgeL1.sol", + "contract_name": "IERC20", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmSz99iWGQ7Zeva1LgLHMFL5qB2Kh8e7DrK5wEheTqScP1/metadata.json b/verification-sources/chain138-metadata-archive/QmSz99iWGQ7Zeva1LgLHMFL5qB2Kh8e7DrK5wEheTqScP1/metadata.json new file mode 100644 index 0000000..87ed5b5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmSz99iWGQ7Zeva1LgLHMFL5qB2Kh8e7DrK5wEheTqScP1/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/TwoWayTokenBridgeL1.sol":"IERC20"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/TwoWayTokenBridgeL1.sol":{"keccak256":"0x55a68a90791e1784c76012a83aa9cc113d0512f368bb25747664f85facc7d40b","license":"MIT","urls":["bzz-raw://c06c64a1df9993b3588bd748c0edb4d9c22d28ee3dc82d837a6a1126a07891c3","dweb:/ipfs/QmaHnptsbVfzm41QhFxBcHpJ94GpS9ckDDetimqFdey67P"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmT1JwCF7CRh794t6K1eRkxrTEctWN8j2M2JE7JKTQkddr/archive-info.json b/verification-sources/chain138-metadata-archive/QmT1JwCF7CRh794t6K1eRkxrTEctWN8j2M2JE7JKTQkddr/archive-info.json new file mode 100644 index 0000000..2501a5a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmT1JwCF7CRh794t6K1eRkxrTEctWN8j2M2JE7JKTQkddr/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmT1JwCF7CRh794t6K1eRkxrTEctWN8j2M2JE7JKTQkddr", + "metadata_digest": "45560a5383e2c02725aec7483fe45f4fe647237645c1516853717bed4897cbd1", + "source_path": "contracts/utils/Multicall.sol", + "contract_name": "Multicall", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmT1JwCF7CRh794t6K1eRkxrTEctWN8j2M2JE7JKTQkddr/metadata.json b/verification-sources/chain138-metadata-archive/QmT1JwCF7CRh794t6K1eRkxrTEctWN8j2M2JE7JKTQkddr/metadata.json new file mode 100644 index 0000000..a1e0b2c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmT1JwCF7CRh794t6K1eRkxrTEctWN8j2M2JE7JKTQkddr/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct Multicall.Call[]","name":"calls","type":"tuple[]"}],"name":"aggregate","outputs":[{"internalType":"bytes[]","name":"returnData","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct Multicall.Call[]","name":"calls","type":"tuple[]"},{"internalType":"uint256","name":"gasLimit","type":"uint256"}],"name":"aggregateWithGasLimit","outputs":[{"internalType":"bytes[]","name":"returnData","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getBlockHash","outputs":[{"internalType":"bytes32","name":"blockHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"chainid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockCoinbase","outputs":[{"internalType":"address","name":"coinbase","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockDifficulty","outputs":[{"internalType":"uint256","name":"difficulty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockGasLimit","outputs":[{"internalType":"uint256","name":"gaslimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockNumber","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"requireSuccess","type":"bool"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct Multicall.Call[]","name":"calls","type":"tuple[]"}],"name":"tryAggregate","outputs":[{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"internalType":"struct Multicall.Result[]","name":"returnData","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Based on Uniswap V3 Multicall","kind":"dev","methods":{"aggregate((address,bytes)[])":{"params":{"calls":"Array of calls to execute"},"returns":{"returnData":"Array of return data for each call"}},"aggregateWithGasLimit((address,bytes)[],uint256)":{"params":{"calls":"Array of calls to execute","gasLimit":"Gas limit for each call"},"returns":{"returnData":"Array of return data for each call"}},"getBlockHash(uint256)":{"params":{"blockNumber":"Block number"},"returns":{"blockHash":"Block hash"}},"getChainId()":{"returns":{"chainid":"Current chain ID"}},"getCurrentBlockCoinbase()":{"returns":{"coinbase":"Current block coinbase"}},"getCurrentBlockDifficulty()":{"returns":{"difficulty":"Current block difficulty"}},"getCurrentBlockGasLimit()":{"returns":{"gaslimit":"Current block gas limit"}},"getCurrentBlockNumber()":{"returns":{"blockNumber":"Current block number"}},"getCurrentBlockTimestamp()":{"returns":{"timestamp":"Current block timestamp"}},"tryAggregate(bool,(address,bytes)[])":{"params":{"calls":"Array of calls to execute","requireSuccess":"If true, require all calls to succeed"},"returns":{"returnData":"Array of results with success flags and return data for each call"}}},"title":"Multicall","version":1},"userdoc":{"kind":"user","methods":{"aggregate((address,bytes)[])":{"notice":"Aggregate multiple calls"},"aggregateWithGasLimit((address,bytes)[],uint256)":{"notice":"Aggregate multiple calls with gas limit"},"getBlockHash(uint256)":{"notice":"Get block hash for a specific block"},"getChainId()":{"notice":"Get current chain ID"},"getCurrentBlockCoinbase()":{"notice":"Get current block coinbase"},"getCurrentBlockDifficulty()":{"notice":"Get current block difficulty"},"getCurrentBlockGasLimit()":{"notice":"Get current block gas limit"},"getCurrentBlockNumber()":{"notice":"Get current block number"},"getCurrentBlockTimestamp()":{"notice":"Get current block timestamp"},"tryAggregate(bool,(address,bytes)[])":{"notice":"Aggregate multiple calls, allowing failures"}},"notice":"Aggregate multiple calls in a single transaction","version":1}},"settings":{"compilationTarget":{"contracts/utils/Multicall.sol":"Multicall"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/utils/Multicall.sol":{"keccak256":"0x1c8b8138fe92d0c63b7fd773c366a1cbe9e58d5791d86885b19a158243a49058","license":"MIT","urls":["bzz-raw://da4a5d90fdd6b6fa912df4b44ac717260644a539d75fa6bab82ee2fb499e16c5","dweb:/ipfs/QmZq6DpjrhXUgKM8Y8jkaF65YJcigpdziBEEFTgAxw6y1w"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmT34mvKS54rk56UNM85N3LkF4dhjBR1EjoHcdEEBREz2k/archive-info.json b/verification-sources/chain138-metadata-archive/QmT34mvKS54rk56UNM85N3LkF4dhjBR1EjoHcdEEBREz2k/archive-info.json new file mode 100644 index 0000000..1e21230 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmT34mvKS54rk56UNM85N3LkF4dhjBR1EjoHcdEEBREz2k/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmT34mvKS54rk56UNM85N3LkF4dhjBR1EjoHcdEEBREz2k", + "metadata_digest": "45c930f8e2892fd85ff75ba7f2599a3ea8a4a4316ae19eaac168dcdeb45d0ef1", + "source_path": "contracts/flash/QuotePushFlashWorkflowBorrower.sol", + "contract_name": "IExternalUnwinder", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmT34mvKS54rk56UNM85N3LkF4dhjBR1EjoHcdEEBREz2k/metadata.json b/verification-sources/chain138-metadata-archive/QmT34mvKS54rk56UNM85N3LkF4dhjBR1EjoHcdEEBREz2k/metadata.json new file mode 100644 index 0000000..960c8e8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmT34mvKS54rk56UNM85N3LkF4dhjBR1EjoHcdEEBREz2k/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unwind","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Minimal external unwind interface for converting PMM base back into flash-borrowed quote.","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/QuotePushFlashWorkflowBorrower.sol":"IExternalUnwinder"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":{"keccak256":"0x9f9e6dba43fe0775c400aa384375f1f503efaf733a40187169fdfc195f5ea6fa","license":"MIT","urls":["bzz-raw://ff5fe5fac5e4ecbf9fcd34c42b6d58d1af150263dfe07bc6785a59329dd1e475","dweb:/ipfs/QmX1EhNKKL6n6RFrLLAYh6Uf3itkozjSHyGFs9DqwW4Rzy"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/flash/QuotePushFlashWorkflowBorrower.sol":{"keccak256":"0xcd8b38f86477005ca9b889945493c4d35137c97f8c29cd10bfa2bee3b02861e2","license":"MIT","urls":["bzz-raw://e1ecc34f9b0ae9abc3cd59c9801edc3a80d7ec1219f2675d2f9c16460831bf02","dweb:/ipfs/QmZGq4BvB96XsfHXrmQPWNyp6q6Pjumsb68Rqrh5K5Gp2x"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTB7xpncWmJvJw9rbGYS9thqJsce1gaewNs7uxwTcB9z2/archive-info.json b/verification-sources/chain138-metadata-archive/QmTB7xpncWmJvJw9rbGYS9thqJsce1gaewNs7uxwTcB9z2/archive-info.json new file mode 100644 index 0000000..3501c4f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTB7xpncWmJvJw9rbGYS9thqJsce1gaewNs7uxwTcB9z2/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTB7xpncWmJvJw9rbGYS9thqJsce1gaewNs7uxwTcB9z2", + "metadata_digest": "47d971456e593aacb6064b41aec15c4cfbe2ff44c422010afa6f5d40dbc52a0b", + "source_path": "@openzeppelin/contracts/proxy/Proxy.sol", + "contract_name": "Proxy", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTB7xpncWmJvJw9rbGYS9thqJsce1gaewNs7uxwTcB9z2/metadata.json b/verification-sources/chain138-metadata-archive/QmTB7xpncWmJvJw9rbGYS9thqJsce1gaewNs7uxwTcB9z2/metadata.json new file mode 100644 index 0000000..d26ab6f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTB7xpncWmJvJw9rbGYS9thqJsce1gaewNs7uxwTcB9z2/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"stateMutability":"payable","type":"fallback"}],"devdoc":{"details":"This abstract contract provides a fallback function that delegates all calls to another contract using the EVM instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to be specified by overriding the virtual {_implementation} function. Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a different contract through the {_delegate} function. The success and return data of the delegated call will be returned back to the caller of the proxy.","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/proxy/Proxy.sol":"Proxy"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/proxy/Proxy.sol":{"keccak256":"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd","license":"MIT","urls":["bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac","dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTBBHYj8ARDCkokbMg9EwNXE4uLpVFnf2L5n6U8NRdcsD/archive-info.json b/verification-sources/chain138-metadata-archive/QmTBBHYj8ARDCkokbMg9EwNXE4uLpVFnf2L5n6U8NRdcsD/archive-info.json new file mode 100644 index 0000000..89457c1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTBBHYj8ARDCkokbMg9EwNXE4uLpVFnf2L5n6U8NRdcsD/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTBBHYj8ARDCkokbMg9EwNXE4uLpVFnf2L5n6U8NRdcsD", + "metadata_digest": "47dd3317c2506fb8ef74a9fb148c274e967c9216b8c0e657f90e25d3e9b1dacc", + "source_path": "contracts/ccip/IRouterClient.sol", + "contract_name": "IRouterClient", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTBBHYj8ARDCkokbMg9EwNXE4uLpVFnf2L5n6U8NRdcsD/metadata.json b/verification-sources/chain138-metadata-archive/QmTBBHYj8ARDCkokbMg9EwNXE4uLpVFnf2L5n6U8NRdcsD/metadata.json new file mode 100644 index 0000000..d0b9a7d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTBBHYj8ARDCkokbMg9EwNXE4uLpVFnf2L5n6U8NRdcsD/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"indexed":false,"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"receiver","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"indexed":false,"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"bytes","name":"extraArgs","type":"bytes"}],"name":"MessageSent","type":"event"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"components":[{"internalType":"bytes","name":"receiver","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"address","name":"feeToken","type":"address"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"internalType":"struct IRouterClient.EVM2AnyMessage","name":"message","type":"tuple"}],"name":"ccipSend","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint256","name":"fees","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"components":[{"internalType":"bytes","name":"receiver","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"address","name":"feeToken","type":"address"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"internalType":"struct IRouterClient.EVM2AnyMessage","name":"message","type":"tuple"}],"name":"getFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"}],"name":"getSupportedTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This interface is based on Chainlink CCIP Router Client specification","kind":"dev","methods":{"ccipSend(uint64,(bytes,bytes,(address,uint256,uint8)[],address,bytes))":{"details":"If feeToken is zero address, fees are paid in native token (ETH) via msg.value","params":{"destinationChainSelector":"The chain selector of the destination chain","message":"The message to send"},"returns":{"fees":"The fees required for the message","messageId":"The ID of the sent message"}},"getFee(uint64,(bytes,bytes,(address,uint256,uint8)[],address,bytes))":{"params":{"destinationChainSelector":"The chain selector of the destination chain","message":"The message to send"},"returns":{"fee":"The fee required for the message"}},"getSupportedTokens(uint64)":{"params":{"destinationChainSelector":"The chain selector of the destination chain"},"returns":{"tokens":"The list of supported tokens"}}},"title":"Chainlink CCIP Router Client Interface","version":1},"userdoc":{"events":{"MessageReceived(bytes32,uint64,address,bytes,(address,uint256,uint8)[])":{"notice":"Emitted when a message is received"},"MessageSent(bytes32,uint64,address,bytes,bytes,(address,uint256,uint8)[],address,bytes)":{"notice":"Emitted when a message is sent"}},"kind":"user","methods":{"ccipSend(uint64,(bytes,bytes,(address,uint256,uint8)[],address,bytes))":{"notice":"Sends a message to a destination chain"},"getFee(uint64,(bytes,bytes,(address,uint256,uint8)[],address,bytes))":{"notice":"Gets the fee for sending a message"},"getSupportedTokens(uint64)":{"notice":"Gets the supported tokens for a destination chain"}},"notice":"Interface for Chainlink CCIP Router Client","version":1}},"settings":{"compilationTarget":{"contracts/ccip/IRouterClient.sol":"IRouterClient"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTBzTSwzFEH7DegX98HApAZkSLQJn6vCkdXypbioMwBNC/archive-info.json b/verification-sources/chain138-metadata-archive/QmTBzTSwzFEH7DegX98HApAZkSLQJn6vCkdXypbioMwBNC/archive-info.json new file mode 100644 index 0000000..17d7021 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTBzTSwzFEH7DegX98HApAZkSLQJn6vCkdXypbioMwBNC/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTBzTSwzFEH7DegX98HApAZkSLQJn6vCkdXypbioMwBNC", + "metadata_digest": "48128920d88870e000d1e8d7c1893fd110480b1605f9a52c2c4a74ff84b6a0e5", + "source_path": "contracts/bridge/atomic/AtomicSlashingManager.sol", + "contract_name": "AtomicSlashingManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTBzTSwzFEH7DegX98HApAZkSLQJn6vCkdXypbioMwBNC/metadata.json b/verification-sources/chain138-metadata-archive/QmTBzTSwzFEH7DegX98HApAZkSLQJn6vCkdXypbioMwBNC/metadata.json new file mode 100644 index 0000000..00c2c3c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTBzTSwzFEH7DegX98HApAZkSLQJn6vCkdXypbioMwBNC/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"fulfillerRegistry_","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"bytes32","name":"reason","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ObligationSlashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"COORDINATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fulfillerRegistry","outputs":[{"internalType":"contract IAtomicFulfillerRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32","name":"reason","type":"bytes32"}],"name":"slash","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/AtomicSlashingManager.sol":"AtomicSlashingManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/atomic/AtomicSlashingManager.sol":{"keccak256":"0x032d17693a83532b96811ab2a6d074fc7f633f9b3bcd0d068573b4154ad17e03","license":"MIT","urls":["bzz-raw://9a04ff170fc789959b32aac35c78e526d7bb4120524e9f83104e5e15c65e33e6","dweb:/ipfs/QmV93uTcENLGAWdPsRWmLr7t2eiRWhHn3KdLKLvdKNvxfv"]},"contracts/bridge/atomic/interfaces/IAtomicFulfillerRegistry.sol":{"keccak256":"0xdd5c9766af720fb2b40a8e5232b818004999ab640e0420fd4cfd6198fdc9bf56","license":"MIT","urls":["bzz-raw://20a172cfc8b4a54f94bd889d464a84530467ab11085748437158368d931d828d","dweb:/ipfs/QmUKBHadjvVmiSc3cxBcMCg8496hpqFS1gEi4vhQJvj7R7"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTHDzAudcfo1Ng9mCkTzRF3finFBQD2M9W5bSTJpEj9Vc/archive-info.json b/verification-sources/chain138-metadata-archive/QmTHDzAudcfo1Ng9mCkTzRF3finFBQD2M9W5bSTJpEj9Vc/archive-info.json new file mode 100644 index 0000000..8207527 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTHDzAudcfo1Ng9mCkTzRF3finFBQD2M9W5bSTJpEj9Vc/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTHDzAudcfo1Ng9mCkTzRF3finFBQD2M9W5bSTJpEj9Vc", + "metadata_digest": "4969bce071000df894f5dd021556e7910a89498b01d09edc5ef81b0811a33c9b", + "source_path": "contracts/vendor/uniswap-v2-periphery/libraries/UniswapV2Library.sol", + "contract_name": "UniswapV2Library", + "compiler": "0.6.6", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/fafa493132a3d2f65cdfc44051edfddd.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTHDzAudcfo1Ng9mCkTzRF3finFBQD2M9W5bSTJpEj9Vc/metadata.json b/verification-sources/chain138-metadata-archive/QmTHDzAudcfo1Ng9mCkTzRF3finFBQD2M9W5bSTJpEj9Vc/metadata.json new file mode 100644 index 0000000..e263863 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTHDzAudcfo1Ng9mCkTzRF3finFBQD2M9W5bSTJpEj9Vc/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.6+commit.6c089d02"},"language":"Solidity","output":{"abi":[],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/libraries/UniswapV2Library.sol":"UniswapV2Library"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x7c9bc70e5996c763e02ff38905282bc24fb242b0ef2519a003b36824fc524a4b","urls":["bzz-raw://85d5ad2dd23ee127f40907a12865a1e8cb5828814f6f2480285e1827dd72dedf","dweb:/ipfs/QmayKQWJgWmr46DqWseADyUanmqxh662hPNdAkdHRjiQQH"]},"contracts/vendor/uniswap-v2-periphery/libraries/SafeMath.sol":{"keccak256":"0x27f0ea82f879b3b01387b583e6d9d0ec858dca3b22b0aad173f8fbda06e761e1","urls":["bzz-raw://0db9cf37793eb7035f0bfced36323d240f0212150009c39a3a108701d9b50b6c","dweb:/ipfs/QmUAdiG9XNcieXkKfiMB49zQqD34FbXFE15csV2KQzwEqg"]},"contracts/vendor/uniswap-v2-periphery/libraries/UniswapV2Library.sol":{"keccak256":"0x32e87dbc83f43c624632f190dc2f942e9b6abbdbd0394f0340f26f326c0b2f67","urls":["bzz-raw://bcf991c5656366d118f383331c4d2513bf4d3359690a8b426edf29fcd112ec46","dweb:/ipfs/QmPqWMDzAxGhNqGXnC7WU9CpzGza8pzMmor6NC1SRZPxGq"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTKUxDahxBrXzxWTATtWJbELcN54DHZf2xE5S22fFvmg9/archive-info.json b/verification-sources/chain138-metadata-archive/QmTKUxDahxBrXzxWTATtWJbELcN54DHZf2xE5S22fFvmg9/archive-info.json new file mode 100644 index 0000000..213330b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTKUxDahxBrXzxWTATtWJbELcN54DHZf2xE5S22fFvmg9/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTKUxDahxBrXzxWTATtWJbELcN54DHZf2xE5S22fFvmg9", + "metadata_digest": "49fdd266c82bc402fa300ba81020d07ea25e677f886e8c7a05cc6c37d90dafb6", + "source_path": "contracts/dex/DVMFactoryAdapter.sol", + "contract_name": "DVMFactoryAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTKUxDahxBrXzxWTATtWJbELcN54DHZf2xE5S22fFvmg9/metadata.json b/verification-sources/chain138-metadata-archive/QmTKUxDahxBrXzxWTATtWJbELcN54DHZf2xE5S22fFvmg9/metadata.json new file mode 100644 index 0000000..9ec472a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTKUxDahxBrXzxWTATtWJbELcN54DHZf2xE5S22fFvmg9/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_dodoFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"createDVM","outputs":[{"internalType":"address","name":"dvm","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dodoFactory","outputs":[{"internalType":"contract IDVMFactoryOfficial","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dex/DVMFactoryAdapter.sol":"DVMFactoryAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/dex/DVMFactoryAdapter.sol":{"keccak256":"0x021884d951cf53f598fdae1cabf66cf315953d1cb942ef020176c748bd60b7d1","license":"MIT","urls":["bzz-raw://ce87f60894385b4f9c528fb48c2dd5ee3965508c59907afce9f5a6d1fd3d3e9c","dweb:/ipfs/QmWoLoBpjjvP2Qs4ak4maw99xxqbSBr99RNRwo1ge7gDWU"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTMVLoWXt6tJ5BANtLXhhUEGbs56hFsJn2ZjpLkBVh9Ld/archive-info.json b/verification-sources/chain138-metadata-archive/QmTMVLoWXt6tJ5BANtLXhhUEGbs56hFsJn2ZjpLkBVh9Ld/archive-info.json new file mode 100644 index 0000000..fcadf8b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTMVLoWXt6tJ5BANtLXhhUEGbs56hFsJn2ZjpLkBVh9Ld/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmTMVLoWXt6tJ5BANtLXhhUEGbs56hFsJn2ZjpLkBVh9Ld", + "metadata_digest": "4a816c7d87251c7fab17a1321f72702df7f73c37b2290a0580d63a88cd11c912", + "source_path": "contracts/vendor/sushiswap-v2/libraries/Math.sol", + "contract_name": "Math", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTMVLoWXt6tJ5BANtLXhhUEGbs56hFsJn2ZjpLkBVh9Ld/metadata.json b/verification-sources/chain138-metadata-archive/QmTMVLoWXt6tJ5BANtLXhhUEGbs56hFsJn2ZjpLkBVh9Ld/metadata.json new file mode 100644 index 0000000..3f67f2b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTMVLoWXt6tJ5BANtLXhhUEGbs56hFsJn2ZjpLkBVh9Ld/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/libraries/Math.sol":"Math"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/libraries/Math.sol":{"keccak256":"0x3e0a5520297ed1dc711407fb10e309db409fc8143e19a0a7751aa064bb99dfa1","license":"GPL-3.0","urls":["bzz-raw://5d44428171de5cd02c255aebd53d88e78cfee0b877bc1a13bbafa6e83eb0597d","dweb:/ipfs/QmXLVkrxEpA57vgP2CYh26PPGqaFy8C5peKKSdLobfCv31"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTRy33cYVTLnFC2caWRKrcc4TQ8EBRz2FBB2f3gi12e2G/archive-info.json b/verification-sources/chain138-metadata-archive/QmTRy33cYVTLnFC2caWRKrcc4TQ8EBRz2FBB2f3gi12e2G/archive-info.json new file mode 100644 index 0000000..2ba3850 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTRy33cYVTLnFC2caWRKrcc4TQ8EBRz2FBB2f3gi12e2G/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTRy33cYVTLnFC2caWRKrcc4TQ8EBRz2FBB2f3gi12e2G", + "metadata_digest": "4ba70f80de27813b2aca33a59c9fb13adad4bcd6235409f9dffb7c00b966b805", + "source_path": "contracts/wrapped-lp-public/WrappedLPNAVVault.sol", + "contract_name": "WrappedLPNAVVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTRy33cYVTLnFC2caWRKrcc4TQ8EBRz2FBB2f3gi12e2G/metadata.json b/verification-sources/chain138-metadata-archive/QmTRy33cYVTLnFC2caWRKrcc4TQ8EBRz2FBB2f3gi12e2G/metadata.json new file mode 100644 index 0000000..8c07695 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTRy33cYVTLnFC2caWRKrcc4TQ8EBRz2FBB2f3gi12e2G/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IERC20","name":"asset_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxDeposit","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxMint","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxRedeem","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxWithdraw","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"MathOverflowedMulDiv","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"CAP_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"}],"name":"setDepositCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Strategy deployment of vault assets into Chain 138 LP is **operational** (outside this contract). Use `depositCap` for soft-launch; seed initial deposit to mitigate donation attacks per OZ ERC4626 docs.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC4626ExceededMaxDeposit(address,uint256,uint256)":[{"details":"Attempted to deposit more assets than the max amount for `receiver`."}],"ERC4626ExceededMaxMint(address,uint256,uint256)":[{"details":"Attempted to mint more shares than the max amount for `receiver`."}],"ERC4626ExceededMaxRedeem(address,uint256,uint256)":[{"details":"Attempted to redeem more shares than the max amount for `receiver`."}],"ERC4626ExceededMaxWithdraw(address,uint256,uint256)":[{"details":"Attempted to withdraw more assets than the max amount for `receiver`."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"MathOverflowedMulDiv()":[{"details":"Muldiv operation overflow."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"asset()":{"details":"See {IERC4626-asset}. "},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"convertToAssets(uint256)":{"details":"See {IERC4626-convertToAssets}. "},"convertToShares(uint256)":{"details":"See {IERC4626-convertToShares}. "},"decimals()":{"details":"Decimals are computed by adding the decimal offset on top of the underlying asset's decimals. This \"original\" value is cached during construction of the vault contract. If this read operation fails (e.g., the asset has not been created yet), a default of 18 is used to represent the underlying asset's decimals. See {IERC20Metadata-decimals}."},"deposit(uint256,address)":{"details":"See {IERC4626-deposit}. "},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"maxDeposit(address)":{"details":"See {IERC4626-maxDeposit}. "},"maxMint(address)":{"details":"See {IERC4626-maxMint}. "},"maxRedeem(address)":{"details":"See {IERC4626-maxRedeem}. "},"maxWithdraw(address)":{"details":"See {IERC4626-maxWithdraw}. "},"mint(uint256,address)":{"details":"See {IERC4626-mint}. As opposed to {deposit}, minting is allowed even if the vault is in a state where the price of a share is zero. In this case, the shares will be minted without requiring any assets to be deposited."},"name()":{"details":"Returns the name of the token."},"previewDeposit(uint256)":{"details":"See {IERC4626-previewDeposit}. "},"previewMint(uint256)":{"details":"See {IERC4626-previewMint}. "},"previewRedeem(uint256)":{"details":"See {IERC4626-previewRedeem}. "},"previewWithdraw(uint256)":{"details":"See {IERC4626-previewWithdraw}. "},"redeem(uint256,address,address)":{"details":"See {IERC4626-redeem}. "},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalAssets()":{"details":"See {IERC4626-totalAssets}. "},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"withdraw(uint256,address,address)":{"details":"See {IERC4626-withdraw}. "}},"title":"WrappedLPNAVVault","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Option B scaffold: standard ERC-4626 vault over an underlying asset (e.g. USDC on mainnet).","version":1}},"settings":{"compilationTarget":{"contracts/wrapped-lp-public/WrappedLPNAVVault.sol":"WrappedLPNAVVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC4626.sol":{"keccak256":"0x207f64371bc0fcc5be86713aa5da109a870cc3a6da50e93b64ee881e369b593d","license":"MIT","urls":["bzz-raw://548667cfa76683767c2c610b577f6c2f0675d0ce28f53c3f37b969c84a56b205","dweb:/ipfs/QmUzA1CKC6bDdULuS44wGd7PWBNLiHb6bh7oHwJBDZSLAx"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol":{"keccak256":"0x1837547e04d5fe5334eeb77a345683c22995f1e7aa033020757ddf83a80fc72d","license":"MIT","urls":["bzz-raw://40d6031bc0e6f70edceb4e63fd624fe6be09dc48f5201c7a9078c26e6a9ef95f","dweb:/ipfs/QmPTEBH7dmU3NgE6vtjMy7xEK54as9VHSgf9ojupwnvoke"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"contracts/wrapped-lp-public/WrappedLPNAVVault.sol":{"keccak256":"0x995d336f7eb3034521f649c2e6d927f9dab09c3166cc73aeff33199c828fd65e","license":"MIT","urls":["bzz-raw://f9c8bbeb4d20ec12f914b8884e638330cbcd79e99781fc157ebdbdfc17fa1e64","dweb:/ipfs/QmVjWvNJsSFPyFVyBMk8yXgD2opnXokVK2uJhra2huBDZe"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTT1a5hnvsKBj1zvMsgcyvGa5UEN4urTiV2bHVx1RGrV7/archive-info.json b/verification-sources/chain138-metadata-archive/QmTT1a5hnvsKBj1zvMsgcyvGa5UEN4urTiV2bHVx1RGrV7/archive-info.json new file mode 100644 index 0000000..f351c0f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTT1a5hnvsKBj1zvMsgcyvGa5UEN4urTiV2bHVx1RGrV7/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTT1a5hnvsKBj1zvMsgcyvGa5UEN4urTiV2bHVx1RGrV7", + "metadata_digest": "4beb8200888ba2912459ce3bd029a15359bdfbdc086676d5a7c9725c9d0fa1da", + "source_path": "contracts/tokens/CompliantMonetaryUnitToken.sol", + "contract_name": "CompliantMonetaryUnitToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTT1a5hnvsKBj1zvMsgcyvGa5UEN4urTiV2bHVx1RGrV7/metadata.json b/verification-sources/chain138-metadata-archive/QmTT1a5hnvsKBj1zvMsgcyvGa5UEN4urTiV2bHVx1RGrV7/metadata.json new file mode 100644 index 0000000..a22fd58 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTT1a5hnvsKBj1zvMsgcyvGa5UEN4urTiV2bHVx1RGrV7/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"string","name":"unitCode_","type":"string"},{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"initialSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mechanism","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisputeResolutionMechanismSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"JurisdictionDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LegalNotice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"ValueTransferDeclared","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISPUTE_RESOLUTION_MECHANISM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_ARBITRATION_SUPPORT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_TRADE_TERMS_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_UNIFORM_RULES_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTRUMENT_CLASSIFICATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_20022_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_27001_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_3166_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_4217_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_8601_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_ENFORCEABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_FRAMEWORK_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_JURISDICTION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATORY_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_OF_PROCESS_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFERABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAVEL_RULE_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMonetaryUnit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"recordLegalNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unitCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Mirrors the compliant fiat token controls while keeping monetary-unit metadata separate from ISO-4217 and commodity classifications.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"name()":{"details":"Returns the name of the token."},"owner()":{"details":"Returns the address of the current owner."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"recordLegalNotice(string)":{"params":{"message":"The legal notice message"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"CompliantMonetaryUnitToken","version":1},"userdoc":{"kind":"user","methods":{"recordLegalNotice(string)":{"notice":"Record a legal notice"}},"notice":"Generic GRU monetary-unit token for non-ISO units such as BTC.","version":1}},"settings":{"compilationTarget":{"contracts/tokens/CompliantMonetaryUnitToken.sol":"CompliantMonetaryUnitToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/compliance/LegallyCompliantBase.sol":{"keccak256":"0x60b62492c7ad1f613a6070f38b3e6849d7a52d63dd68254bd95f96e733f74bb1","license":"MIT","urls":["bzz-raw://abcea0d6b1835eaccbd2b9eceaa1f04e3665fbdf3f2a61bcc52709e783a8ba51","dweb:/ipfs/Qmc8M9VQ2k2QP4UBXcjGfWQAojbmxNYUBVwNBfHSLFRorw"]},"contracts/tokens/CompliantMonetaryUnitToken.sol":{"keccak256":"0x3107f1bac72b114e549db31c36cc56496d70455595ccb9c5258d4f8e72599510","license":"MIT","urls":["bzz-raw://136c706a21e92bf76a75133e19097e806208490fb7139b934b531d55f6793bd1","dweb:/ipfs/QmWiigCEJjf7hpebqFHhVtKNh12TAoZBsuyqMeqrbRDbFM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTVPNyLn3LjPn7gnnmrcH9Tsjk48dQNY31B4U8uWD5nrB/archive-info.json b/verification-sources/chain138-metadata-archive/QmTVPNyLn3LjPn7gnnmrcH9Tsjk48dQNY31B4U8uWD5nrB/archive-info.json new file mode 100644 index 0000000..c3fefce --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTVPNyLn3LjPn7gnnmrcH9Tsjk48dQNY31B4U8uWD5nrB/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTVPNyLn3LjPn7gnnmrcH9Tsjk48dQNY31B4U8uWD5nrB", + "metadata_digest": "4c87540dd0be71beb7c51590c638d76e7e8c12c95e0be1e2f44646f5c73bf278", + "source_path": "contracts/iso4217w/interfaces/ITokenRegistry.sol", + "contract_name": "ITokenRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTVPNyLn3LjPn7gnnmrcH9Tsjk48dQNY31B4U8uWD5nrB/metadata.json b/verification-sources/chain138-metadata-archive/QmTVPNyLn3LjPn7gnnmrcH9Tsjk48dQNY31B4U8uWD5nrB/metadata.json new file mode 100644 index 0000000..4b9019e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTVPNyLn3LjPn7gnnmrcH9Tsjk48dQNY31B4U8uWD5nrB/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":true,"internalType":"address","name":"custodian","type":"address"}],"name":"TokenRegistered","type":"event"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"deactivateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getTokenInfo","outputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"custodian","type":"address"},{"internalType":"address","name":"mintController","type":"address"},{"internalType":"address","name":"burnController","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"internalType":"struct ITokenRegistry.TokenInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"registered","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"custodian","type":"address"}],"name":"registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"address","name":"burnController","type":"address"}],"name":"setBurnController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"address","name":"mintController","type":"address"}],"name":"setMintController","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Canonical registry mapping ISO-4217 codes to token addresses","kind":"dev","methods":{"deactivateToken(string)":{"params":{"currencyCode":"ISO-4217 currency code"}},"getTokenAddress(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"tokenAddress":"Token contract address"}},"getTokenInfo(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"info":"Token information"}},"isRegistered(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"registered":"True if registered"}},"registerToken(string,address,string,uint8,address)":{"params":{"currencyCode":"ISO-4217 currency code (must be valid ISO-4217)","custodian":"Custodian address","decimals":"Token decimals (typically 2 for fiat currencies)","tokenAddress":"Token contract address","tokenSymbol":"Token symbol (should be W format)"}},"setBurnController(string,address)":{"params":{"burnController":"Burn controller address","currencyCode":"ISO-4217 currency code"}},"setMintController(string,address)":{"params":{"currencyCode":"ISO-4217 currency code","mintController":"Mint controller address"}}},"title":"ITokenRegistry","version":1},"userdoc":{"kind":"user","methods":{"deactivateToken(string)":{"notice":"Deactivate a token (emergency)"},"getTokenAddress(string)":{"notice":"Get token address for ISO-4217 code"},"getTokenInfo(string)":{"notice":"Get token info for ISO-4217 code"},"isRegistered(string)":{"notice":"Check if currency code is registered"},"registerToken(string,address,string,uint8,address)":{"notice":"Register a new ISO-4217 W token"},"setBurnController(string,address)":{"notice":"Set burn controller for a token"},"setMintController(string,address)":{"notice":"Set mint controller for a token"}},"notice":"Interface for ISO-4217 W token registry","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/interfaces/ITokenRegistry.sol":"ITokenRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/iso4217w/interfaces/ITokenRegistry.sol":{"keccak256":"0x819a713049356cfd7a265358d9c16813dc6e2bbac73b8ed6ff6e594250333464","license":"MIT","urls":["bzz-raw://b6010875dce14843a813a5f9a3437a140a8b84196af364672731b470729ac108","dweb:/ipfs/QmVUkBiHpgf4gWpAHayZ474My6C74T9eZvpqW9rs5MyuAn"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTVRs6QJMmPeDezVMQzMxvb29WK9c7k7LzVDFhuVC94tE/archive-info.json b/verification-sources/chain138-metadata-archive/QmTVRs6QJMmPeDezVMQzMxvb29WK9c7k7LzVDFhuVC94tE/archive-info.json new file mode 100644 index 0000000..b81ee78 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTVRs6QJMmPeDezVMQzMxvb29WK9c7k7LzVDFhuVC94tE/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTVRs6QJMmPeDezVMQzMxvb29WK9c7k7LzVDFhuVC94tE", + "metadata_digest": "4c8a235235c1061cd7d2dab446cc45c65bb69f17656a1cb43ba9d3f7dd1ac877", + "source_path": "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol", + "contract_name": "SafeERC20", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTVRs6QJMmPeDezVMQzMxvb29WK9c7k7LzVDFhuVC94tE/metadata.json b/verification-sources/chain138-metadata-archive/QmTVRs6QJMmPeDezVMQzMxvb29WK9c7k7LzVDFhuVC94tE/metadata.json new file mode 100644 index 0000000..2aadfff --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTVRs6QJMmPeDezVMQzMxvb29WK9c7k7LzVDFhuVC94tE/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"SafeERC20FailedDecreaseAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"}],"devdoc":{"details":"Wrappers around ERC20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.","errors":{"SafeERC20FailedDecreaseAllowance(address,uint256,uint256)":[{"details":"Indicates a failed `decreaseAllowance` request."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"SafeERC20","version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":"SafeERC20"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTYKQKMZXF6orLMRTztKFGTUHJHPkfzhaADrDQY2e6GJb/archive-info.json b/verification-sources/chain138-metadata-archive/QmTYKQKMZXF6orLMRTztKFGTUHJHPkfzhaADrDQY2e6GJb/archive-info.json new file mode 100644 index 0000000..1e6a639 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTYKQKMZXF6orLMRTztKFGTUHJHPkfzhaADrDQY2e6GJb/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTYKQKMZXF6orLMRTztKFGTUHJHPkfzhaADrDQY2e6GJb", + "metadata_digest": "4d4792fcd53241e63d80a9c63c2a38580cab0d4af9f1eaa180738a37682d2610", + "source_path": "contracts/bridge/trustless/adapters/CurveRouteExecutorAdapter.sol", + "contract_name": "CurveRouteExecutorAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTYKQKMZXF6orLMRTztKFGTUHJHPkfzhaADrDQY2e6GJb/metadata.json b/verification-sources/chain138-metadata-archive/QmTYKQKMZXF6orLMRTztKFGTUHJHPkfzhaADrDQY2e6GJb/metadata.json new file mode 100644 index 0000000..d6aa258 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTYKQKMZXF6orLMRTztKFGTUHJHPkfzhaADrDQY2e6GJb/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"execute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"}],"name":"validate","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"pure","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/adapters/CurveRouteExecutorAdapter.sol":"CurveRouteExecutorAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/adapters/CurveRouteExecutorAdapter.sol":{"keccak256":"0xf9f826dd959667ddd6bbaa09666deca2ce3ccff8e6288aab396833ad2135ac52","license":"MIT","urls":["bzz-raw://d1cb0c9bcfce89a2616fa09be4d9ce3f2530eb54ab362e9bd60bc478f3a5cd4b","dweb:/ipfs/QmVChEuNPDWB48jkcVQESAie1N2QDjLimi7FYv7uC1ZyUs"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTfBCW5qWYY7hZVuLxjXPYbf1eFymDeb7HHC3g8c1HAe7/archive-info.json b/verification-sources/chain138-metadata-archive/QmTfBCW5qWYY7hZVuLxjXPYbf1eFymDeb7HHC3g8c1HAe7/archive-info.json new file mode 100644 index 0000000..52b440f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTfBCW5qWYY7hZVuLxjXPYbf1eFymDeb7HHC3g8c1HAe7/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTfBCW5qWYY7hZVuLxjXPYbf1eFymDeb7HHC3g8c1HAe7", + "metadata_digest": "4f095d26c17365cc64fb8493f82346131925dfb2f0a3f8cdc3aaf5c433eb9b4c", + "source_path": "contracts/bridge/trustless/libraries/MerkleProofVerifier.sol", + "contract_name": "MerkleProofVerifier", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTfBCW5qWYY7hZVuLxjXPYbf1eFymDeb7HHC3g8c1HAe7/metadata.json b/verification-sources/chain138-metadata-archive/QmTfBCW5qWYY7hZVuLxjXPYbf1eFymDeb7HHC3g8c1HAe7/metadata.json new file mode 100644 index 0000000..4b41e99 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTfBCW5qWYY7hZVuLxjXPYbf1eFymDeb7HHC3g8c1HAe7/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"details":"Supports verification of deposit existence/non-existence in source chain state","kind":"dev","methods":{},"title":"MerkleProofVerifier","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Library for verifying Merkle proofs for trustless bridge fraud proofs","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/libraries/MerkleProofVerifier.sol":"MerkleProofVerifier"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/libraries/MerkleProofVerifier.sol":{"keccak256":"0x8d92e319d3f83a0e4218d89b598ed86c478a446b4e9271fa1d284842a1aca82b","license":"MIT","urls":["bzz-raw://2aad9a1e47f6e7177b8e7f77ebbb4f9bb32df02f43d07edbd76b7442d49f4e87","dweb:/ipfs/QmXdaJGiAXHqAW9d1zEyBY1vzJhoUaFhzFdPGsxFRrnCLi"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmToo5fFumgKbwTanL6P6qWh1naQUSGTwz39tHDXES2FYM/archive-info.json b/verification-sources/chain138-metadata-archive/QmToo5fFumgKbwTanL6P6qWh1naQUSGTwz39tHDXES2FYM/archive-info.json new file mode 100644 index 0000000..7f76a28 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmToo5fFumgKbwTanL6P6qWh1naQUSGTwz39tHDXES2FYM/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmToo5fFumgKbwTanL6P6qWh1naQUSGTwz39tHDXES2FYM", + "metadata_digest": "513e95113ba1e5d091952bad1af3b5938a999d4b2c2aa20af438b04401d9f06a", + "source_path": "contracts/flash/AaveQuotePushFlashReceiver.sol", + "contract_name": "IAaveFlashLoanReceiver", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmToo5fFumgKbwTanL6P6qWh1naQUSGTwz39tHDXES2FYM/metadata.json b/verification-sources/chain138-metadata-archive/QmToo5fFumgKbwTanL6P6qWh1naQUSGTwz39tHDXES2FYM/metadata.json new file mode 100644 index 0000000..cd75a20 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmToo5fFumgKbwTanL6P6qWh1naQUSGTwz39tHDXES2FYM/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"premiums","type":"uint256[]"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Callback for `flashLoan` (multi-asset API).","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/AaveQuotePushFlashReceiver.sol":"IAaveFlashLoanReceiver"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/flash/AaveQuotePushFlashReceiver.sol":{"keccak256":"0x9648a35f371bb79c4782933d66237ee759ab4d546950bf79489c87091ff5d7e5","license":"MIT","urls":["bzz-raw://e4360e49daf3f2ac0a7f0299d0083479909f5ae30de80ad647b37421f4d871c8","dweb:/ipfs/QmVAkMWwMEJwFQ5ELSLJhhoxM6oSPUpkrjTzEZkMH5cdh7"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTuBJEEPQs4zY2S52GYadsjr84poovB6i8CBFsgbUTYhC/archive-info.json b/verification-sources/chain138-metadata-archive/QmTuBJEEPQs4zY2S52GYadsjr84poovB6i8CBFsgbUTYhC/archive-info.json new file mode 100644 index 0000000..5d82704 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTuBJEEPQs4zY2S52GYadsjr84poovB6i8CBFsgbUTYhC/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTuBJEEPQs4zY2S52GYadsjr84poovB6i8CBFsgbUTYhC", + "metadata_digest": "529f9b59e8b0d78ff2d3a414b74ffbbf562ce125ec2ff5dfac13d653cfd9ef37", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router02.sol", + "contract_name": "IUniswapV2Router02", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTuBJEEPQs4zY2S52GYadsjr84poovB6i8CBFsgbUTYhC/metadata.json b/verification-sources/chain138-metadata-archive/QmTuBJEEPQs4zY2S52GYadsjr84poovB6i8CBFsgbUTYhC/metadata.json new file mode 100644 index 0000000..29dee86 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTuBJEEPQs4zY2S52GYadsjr84poovB6i8CBFsgbUTYhC/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router02.sol":"IUniswapV2Router02"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router01.sol":{"keccak256":"0x12091adc186fe351c639dc62aa0b691f78c7bea054c27bbb4b58acd02e1b2ce7","license":"GPL-3.0","urls":["bzz-raw://e7a3f1b86be061741f5483f0f153389aa9e89a24a1556c8784df44ce288b5183","dweb:/ipfs/QmejsqRXse45aoyDjccfKEnZ1uZzdqUtjsYbAS3ThAMesu"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router02.sol":{"keccak256":"0x7e588378c1076243506b8164132e0dcccd468f31edb933a88ddb8d6c4063ab30","license":"GPL-3.0","urls":["bzz-raw://da8233b51c721065562eca1bf774963b4d881f8df26de34c9e608233cd5fd557","dweb:/ipfs/QmRVgpFroy1ofrMdsXU3eiyhmsot3haCLtevUsRt3uPCpu"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTxA43aGvSth68joA3UsjKMrU2W4CYx4P3RQGCC95eJMY/archive-info.json b/verification-sources/chain138-metadata-archive/QmTxA43aGvSth68joA3UsjKMrU2W4CYx4P3RQGCC95eJMY/archive-info.json new file mode 100644 index 0000000..32f674c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTxA43aGvSth68joA3UsjKMrU2W4CYx4P3RQGCC95eJMY/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTxA43aGvSth68joA3UsjKMrU2W4CYx4P3RQGCC95eJMY", + "metadata_digest": "5362f12a6f79ef591b44fd791cd5e1a636bc101aa79257e5004e2df8bb54fa53", + "source_path": "@openzeppelin/contracts/utils/ReentrancyGuard.sol", + "contract_name": "ReentrancyGuard", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTxA43aGvSth68joA3UsjKMrU2W4CYx4P3RQGCC95eJMY/metadata.json b/verification-sources/chain138-metadata-archive/QmTxA43aGvSth68joA3UsjKMrU2W4CYx4P3RQGCC95eJMY/metadata.json new file mode 100644 index 0000000..d4ae61a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTxA43aGvSth68joA3UsjKMrU2W4CYx4P3RQGCC95eJMY/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"}],"devdoc":{"details":"Contract module that helps prevent reentrant calls to a function. Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier available, which can be applied to functions to make sure there are no nested (reentrant) calls to them. Note that because there is a single `nonReentrant` guard, functions marked as `nonReentrant` may not call one another. This can be worked around by making those functions `private`, and then adding `external` `nonReentrant` entry points to them. TIP: If you would like to learn more about reentrancy and alternative ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].","errors":{"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/ReentrancyGuard.sol":"ReentrancyGuard"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmTxt2yYTbm64yfJraSR1uMrbkVNNJVPBvEHLXQQj1AVFg/archive-info.json b/verification-sources/chain138-metadata-archive/QmTxt2yYTbm64yfJraSR1uMrbkVNNJVPBvEHLXQQj1AVFg/archive-info.json new file mode 100644 index 0000000..2c4b0d6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTxt2yYTbm64yfJraSR1uMrbkVNNJVPBvEHLXQQj1AVFg/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmTxt2yYTbm64yfJraSR1uMrbkVNNJVPBvEHLXQQj1AVFg", + "metadata_digest": "5392692741f6ad6ab4cde8acd7baf20acf7797e4feafe54e2c8503e355a0102b", + "source_path": "contracts/bridge/CWMultiTokenBridgeL2.sol", + "contract_name": "ICWMintBurnToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmTxt2yYTbm64yfJraSR1uMrbkVNNJVPBvEHLXQQj1AVFg/metadata.json b/verification-sources/chain138-metadata-archive/QmTxt2yYTbm64yfJraSR1uMrbkVNNJVPBvEHLXQQj1AVFg/metadata.json new file mode 100644 index 0000000..6e45f0b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmTxt2yYTbm64yfJraSR1uMrbkVNNJVPBvEHLXQQj1AVFg/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/CWMultiTokenBridgeL2.sol":"ICWMintBurnToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/CWMultiTokenBridgeL2.sol":{"keccak256":"0x7f988f285cb5797bb9a1e25812f15d9cce1526cf0edccbc22ec3053b69bee991","license":"MIT","urls":["bzz-raw://4cdc3d5c0c8b00914c5f1d127dbdb6ec3a64492128f6a8b3ca50eba4e7e08078","dweb:/ipfs/QmXqdaWFfL9kKSZZv5gP3qRdDXgSmfzwateDDtxybEQkej"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmU6WbZDEtk11gCz2UJsaLKy4WrTMh9twuF9yvdEBtW5N9/archive-info.json b/verification-sources/chain138-metadata-archive/QmU6WbZDEtk11gCz2UJsaLKy4WrTMh9twuF9yvdEBtW5N9/archive-info.json new file mode 100644 index 0000000..2fef2bc --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmU6WbZDEtk11gCz2UJsaLKy4WrTMh9twuF9yvdEBtW5N9/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmU6WbZDEtk11gCz2UJsaLKy4WrTMh9twuF9yvdEBtW5N9", + "metadata_digest": "5586d1207854008dbbb63305f1200f7326b98e504e76abe9452385c872762292", + "source_path": "contracts/compliance/ComplianceRegistry.sol", + "contract_name": "ComplianceRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmU6WbZDEtk11gCz2UJsaLKy4WrTMh9twuF9yvdEBtW5N9/metadata.json b/verification-sources/chain138-metadata-archive/QmU6WbZDEtk11gCz2UJsaLKy4WrTMh9twuF9yvdEBtW5N9/metadata.json new file mode 100644 index 0000000..96ea26f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmU6WbZDEtk11gCz2UJsaLKy4WrTMh9twuF9yvdEBtW5N9/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bytes32","name":"lastLegalNoticeHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ContractComplianceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"string","name":"legalFrameworkVersion","type":"string"},{"indexed":false,"internalType":"string","name":"legalJurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ContractRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTRAR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"getContractComplianceStatus","outputs":[{"components":[{"internalType":"bool","name":"isRegistered","type":"bool"},{"internalType":"string","name":"legalFrameworkVersion","type":"string"},{"internalType":"string","name":"legalJurisdiction","type":"string"},{"internalType":"bytes32","name":"lastLegalNoticeHash","type":"bytes32"},{"internalType":"uint256","name":"registeredAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"internalType":"struct ComplianceRegistry.ContractComplianceStatus","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"isContractRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"registerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bytes32","name":"newLegalNoticeHash","type":"bytes32"}],"name":"updateContractCompliance","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This registry tracks contracts that inherit from LegallyCompliantBase Separate from eMoney ComplianceRegistry which has KYC/AML features","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"constructor":{"params":{"admin":"Address that will receive DEFAULT_ADMIN_ROLE"}},"getContractComplianceStatus(address)":{"params":{"contractAddress":"Address of the contract"},"returns":{"_0":"Compliance status struct"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isContractRegistered(address)":{"params":{"contractAddress":"Address of the contract"},"returns":{"_0":"True if registered, false otherwise"}},"registerContract(address)":{"details":"Requires REGISTRAR_ROLE","params":{"contractAddress":"Address of the compliant contract"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"updateContractCompliance(address,bytes32)":{"details":"Requires REGISTRAR_ROLE","params":{"contractAddress":"Address of the compliant contract","newLegalNoticeHash":"Hash of the new legal notice"}}},"title":"ComplianceRegistry","version":1},"userdoc":{"kind":"user","methods":{"constructor":{"notice":"Constructor"},"getContractComplianceStatus(address)":{"notice":"Get compliance status for a contract"},"isContractRegistered(address)":{"notice":"Check if a contract is registered"},"registerContract(address)":{"notice":"Register a contract that inherits from LegallyCompliantBase"},"updateContractCompliance(address,bytes32)":{"notice":"Update compliance status with a new legal notice"}},"notice":"Registry for tracking legal compliance status of contracts","version":1}},"settings":{"compilationTarget":{"contracts/compliance/ComplianceRegistry.sol":"ComplianceRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/compliance/ComplianceRegistry.sol":{"keccak256":"0x8d76085691e2e34f9bd51da5bcd50bdca51c4abc4034c1f2bfc77da6ade9b1c6","license":"MIT","urls":["bzz-raw://a78552fa9f040b7af2e2b42f305127bde6c8c84299d56abf2e0dbfcb0dcb2dec","dweb:/ipfs/QmZGMbpZnT7yzPJXVrZNzNxvP8MSECep91Bjwesy8Q6qum"]},"contracts/compliance/LegallyCompliantBase.sol":{"keccak256":"0x60b62492c7ad1f613a6070f38b3e6849d7a52d63dd68254bd95f96e733f74bb1","license":"MIT","urls":["bzz-raw://abcea0d6b1835eaccbd2b9eceaa1f04e3665fbdf3f2a61bcc52709e783a8ba51","dweb:/ipfs/Qmc8M9VQ2k2QP4UBXcjGfWQAojbmxNYUBVwNBfHSLFRorw"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmU6aQw2t4L5EFGfqKkq2hMN8nQPPkJDC7Nn7WECfthU8g/archive-info.json b/verification-sources/chain138-metadata-archive/QmU6aQw2t4L5EFGfqKkq2hMN8nQPPkJDC7Nn7WECfthU8g/archive-info.json new file mode 100644 index 0000000..0417af1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmU6aQw2t4L5EFGfqKkq2hMN8nQPPkJDC7Nn7WECfthU8g/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmU6aQw2t4L5EFGfqKkq2hMN8nQPPkJDC7Nn7WECfthU8g", + "metadata_digest": "558b21f286dc93d67a7d4508c67d8a330f0c0fdbda0363bfafec504f67cf2cf9", + "source_path": "contracts/bridge/trustless/interfaces/IDodoexRouter.sol", + "contract_name": "IDodoexRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmU6aQw2t4L5EFGfqKkq2hMN8nQPPkJDC7Nn7WECfthU8g/metadata.json b/verification-sources/chain138-metadata-archive/QmU6aQw2t4L5EFGfqKkq2hMN8nQPPkJDC7Nn7WECfthU8g/metadata.json new file mode 100644 index 0000000..81e8d02 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmU6aQw2t4L5EFGfqKkq2hMN8nQPPkJDC7Nn7WECfthU8g/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"isIncentive","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"internalType":"struct IDodoexRouter.DodoSwapParams","name":"params","type":"tuple"}],"name":"dodoSwapV2TokenToToken","outputs":[{"internalType":"uint256","name":"receivedAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"}],"name":"getDodoSwapQuote","outputs":[{"internalType":"uint256","name":"toTokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Dodoex uses PMM which provides better price discovery and lower slippage","kind":"dev","methods":{"dodoSwapV2TokenToToken((address,address,uint256,uint256,address[],uint256,bool,uint256))":{"params":{"params":"Swap parameters"},"returns":{"receivedAmount":"Amount received after swap"}},"getDodoSwapQuote(address,address,uint256)":{"params":{"fromToken":"Source token","fromTokenAmount":"Amount to swap","toToken":"Destination token"},"returns":{"toTokenAmount":"Expected output amount"}}},"title":"IDodoexRouter","version":1},"userdoc":{"kind":"user","methods":{"dodoSwapV2TokenToToken((address,address,uint256,uint256,address[],uint256,bool,uint256))":{"notice":"Swap tokens via Dodoex PMM"},"getDodoSwapQuote(address,address,uint256)":{"notice":"Get quote for swap (view function)"}},"notice":"Interface for Dodoex PMM (Proactive Market Maker) Router","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/interfaces/IDodoexRouter.sol":"IDodoexRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/interfaces/IDodoexRouter.sol":{"keccak256":"0x308f04c802c19b06ee0e627b07fc2ebeee50ac4ad5d716e2c0c83a61acab0b7b","license":"MIT","urls":["bzz-raw://4075ad950eee500921c9d32dbd3f34dc87a83ab52c9186e6d29d52a77b0757c7","dweb:/ipfs/QmcBtfPDmBbuPMEm9CoDUWY16kv6UErDi6Ay4oGGhkqC72"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmULWZZi6yLSyyxL825L5ZKJu7jkWfPs8Q6Ti8whtTVYxW/archive-info.json b/verification-sources/chain138-metadata-archive/QmULWZZi6yLSyyxL825L5ZKJu7jkWfPs8Q6Ti8whtTVYxW/archive-info.json new file mode 100644 index 0000000..ac45b96 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmULWZZi6yLSyyxL825L5ZKJu7jkWfPs8Q6Ti8whtTVYxW/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmULWZZi6yLSyyxL825L5ZKJu7jkWfPs8Q6Ti8whtTVYxW", + "metadata_digest": "591ce8ced8f6115ae308c226925751dd56ef5a1e295efbfd002b3d27f759e4cf", + "source_path": "contracts/relay/CCIPRelayRouter.sol", + "contract_name": "CCIPRelayRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmULWZZi6yLSyyxL825L5ZKJu7jkWfPs8Q6Ti8whtTVYxW/metadata.json b/verification-sources/chain138-metadata-archive/QmULWZZi6yLSyyxL825L5ZKJu7jkWfPs8Q6Ti8whtTVYxW/metadata.json new file mode 100644 index 0000000..7f702a8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmULWZZi6yLSyyxL825L5ZKJu7jkWfPs8Q6Ti8whtTVYxW/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bridge","type":"address"}],"name":"BridgeAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bridge","type":"address"}],"name":"BridgeRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"bridge","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MessageRelayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELAYER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bridge","type":"address"}],"name":"authorizeBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedBridges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"relayer","type":"address"}],"name":"grantRelayerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bridge","type":"address"},{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"relayMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bridge","type":"address"}],"name":"revokeBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"relayer","type":"address"}],"name":"revokeRelayerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract acts as a relay endpoint on the destination chain","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"relayMessage(address,(bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"params":{"bridge":"The bridge contract address to receive the message","message":"The CCIP message to relay"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"CCIP Relay Router","version":1},"userdoc":{"kind":"user","methods":{"authorizeBridge(address)":{"notice":"Authorize a bridge contract to receive relayed messages"},"grantRelayerRole(address)":{"notice":"Grant relayer role to an address"},"relayMessage(address,(bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"notice":"Relay a CCIP message to a bridge contract"},"revokeBridge(address)":{"notice":"Revoke authorization for a bridge contract"},"revokeRelayerRole(address)":{"notice":"Revoke relayer role from an address"}},"notice":"Relay router that forwards CCIP messages from off-chain relay to bridge contracts","version":1}},"settings":{"compilationTarget":{"contracts/relay/CCIPRelayRouter.sol":"CCIPRelayRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/relay/CCIPRelayRouter.sol":{"keccak256":"0x4b6a300611c0148111e2b9a4f1801cfbd2c1b8027aa0fa614bcfffb9bbfe138d","license":"MIT","urls":["bzz-raw://eca5ebcee48c7469965cbec7db3aaaf9797e67a3c4322e8b857fa50e7c735aef","dweb:/ipfs/QmRF8hE2mNVBd175RTNz7YMmCuBdmwz5xPNoPLLyuTdTon"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmUMZijY9hfVfaAqN6hkoQZxUUZ1VaJSKQAGYGEZYugQT9/archive-info.json b/verification-sources/chain138-metadata-archive/QmUMZijY9hfVfaAqN6hkoQZxUUZ1VaJSKQAGYGEZYugQT9/archive-info.json new file mode 100644 index 0000000..64e04af --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUMZijY9hfVfaAqN6hkoQZxUUZ1VaJSKQAGYGEZYugQT9/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmUMZijY9hfVfaAqN6hkoQZxUUZ1VaJSKQAGYGEZYugQT9", + "metadata_digest": "59620fa32d90793908f844fe6291d04a5c0f3c283668e24c6fd2a88b377e0f60", + "source_path": "contracts/bridge/atomic/AtomicSettlementRouter.sol", + "contract_name": "AtomicSettlementRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmUMZijY9hfVfaAqN6hkoQZxUUZ1VaJSKQAGYGEZYugQT9/metadata.json b/verification-sources/chain138-metadata-archive/QmUMZijY9hfVfaAqN6hkoQZxUUZ1VaJSKQAGYGEZYugQT9/metadata.json new file mode 100644 index 0000000..f992943 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUMZijY9hfVfaAqN6hkoQZxUUZ1VaJSKQAGYGEZYugQT9/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"MissingAdapter","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"settlementMode","type":"bytes32"},{"indexed":true,"internalType":"address","name":"adapter","type":"address"}],"name":"AdapterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"settlementMode","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"settlementId","type":"bytes32"}],"name":"SettlementExecuted","type":"event"},{"inputs":[],"name":"ADAPTER_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COORDINATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"adapters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"bytes32","name":"settlementMode","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeSettlement","outputs":[{"internalType":"bytes32","name":"settlementId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settlementMode","type":"bytes32"},{"internalType":"address","name":"adapter","type":"address"}],"name":"setAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/AtomicSettlementRouter.sol":"AtomicSettlementRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/atomic/AtomicSettlementRouter.sol":{"keccak256":"0xc360580846bb131594208af93d7647327a5cbd57c05747cdf6ccc2b876196b0e","license":"MIT","urls":["bzz-raw://652d593fe30f952deaad75b3bd4a453720b68b1464555c86e1375ac1aef91161","dweb:/ipfs/QmTUcwuoNKuUtxjzzfM3cAxf2pPweRSyhwkK4guSJGqdXU"]},"contracts/bridge/atomic/interfaces/IAtomicSettlementAdapter.sol":{"keccak256":"0x4277422986484c9f70c1748efbc4b211a7ff9c8d2327de8b3b9c923fad1abf8a","license":"MIT","urls":["bzz-raw://b61515a52067561730e08bc58aaf52d99a226c004d19dd4e7756142195e578ec","dweb:/ipfs/QmdBieKpqd7QdEPaPqXJDjH9m7o9LvMLVtLhGcpNBx8B15"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmURE8ybsxXXhNqWscTRY2qXhYTjySBsARiPMMiqbW4Y4n/archive-info.json b/verification-sources/chain138-metadata-archive/QmURE8ybsxXXhNqWscTRY2qXhYTjySBsARiPMMiqbW4Y4n/archive-info.json new file mode 100644 index 0000000..007c2c8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmURE8ybsxXXhNqWscTRY2qXhYTjySBsARiPMMiqbW4Y4n/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmURE8ybsxXXhNqWscTRY2qXhYTjySBsARiPMMiqbW4Y4n", + "metadata_digest": "5a523e2b947b0539cfb1c66e2ce80edb30be0f9d5b5f6b9ca39c34f9737ff73f", + "source_path": "contracts/flash/TwoHopDodoToUniswapV3MultiHopExternalUnwinder.sol", + "contract_name": "TwoHopDodoToUniswapV3MultiHopExternalUnwinder", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmURE8ybsxXXhNqWscTRY2qXhYTjySBsARiPMMiqbW4Y4n/metadata.json b/verification-sources/chain138-metadata-archive/QmURE8ybsxXXhNqWscTRY2qXhYTjySBsARiPMMiqbW4Y4n/metadata.json new file mode 100644 index 0000000..a23b109 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmURE8ybsxXXhNqWscTRY2qXhYTjySBsARiPMMiqbW4Y4n/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"integration_","type":"address"},{"internalType":"address","name":"router_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadParams","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"integration","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unwind","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"`data` = abi.encode( address poolA, address poolB, address midToken, uint256 minMidOut, address intermediateToken, uint256 minIntermediateOut, bytes uniswapPath ) Route shape: tokenIn --(poolA via DODO)--> midToken midToken --(poolB via DODO)--> intermediateToken intermediateToken --(Uniswap V3 path)--> tokenOut","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"TwoHopDodoToUniswapV3MultiHopExternalUnwinder","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Unwinds through two DODO PMM hops followed by a final Uniswap V3 exactInput path.","version":1}},"settings":{"compilationTarget":{"contracts/flash/TwoHopDodoToUniswapV3MultiHopExternalUnwinder.sol":"TwoHopDodoToUniswapV3MultiHopExternalUnwinder"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/flash/TwoHopDodoToUniswapV3MultiHopExternalUnwinder.sol":{"keccak256":"0x9e71ec9424770a39783dbf7fadde6c62c574cda2cd2a5258f3fc0985d6e37a79","license":"MIT","urls":["bzz-raw://2ea42fb0a3f86010828419c067a2fc06ef2e3a33390479d8b323362b83856128","dweb:/ipfs/Qmc6CtpNbGBtfb9Fjo9vC7aJaaU1p8tsAcCCc812JiLceL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmUVcwEPK2FgNnMaveWcscoRKh5iXkd5ThAYgfarvaJcHd/archive-info.json b/verification-sources/chain138-metadata-archive/QmUVcwEPK2FgNnMaveWcscoRKh5iXkd5ThAYgfarvaJcHd/archive-info.json new file mode 100644 index 0000000..ede4f3a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUVcwEPK2FgNnMaveWcscoRKh5iXkd5ThAYgfarvaJcHd/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmUVcwEPK2FgNnMaveWcscoRKh5iXkd5ThAYgfarvaJcHd", + "metadata_digest": "5b7257e2a3214bb34b6c2345d453fd659843d4f69be3ee05ed1da0efb39ea248", + "source_path": "contracts/flash/AaveQuotePushFlashReceiver.sol", + "contract_name": "IAaveFlashLoanSimpleReceiver", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmUVcwEPK2FgNnMaveWcscoRKh5iXkd5ThAYgfarvaJcHd/metadata.json b/verification-sources/chain138-metadata-archive/QmUVcwEPK2FgNnMaveWcscoRKh5iXkd5ThAYgfarvaJcHd/metadata.json new file mode 100644 index 0000000..4ab70e6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUVcwEPK2FgNnMaveWcscoRKh5iXkd5ThAYgfarvaJcHd/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/AaveQuotePushFlashReceiver.sol":"IAaveFlashLoanSimpleReceiver"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/flash/AaveQuotePushFlashReceiver.sol":{"keccak256":"0x9648a35f371bb79c4782933d66237ee759ab4d546950bf79489c87091ff5d7e5","license":"MIT","urls":["bzz-raw://e4360e49daf3f2ac0a7f0299d0083479909f5ae30de80ad647b37421f4d871c8","dweb:/ipfs/QmVAkMWwMEJwFQ5ELSLJhhoxM6oSPUpkrjTzEZkMH5cdh7"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmUYRirUMtfNYfANN9RbKy4PvH4CjKRwQrQqadL8aHuFAy/archive-info.json b/verification-sources/chain138-metadata-archive/QmUYRirUMtfNYfANN9RbKy4PvH4CjKRwQrQqadL8aHuFAy/archive-info.json new file mode 100644 index 0000000..2308f0f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUYRirUMtfNYfANN9RbKy4PvH4CjKRwQrQqadL8aHuFAy/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmUYRirUMtfNYfANN9RbKy4PvH4CjKRwQrQqadL8aHuFAy", + "metadata_digest": "5c2a681c8a8f05c0613ffb38f8becbbe5bd87ca019c6c0b70796a01a90c09e3a", + "source_path": "contracts/tokens/WETH.sol", + "contract_name": "WETH", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmUYRirUMtfNYfANN9RbKy4PvH4CjKRwQrQqadL8aHuFAy/metadata.json b/verification-sources/chain138-metadata-archive/QmUYRirUMtfNYfANN9RbKy4PvH4CjKRwQrQqadL8aHuFAy/metadata.json new file mode 100644 index 0000000..92be632 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUYRirUMtfNYfANN9RbKy4PvH4CjKRwQrQqadL8aHuFAy/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"guy","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"guy","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Based on the canonical WETH9 implementation","kind":"dev","methods":{},"title":"Wrapped Ether (WETH9)","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Standard implementation of WETH9 for ChainID 138","version":1}},"settings":{"compilationTarget":{"contracts/tokens/WETH.sol":"WETH"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/tokens/WETH.sol":{"keccak256":"0xda12797bb6c87bbcad2b1313cf844849452b40ab8c28b67475ca4d9e8f9d6bb9","license":"MIT","urls":["bzz-raw://ec69c766bf7bea07c935ed29b285add4d6e474712f2f2491c0f8797018b78298","dweb:/ipfs/QmZtDeeQe9pqgQQXbrHFAJHkP3wnTiXVWqWupAvqzMdNij"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmUfffiiN54qf2hq5z1RDAaBzXrar7ooaGboTRTnkkts6y/archive-info.json b/verification-sources/chain138-metadata-archive/QmUfffiiN54qf2hq5z1RDAaBzXrar7ooaGboTRTnkkts6y/archive-info.json new file mode 100644 index 0000000..49101a3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUfffiiN54qf2hq5z1RDAaBzXrar7ooaGboTRTnkkts6y/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmUfffiiN54qf2hq5z1RDAaBzXrar7ooaGboTRTnkkts6y", + "metadata_digest": "5e053db930abf55f8b972ba4180cd2de200d0bdc2397262e85153c2cfdc7da2a", + "source_path": "contracts/dbis/StablecoinReferenceRegistry.sol", + "contract_name": "StablecoinReferenceRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmUfffiiN54qf2hq5z1RDAaBzXrar7ooaGboTRTnkkts6y/metadata.json b/verification-sources/chain138-metadata-archive/QmUfffiiN54qf2hq5z1RDAaBzXrar7ooaGboTRTnkkts6y/metadata.json new file mode 100644 index 0000000..3fd00e0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUfffiiN54qf2hq5z1RDAaBzXrar7ooaGboTRTnkkts6y/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":false,"internalType":"enum StablecoinReferenceRegistry.StablecoinStatus","name":"status","type":"uint8"}],"name":"StablecoinRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"enum StablecoinReferenceRegistry.StablecoinStatus","name":"status","type":"uint8"}],"name":"StablecoinStatusUpdated","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STABLECOIN_REGISTRAR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getEntry","outputs":[{"components":[{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"issuerOrBridge","type":"string"},{"internalType":"string","name":"legalClaimType","type":"string"},{"internalType":"string","name":"redemptionPath","type":"string"},{"internalType":"string","name":"reserveDisclosureRef","type":"string"},{"internalType":"uint8","name":"riskTier","type":"uint8"},{"internalType":"address","name":"pauseAuthority","type":"address"},{"internalType":"enum StablecoinReferenceRegistry.StablecoinStatus","name":"status","type":"uint8"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct StablecoinReferenceRegistry.StablecoinEntry","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRegisteredAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegisteredCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"string","name":"issuerOrBridge","type":"string"},{"internalType":"string","name":"legalClaimType","type":"string"},{"internalType":"string","name":"redemptionPath","type":"string"},{"internalType":"string","name":"reserveDisclosureRef","type":"string"},{"internalType":"uint8","name":"riskTier","type":"uint8"},{"internalType":"address","name":"pauseAuthority","type":"address"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum StablecoinReferenceRegistry.StablecoinStatus","name":"status","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/StablecoinReferenceRegistry.sol":"StablecoinReferenceRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dbis/StablecoinReferenceRegistry.sol":{"keccak256":"0x95ce52d9176dbbe35741b96aa1ae5b9d0ceece648522c3611c7a35a0e86c2040","license":"MIT","urls":["bzz-raw://d948677c50fdfc63dd96f9d49932a45b4d838b7fc9b24dacffb0a71946fdc4e0","dweb:/ipfs/QmVTfa59rTTmktV4wh1iMPqrBb2n3d8mUADdBLKkqh3wej"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmUgq13e8gxtZ4h51Rg1KiHkHuPNnkqrj2LrBzHwH5JeWt/archive-info.json b/verification-sources/chain138-metadata-archive/QmUgq13e8gxtZ4h51Rg1KiHkHuPNnkqrj2LrBzHwH5JeWt/archive-info.json new file mode 100644 index 0000000..fdb4866 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUgq13e8gxtZ4h51Rg1KiHkHuPNnkqrj2LrBzHwH5JeWt/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmUgq13e8gxtZ4h51Rg1KiHkHuPNnkqrj2LrBzHwH5JeWt", + "metadata_digest": "5e516000dd46f2dd369065ee199279348307876c3be0447553ea7e7fcbd4da61", + "source_path": "contracts/vendor/uniswap-v2-periphery/interfaces/IWETH.sol", + "contract_name": "IWETH", + "compiler": "0.6.6", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/fafa493132a3d2f65cdfc44051edfddd.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmUgq13e8gxtZ4h51Rg1KiHkHuPNnkqrj2LrBzHwH5JeWt/metadata.json b/verification-sources/chain138-metadata-archive/QmUgq13e8gxtZ4h51Rg1KiHkHuPNnkqrj2LrBzHwH5JeWt/metadata.json new file mode 100644 index 0000000..e29ab72 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUgq13e8gxtZ4h51Rg1KiHkHuPNnkqrj2LrBzHwH5JeWt/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.6+commit.6c089d02"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/interfaces/IWETH.sol":"IWETH"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-periphery/interfaces/IWETH.sol":{"keccak256":"0xfc10758fd8dba790c39468dccd358cb7cef06ae7c4781832cc7aa76f91f167e6","urls":["bzz-raw://dc22493dea6c60d47835eeba53726f8a6f76f4fcd798d40e54608a1380515d49","dweb:/ipfs/QmS1QVcBRH4TELYNE7XCfjSVQEWFupyaNLKmMkKH7iPjrm"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmUocyTcER735gTSkrxoD3D1kFHVLVfK8TjxbC9B4bvi1H/archive-info.json b/verification-sources/chain138-metadata-archive/QmUocyTcER735gTSkrxoD3D1kFHVLVfK8TjxbC9B4bvi1H/archive-info.json new file mode 100644 index 0000000..3706adc --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUocyTcER735gTSkrxoD3D1kFHVLVfK8TjxbC9B4bvi1H/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmUocyTcER735gTSkrxoD3D1kFHVLVfK8TjxbC9B4bvi1H", + "metadata_digest": "600ed75f679d41617b71507430f046748dc312cbcc7b220c96f70047c6b1bf9c", + "source_path": "contracts/flash/QuotePushFlashWorkflowBorrower.sol", + "contract_name": "IDODOQuotePushSwapExactIn", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmUocyTcER735gTSkrxoD3D1kFHVLVfK8TjxbC9B4bvi1H/metadata.json b/verification-sources/chain138-metadata-archive/QmUocyTcER735gTSkrxoD3D1kFHVLVfK8TjxbC9B4bvi1H/metadata.json new file mode 100644 index 0000000..05011bb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUocyTcER735gTSkrxoD3D1kFHVLVfK8TjxbC9B4bvi1H/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapExactIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Matches `DODOPMMIntegration.swapExactIn` surface (any registered pool).","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/QuotePushFlashWorkflowBorrower.sol":"IDODOQuotePushSwapExactIn"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":{"keccak256":"0x9f9e6dba43fe0775c400aa384375f1f503efaf733a40187169fdfc195f5ea6fa","license":"MIT","urls":["bzz-raw://ff5fe5fac5e4ecbf9fcd34c42b6d58d1af150263dfe07bc6785a59329dd1e475","dweb:/ipfs/QmX1EhNKKL6n6RFrLLAYh6Uf3itkozjSHyGFs9DqwW4Rzy"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/flash/QuotePushFlashWorkflowBorrower.sol":{"keccak256":"0xcd8b38f86477005ca9b889945493c4d35137c97f8c29cd10bfa2bee3b02861e2","license":"MIT","urls":["bzz-raw://e1ecc34f9b0ae9abc3cd59c9801edc3a80d7ec1219f2675d2f9c16460831bf02","dweb:/ipfs/QmZGq4BvB96XsfHXrmQPWNyp6q6Pjumsb68Rqrh5K5Gp2x"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmUoi4EssnmxjG7SLXcKsQi8WQpGG4kzgHP7g57ibNya1N/archive-info.json b/verification-sources/chain138-metadata-archive/QmUoi4EssnmxjG7SLXcKsQi8WQpGG4kzgHP7g57ibNya1N/archive-info.json new file mode 100644 index 0000000..3dc1704 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUoi4EssnmxjG7SLXcKsQi8WQpGG4kzgHP7g57ibNya1N/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmUoi4EssnmxjG7SLXcKsQi8WQpGG4kzgHP7g57ibNya1N", + "metadata_digest": "6014968806cc4eeff324ec4c4338bdcaec14c049e4942c2230f4a6cf54f95d49", + "source_path": "contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol", + "contract_name": "IDODOApproveProxyView", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmUoi4EssnmxjG7SLXcKsQi8WQpGG4kzgHP7g57ibNya1N/metadata.json b/verification-sources/chain138-metadata-archive/QmUoi4EssnmxjG7SLXcKsQi8WQpGG4kzgHP7g57ibNya1N/metadata.json new file mode 100644 index 0000000..f774461 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUoi4EssnmxjG7SLXcKsQi8WQpGG4kzgHP7g57ibNya1N/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"_DODO_APPROVE_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol":"IDODOApproveProxyView"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol":{"keccak256":"0x214ca73ac7045c2085a8a9a9441da261be92b18fcbbf91ac5024d75e936f89ad","license":"MIT","urls":["bzz-raw://ed826e12e33f9b59a2022f889bb40862a912d4672811027c886f7017cb38bec7","dweb:/ipfs/QmWaVH9sq2W8qKcYGsJXJNi5uB6u1cFKC9whSFLTezVGYx"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmUq8XqvVZFggdPkmto4CXMjZx13j5i3RRad1JFk5N5p6u/archive-info.json b/verification-sources/chain138-metadata-archive/QmUq8XqvVZFggdPkmto4CXMjZx13j5i3RRad1JFk5N5p6u/archive-info.json new file mode 100644 index 0000000..4e4c39c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUq8XqvVZFggdPkmto4CXMjZx13j5i3RRad1JFk5N5p6u/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmUq8XqvVZFggdPkmto4CXMjZx13j5i3RRad1JFk5N5p6u", + "metadata_digest": "6071d8068e4a24f5f2dbe932779f6d9b9efd96d1696cda1e25a967039d528522", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2ERC20.sol", + "contract_name": "IUniswapV2ERC20", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmUq8XqvVZFggdPkmto4CXMjZx13j5i3RRad1JFk5N5p6u/metadata.json b/verification-sources/chain138-metadata-archive/QmUq8XqvVZFggdPkmto4CXMjZx13j5i3RRad1JFk5N5p6u/metadata.json new file mode 100644 index 0000000..0a1b1d6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmUq8XqvVZFggdPkmto4CXMjZx13j5i3RRad1JFk5N5p6u/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2ERC20.sol":"IUniswapV2ERC20"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2ERC20.sol":{"keccak256":"0xd179ddb73cdb485120799c3e5f446bd4f9885205528f1e51eda8b3074a819d88","license":"GPL-3.0","urls":["bzz-raw://ea5afb5efa71c14f1e3484e4d4a10cab3c94d116d357e517eaa658bdd4591a3b","dweb:/ipfs/QmRH5VJr6NAAKk4DXT85Pf6B6frLViUnHf8bFbfGeKt8Q8"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmV1QcXShUgcmPUPJfbWFR21RWsDzUWDpFf5xYMTwfXzGG/archive-info.json b/verification-sources/chain138-metadata-archive/QmV1QcXShUgcmPUPJfbWFR21RWsDzUWDpFf5xYMTwfXzGG/archive-info.json new file mode 100644 index 0000000..f20fb4b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmV1QcXShUgcmPUPJfbWFR21RWsDzUWDpFf5xYMTwfXzGG/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmV1QcXShUgcmPUPJfbWFR21RWsDzUWDpFf5xYMTwfXzGG", + "metadata_digest": "6313d59f482493bded48bce1a913603dcf773bddc173e82d3b6b511dde066ac9", + "source_path": "contracts/bridge/trustless/integration/Stabilizer.sol", + "contract_name": "IDODOPMMPoolStabilizer", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmV1QcXShUgcmPUPJfbWFR21RWsDzUWDpFf5xYMTwfXzGG/metadata.json b/verification-sources/chain138-metadata-archive/QmV1QcXShUgcmPUPJfbWFR21RWsDzUWDpFf5xYMTwfXzGG/metadata.json new file mode 100644 index 0000000..a85c355 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmV1QcXShUgcmPUPJfbWFR21RWsDzUWDpFf5xYMTwfXzGG/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"_BASE_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMidPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"Minimal DODO PMM pool interface for Stabilizer swaps","version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/integration/Stabilizer.sol":"IDODOPMMPoolStabilizer"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/trustless/integration/ICommodityPegManager.sol":{"keccak256":"0xac6ea4e0e063e63248f9e45c67cf6e73c7a9fe78cecd6dfd653fa639a4d19523","license":"MIT","urls":["bzz-raw://283095df7e58b829bf90fe4d4a790ab407d4d0c17cb175f7f82abc0d678890e5","dweb:/ipfs/QmZ97YmiFv8KFMkZX7CALQCvdwxPcdw673HCaZe2EQMxDY"]},"contracts/bridge/trustless/integration/IStablecoinPegManager.sol":{"keccak256":"0x781bb48403013454143b4b539427949ded1f2627475a4d9fef6d95e070f31017","license":"MIT","urls":["bzz-raw://df35bbad3d7a6fcabfc9d543b750e8c2f6736c2fc69bcd3b7f8f22f98e5d395c","dweb:/ipfs/QmQjnE74iygDFtQmXKNuHmjdf1LKekiWcrW1UxW4r1oXrG"]},"contracts/bridge/trustless/integration/Stabilizer.sol":{"keccak256":"0x1a56cb349e3690997b7f066bec842808ddf94f33b1c9829db128dab07f747bcc","license":"MIT","urls":["bzz-raw://54ed08d0e9f9783ca3f664151e31d51767ce52a9074334d103a577dd8f330efc","dweb:/ipfs/QmckymW77LEcWZVwd7a2snCosWe6w2U2keSqarf8erTiyg"]},"contracts/dex/PrivatePoolRegistry.sol":{"keccak256":"0xdea6a1e32a8be8440c9534705f8056d3a6e4ca5ec239d1368310cbbbf34bf84a","license":"MIT","urls":["bzz-raw://e9d034ff9cea19d882581da7750c9722e4a2a80f04e368a8b4d3937fda29eadd","dweb:/ipfs/QmT7jpzpu6BRDAjkDmYKWXmUJ6dSrvvCjkXbtqL28Kbo9n"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmV8XZxzZLXzVpUAzqN88L8yD9QEpnfxmhQWZ55hib9H3T/archive-info.json b/verification-sources/chain138-metadata-archive/QmV8XZxzZLXzVpUAzqN88L8yD9QEpnfxmhQWZ55hib9H3T/archive-info.json new file mode 100644 index 0000000..8f30212 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmV8XZxzZLXzVpUAzqN88L8yD9QEpnfxmhQWZ55hib9H3T/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmV8XZxzZLXzVpUAzqN88L8yD9QEpnfxmhQWZ55hib9H3T", + "metadata_digest": "64e6c3e117a9c81485fef9f5d107c8c0a3faf394d31f0c4dcada6c5029638ace", + "source_path": "contracts/utils/AddressMapperEmpty.sol", + "contract_name": "AddressMapperEmpty", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmV8XZxzZLXzVpUAzqN88L8yD9QEpnfxmhQWZ55hib9H3T/metadata.json b/verification-sources/chain138-metadata-archive/QmV8XZxzZLXzVpUAzqN88L8yD9QEpnfxmhQWZ55hib9H3T/metadata.json new file mode 100644 index 0000000..230abed --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmV8XZxzZLXzVpUAzqN88L8yD9QEpnfxmhQWZ55hib9H3T/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"genesisAddress","type":"address"},{"indexed":true,"internalType":"address","name":"deployedAddress","type":"address"}],"name":"AddressMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"genesisAddress","type":"address"}],"name":"MappingRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"genesisAddress","type":"address"}],"name":"getDeployedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"deployedAddress","type":"address"}],"name":"getGenesisAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isMapped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"genesisAddress","type":"address"}],"name":"removeMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"genesisAddress","type":"address"},{"internalType":"address","name":"deployedAddress","type":"address"}],"name":"setMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Deploy on Cronos, BSC, etc. and add mappings via setMapping() if needed.","kind":"dev","methods":{},"title":"AddressMapperEmpty","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Same interface as AddressMapper but with no initial mappings (for chains other than 138).","version":1}},"settings":{"compilationTarget":{"contracts/utils/AddressMapperEmpty.sol":"AddressMapperEmpty"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/utils/AddressMapperEmpty.sol":{"keccak256":"0xf189c3c9b5e70fcf75947bbdbf44d06cac7d1e527f5912228a4bd470b36365ce","license":"MIT","urls":["bzz-raw://22873dae537737bac501335bd15c6848835f9709721c8e004f4b29b208a1e9b7","dweb:/ipfs/QmdV7cdcQJUyPLvfHVDMGvFmwj46z1pd71dKQH4Ean5NLy"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmV8epjkCXaoCGW5zHZUZsrRo5SgTeZDQ8V7juvG4z1z4Z/archive-info.json b/verification-sources/chain138-metadata-archive/QmV8epjkCXaoCGW5zHZUZsrRo5SgTeZDQ8V7juvG4z1z4Z/archive-info.json new file mode 100644 index 0000000..da6d29f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmV8epjkCXaoCGW5zHZUZsrRo5SgTeZDQ8V7juvG4z1z4Z/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmV8epjkCXaoCGW5zHZUZsrRo5SgTeZDQ8V7juvG4z1z4Z", + "metadata_digest": "64eef7d212b8ea2788da60eb2842d9689bc6883d595a351fac55701957d46182", + "source_path": "contracts/vault/interfaces/IRateAccrual.sol", + "contract_name": "IRateAccrual", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmV8epjkCXaoCGW5zHZUZsrRo5SgTeZDQ8V7juvG4z1z4Z/metadata.json b/verification-sources/chain138-metadata-archive/QmV8epjkCXaoCGW5zHZUZsrRo5SgTeZDQ8V7juvG4z1z4Z/metadata.json new file mode 100644 index 0000000..815eb2c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmV8epjkCXaoCGW5zHZUZsrRo5SgTeZDQ8V7juvG4z1z4Z/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldAccumulator","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAccumulator","type":"uint256"}],"name":"InterestAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"InterestRateSet","type":"event"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"accrueInterest","outputs":[{"internalType":"uint256","name":"newAccumulator","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"principal","type":"uint256"}],"name":"calculateDebtWithInterest","outputs":[{"internalType":"uint256","name":"debtWithInterest","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getRateAccumulator","outputs":[{"internalType":"uint256","name":"accumulator","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"interestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setInterestRate","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Applies time-based interest to outstanding debt","kind":"dev","methods":{"accrueInterest(address)":{"params":{"asset":"Asset address"},"returns":{"newAccumulator":"Updated rate accumulator"}},"calculateDebtWithInterest(address,uint256)":{"params":{"asset":"Asset address","principal":"Principal debt amount"},"returns":{"debtWithInterest":"Debt amount with accrued interest"}},"getRateAccumulator(address)":{"params":{"asset":"Asset address"},"returns":{"accumulator":"Current rate accumulator"}},"interestRate(address)":{"params":{"asset":"Asset address"},"returns":{"_0":"rate Annual interest rate in basis points"}},"setInterestRate(address,uint256)":{"params":{"asset":"Asset address","rate":"Annual interest rate in basis points (e.g., 500 = 5%)"}}},"title":"IRateAccrual","version":1},"userdoc":{"kind":"user","methods":{"accrueInterest(address)":{"notice":"Accrue interest for an asset"},"calculateDebtWithInterest(address,uint256)":{"notice":"Calculate debt with accrued interest"},"getRateAccumulator(address)":{"notice":"Get current rate accumulator for an asset"},"interestRate(address)":{"notice":"Get interest rate for an asset"},"setInterestRate(address,uint256)":{"notice":"Set interest rate for an asset"}},"notice":"Interface for Rate & Accrual Module","version":1}},"settings":{"compilationTarget":{"contracts/vault/interfaces/IRateAccrual.sol":"IRateAccrual"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vault/interfaces/IRateAccrual.sol":{"keccak256":"0xbfb2212c538e553dafae6b942af93e4e8098bb43030d4af46d6d63b2882cc92b","license":"MIT","urls":["bzz-raw://078f67847c1c1d1abceae555aebf6403500eee2a366054cd32fd67da147c1b21","dweb:/ipfs/QmdxDLhAmpSyzxy7iVGGNfc2oHWkoo2WVjjBUtNBNtr18g"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVAAmj3Z7DrZFnkDjgt2ADmFsiBMi1RZeyTmHkeQ1hsCN/archive-info.json b/verification-sources/chain138-metadata-archive/QmVAAmj3Z7DrZFnkDjgt2ADmFsiBMi1RZeyTmHkeQ1hsCN/archive-info.json new file mode 100644 index 0000000..bf78508 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVAAmj3Z7DrZFnkDjgt2ADmFsiBMi1RZeyTmHkeQ1hsCN/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmVAAmj3Z7DrZFnkDjgt2ADmFsiBMi1RZeyTmHkeQ1hsCN", + "metadata_digest": "655269476e9329c14ee219e0878dd7a0af7e3645872fb4dab7042d9d1fd665fb", + "source_path": "contracts/vendor/sushiswap-v2/UniswapV2Pair.sol", + "contract_name": "IMigrator", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVAAmj3Z7DrZFnkDjgt2ADmFsiBMi1RZeyTmHkeQ1hsCN/metadata.json b/verification-sources/chain138-metadata-archive/QmVAAmj3Z7DrZFnkDjgt2ADmFsiBMi1RZeyTmHkeQ1hsCN/metadata.json new file mode 100644 index 0000000..0681086 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVAAmj3Z7DrZFnkDjgt2ADmFsiBMi1RZeyTmHkeQ1hsCN/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"desiredLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/UniswapV2Pair.sol":"IMigrator"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/UniswapV2ERC20.sol":{"keccak256":"0x2effe906b7ffa4fd9ff704fb426f46d21b9af881bbc9ca35f221531243251826","license":"GPL-3.0","urls":["bzz-raw://27a0ecc1fff91645ccd91ba3305272aeb3fbd124a48760e984a0b7c192946377","dweb:/ipfs/QmZpWRVXgSvesXppoitQiEWv4QWw5Xt1e34rxocYcswn1b"]},"contracts/vendor/sushiswap-v2/UniswapV2Pair.sol":{"keccak256":"0x3b13a4696ca98b08fb2450c8b9820d7c6df6ccfa9274275af5a0fdac7624a2ce","license":"GPL-3.0","urls":["bzz-raw://eb27c08ddfb2387690ab2601c3a5329af50e2337b1ad0f01c9d3ecb86d47286b","dweb:/ipfs/Qmerb5ys7C8AQZLAnWgEGRCxkzCXYHRQiYjfZHRZ5JAKhJ"]},"contracts/vendor/sushiswap-v2/interfaces/IERC20.sol":{"keccak256":"0x76866491759a6f069ddc030d52df08d4105a8bcef0e3330dee261cf7ee049b1a","license":"GPL-3.0","urls":["bzz-raw://0b3b2a687415260c33e491cc2d03577729802b5ff8227cc9fd7b45b28cbd24e4","dweb:/ipfs/QmNtBCKh68KLnNj8M2rQDPnbBfKhntzaZ1JReQx4Axtx5w"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Callee.sol":{"keccak256":"0x6bf2e1cd601f8df7a25606a03fb01532f33aa5d77278ef6e7fb72a3b95a2d8d8","license":"GPL-3.0","urls":["bzz-raw://aaaf7c44351d883b3830e484cc20fe1f91b832aaeb8c4631b1848b6bb08c7661","dweb:/ipfs/QmbxistLwfsuywWLHgBpDcQu4f5j6wV13Vs3JrSd1gjX9N"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xcaec675e6250bf4cd3364459a0cbf789262af2aaa377d61d4d463f657aea7b50","license":"GPL-3.0","urls":["bzz-raw://2c09e004aa8654e1ad2a1e9d8500883f618d754e5a77c840e2c9064c7a80b5cb","dweb:/ipfs/QmamoA2xnZpLsu4gjNaWkfdYcL5VjRpFmR5shpoJ8wYjZw"]},"contracts/vendor/sushiswap-v2/libraries/Math.sol":{"keccak256":"0x3e0a5520297ed1dc711407fb10e309db409fc8143e19a0a7751aa064bb99dfa1","license":"GPL-3.0","urls":["bzz-raw://5d44428171de5cd02c255aebd53d88e78cfee0b877bc1a13bbafa6e83eb0597d","dweb:/ipfs/QmXLVkrxEpA57vgP2CYh26PPGqaFy8C5peKKSdLobfCv31"]},"contracts/vendor/sushiswap-v2/libraries/SafeMath.sol":{"keccak256":"0xbde2cf4655f2f21a4e6cc76c28cf88ade1d8150289c208d48662135be9d5dd97","license":"GPL-3.0","urls":["bzz-raw://bd8f46ed9dc5ad8123e596a3b762815503a04ce8a83098d80ba45085fe3c5953","dweb:/ipfs/QmUa6d2v7Miy26dzUctkrumi5My4G34TL9QNUj9u4hh7iS"]},"contracts/vendor/sushiswap-v2/libraries/UQ112x112.sol":{"keccak256":"0xc4574ee73aa220d7a8b363ef7c874c099b6007b0f30365993e758c8337a294d8","license":"GPL-3.0","urls":["bzz-raw://e27c362f1a0f0bf97004bccab2b19faaea0706bc8a21febca6e365de77a20536","dweb:/ipfs/QmZipPjDSok9FxPjMB5rPTuJ7P2VvhaNzHA92TpYvE16FR"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVEM9Ktxxhkr72YeyAp4ZhHZH4PuyWWpRDnc4izLe4cC4/archive-info.json b/verification-sources/chain138-metadata-archive/QmVEM9Ktxxhkr72YeyAp4ZhHZH4PuyWWpRDnc4izLe4cC4/archive-info.json new file mode 100644 index 0000000..5602142 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVEM9Ktxxhkr72YeyAp4ZhHZH4PuyWWpRDnc4izLe4cC4/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVEM9Ktxxhkr72YeyAp4ZhHZH4PuyWWpRDnc4izLe4cC4", + "metadata_digest": "6664766ea22535deff448101856c73fb7ff629b0f605f8ba943207ca89bc72d5", + "source_path": "contracts/iso4217w/oracle/ReserveOracle.sol", + "contract_name": "ReserveOracle", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVEM9Ktxxhkr72YeyAp4ZhHZH4PuyWWpRDnc4izLe4cC4/metadata.json b/verification-sources/chain138-metadata-archive/QmVEM9Ktxxhkr72YeyAp4ZhHZH4PuyWWpRDnc4izLe4cC4/metadata.json new file mode 100644 index 0000000..c43e9ec --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVEM9Ktxxhkr72YeyAp4ZhHZH4PuyWWpRDnc4izLe4cC4/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"quorumThreshold_","type":"uint256"},{"internalType":"uint256","name":"stalenessThreshold_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"uint256","name":"consensusReserve","type":"uint256"}],"name":"QuorumMet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":true,"internalType":"address","name":"reporter","type":"address"},{"indexed":false,"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ReserveReportSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oracle","type":"address"}],"name":"addOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getConsensusReserve","outputs":[{"internalType":"uint256","name":"consensusReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getReports","outputs":[{"components":[{"internalType":"address","name":"reporter","type":"address"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes32","name":"attestationHash","type":"bytes32"},{"internalType":"bool","name":"isValid","type":"bool"}],"internalType":"struct IReserveOracle.ReserveReport[]","name":"reports","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getVerifiedReserve","outputs":[{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOracle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"isQuorumMet","outputs":[{"internalType":"bool","name":"quorumMet","type":"bool"},{"internalType":"uint256","name":"reportCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quorumThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oracle","type":"address"}],"name":"removeOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setQuorumThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setStalenessThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stalenessThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"bytes32","name":"attestationHash","type":"bytes32"}],"name":"submitReserveReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Requires quorum of oracle reports before accepting reserve values","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"addOracle(address)":{"params":{"oracle":"Oracle address"}},"getConsensusReserve(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"consensusReserve":"Consensus reserve balance"}},"getReports(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"reports":"Array of reserve reports"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getVerifiedReserve(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"reserveBalance":"Verified reserve balance","timestamp":"Last update timestamp"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isQuorumMet(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"quorumMet":"True if quorum is met","reportCount":"Number of valid reports"}},"removeOracle(address)":{"params":{"oracle":"Oracle address"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setQuorumThreshold(uint256)":{"params":{"threshold":"New quorum threshold"}},"setStalenessThreshold(uint256)":{"params":{"threshold":"New staleness threshold in seconds"}},"submitReserveReport(string,uint256,bytes32)":{"params":{"attestationHash":"Hash of custodian attestation","currencyCode":"ISO-4217 currency code","reserveBalance":"Reserve balance in base currency units"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"ReserveOracle","version":1},"userdoc":{"kind":"user","methods":{"addOracle(address)":{"notice":"Add oracle"},"getConsensusReserve(string)":{"notice":"Get consensus reserve balance (median/average of quorum reports)"},"getReports(string)":{"notice":"Get reports for a currency"},"getVerifiedReserve(string)":{"notice":"Get verified reserve balance for a currency"},"isQuorumMet(string)":{"notice":"Check if oracle quorum is met for a currency"},"removeOracle(address)":{"notice":"Remove oracle"},"setQuorumThreshold(uint256)":{"notice":"Set quorum threshold"},"setStalenessThreshold(uint256)":{"notice":"Set staleness threshold"},"submitReserveReport(string,uint256,bytes32)":{"notice":"Submit reserve report for a currency"}},"notice":"Quorum-based oracle system for verifying fiat reserves","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/oracle/ReserveOracle.sol":"ReserveOracle"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/iso4217w/interfaces/IReserveOracle.sol":{"keccak256":"0x2f9808bf9f3816c6ecdf4ef1587561ad965533019d9ce776ade03b85cbca3984","license":"MIT","urls":["bzz-raw://02a32c5327766990352c77017831be93977e32944b078ed68d2583d3f1c06e97","dweb:/ipfs/QmNr3wLfNkxao2VWndxzMDpYDmqP1t5dYdY8NcFi7omFEU"]},"contracts/iso4217w/oracle/ReserveOracle.sol":{"keccak256":"0x82b62fe98aa8d2f2c17f10e3c614297e8e76754681c8e8ee2bc32552986cecc4","license":"MIT","urls":["bzz-raw://f0341c32cf56d1a344c55504671c4018eae5b349d8c0d1ef9b207b8d9fdb48af","dweb:/ipfs/QmS6dMYytEC46oijBSTb4AKejQvD8SgqKxSkFFQhqY9oiy"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVF3j3ffCwGYX9tVFJ75XAnzLmyzKWtuB7MySn6FSKZYw/archive-info.json b/verification-sources/chain138-metadata-archive/QmVF3j3ffCwGYX9tVFJ75XAnzLmyzKWtuB7MySn6FSKZYw/archive-info.json new file mode 100644 index 0000000..88b5dc4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVF3j3ffCwGYX9tVFJ75XAnzLmyzKWtuB7MySn6FSKZYw/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVF3j3ffCwGYX9tVFJ75XAnzLmyzKWtuB7MySn6FSKZYw", + "metadata_digest": "6692591fc5c59fe8c5370050e4de9c377339f523837c8bdadd1a4a794d00589c", + "source_path": "contracts/bridge/trustless/Lockbox138.sol", + "contract_name": "Lockbox138", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVF3j3ffCwGYX9tVFJ75XAnzLmyzKWtuB7MySn6FSKZYw/metadata.json b/verification-sources/chain138-metadata-archive/QmVF3j3ffCwGYX9tVFJ75XAnzLmyzKWtuB7MySn6FSKZYw/metadata.json new file mode 100644 index 0000000..168360f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVF3j3ffCwGYX9tVFJ75XAnzLmyzKWtuB7MySn6FSKZYw/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"DepositAlreadyProcessed","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"inputs":[],"name":"ZeroAsset","type":"error"},{"inputs":[],"name":"ZeroRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"bytes32","name":"nonce","type":"bytes32"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"depositERC20","outputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"depositNative","outputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"isDepositProcessed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"processedDeposits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Supports both native ETH and ERC-20 tokens. Immutable after deployment (no admin functions).","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"depositERC20(address,uint256,address,bytes32)":{"params":{"amount":"Amount of tokens to lock","nonce":"Unique nonce for this deposit (prevents replay attacks)","recipient":"Address on destination chain (Ethereum) to receive funds","token":"ERC-20 token address to lock"},"returns":{"depositId":"Unique identifier for this deposit"}},"depositNative(address,bytes32)":{"params":{"nonce":"Unique nonce for this deposit (prevents replay attacks)","recipient":"Address on destination chain (Ethereum) to receive funds"},"returns":{"depositId":"Unique identifier for this deposit"}},"getNonce(address)":{"params":{"user":"Address to check nonce for"},"returns":{"_0":"Current nonce value"}},"isDepositProcessed(uint256)":{"params":{"depositId":"Deposit ID to check"},"returns":{"_0":"True if deposit has been processed"}}},"title":"Lockbox138","version":1},"userdoc":{"kind":"user","methods":{"depositERC20(address,uint256,address,bytes32)":{"notice":"Lock ERC-20 tokens (e.g., WETH) for cross-chain transfer"},"depositNative(address,bytes32)":{"notice":"Lock native ETH for cross-chain transfer"},"getNonce(address)":{"notice":"Get current nonce for a user"},"isDepositProcessed(uint256)":{"notice":"Check if a deposit ID has been processed"}},"notice":"Asset lock contract on ChainID 138 (Besu) for trustless bridge deposits","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/Lockbox138.sol":"Lockbox138"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/Lockbox138.sol":{"keccak256":"0xf7d9edd75d9d54bd3d73be612563f5ccd9fdd1b7ff4274e7252b24cb5ee4fc27","license":"MIT","urls":["bzz-raw://53619d18c189f3a84c32943a3a60f71d8ac4be2a4189096a79c6eb157e93e67e","dweb:/ipfs/QmfZ2keLhxZuUrUWjqAWe1BJWD9d66wHWQUw5bafKb1LDc"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVFhe9Xq2eftouQX8WVP4B9ht2nyXtXiBqTCbU766hNGQ/archive-info.json b/verification-sources/chain138-metadata-archive/QmVFhe9Xq2eftouQX8WVP4B9ht2nyXtXiBqTCbU766hNGQ/archive-info.json new file mode 100644 index 0000000..4af191c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVFhe9Xq2eftouQX8WVP4B9ht2nyXtXiBqTCbU766hNGQ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVFhe9Xq2eftouQX8WVP4B9ht2nyXtXiBqTCbU766hNGQ", + "metadata_digest": "66bd3828f480b9945c736b740f4f9b25d09b50222d5ef2d0565398e77f618421", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol", + "contract_name": "IUniswapV2Pair", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVFhe9Xq2eftouQX8WVP4B9ht2nyXtXiBqTCbU766hNGQ/metadata.json b/verification-sources/chain138-metadata-archive/QmVFhe9Xq2eftouQX8WVP4B9ht2nyXtXiBqTCbU766hNGQ/metadata.json new file mode 100644 index 0000000..10c2f78 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVFhe9Xq2eftouQX8WVP4B9ht2nyXtXiBqTCbU766hNGQ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"reserve0","type":"uint112"},{"internalType":"uint112","name":"reserve1","type":"uint112"},{"internalType":"uint32","name":"blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol":"IUniswapV2Pair"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x7c9bc70e5996c763e02ff38905282bc24fb242b0ef2519a003b36824fc524a4b","urls":["bzz-raw://85d5ad2dd23ee127f40907a12865a1e8cb5828814f6f2480285e1827dd72dedf","dweb:/ipfs/QmayKQWJgWmr46DqWseADyUanmqxh662hPNdAkdHRjiQQH"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVGPkMFjHu5bSAEzaeUbvuf7MV6P7zRfdVtqaxAd8rZ3A/archive-info.json b/verification-sources/chain138-metadata-archive/QmVGPkMFjHu5bSAEzaeUbvuf7MV6P7zRfdVtqaxAd8rZ3A/archive-info.json new file mode 100644 index 0000000..04f6010 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVGPkMFjHu5bSAEzaeUbvuf7MV6P7zRfdVtqaxAd8rZ3A/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmVGPkMFjHu5bSAEzaeUbvuf7MV6P7zRfdVtqaxAd8rZ3A", + "metadata_digest": "66ea9184891e03152efce8e9994dd89d5aa6a3f43f154bebd28dfd38b29df355", + "source_path": "contracts/vendor/uniswap-v2-core/UniswapV2Factory.sol", + "contract_name": "UniswapV2Factory", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVGPkMFjHu5bSAEzaeUbvuf7MV6P7zRfdVtqaxAd8rZ3A/metadata.json b/verification-sources/chain138-metadata-archive/QmVGPkMFjHu5bSAEzaeUbvuf7MV6P7zRfdVtqaxAd8rZ3A/metadata.json new file mode 100644 index 0000000..b63c8f6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVGPkMFjHu5bSAEzaeUbvuf7MV6P7zRfdVtqaxAd8rZ3A/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PairCreated","type":"event"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"}],"name":"setFeeToSetter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/UniswapV2Factory.sol":"UniswapV2Factory"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/UniswapV2ERC20.sol":{"keccak256":"0x0599f3684aef3e5f1144e14df1ddd39be24948b7cff125af9c9beca4bc94e1a2","urls":["bzz-raw://962b5efd230c60ce591afed08be4f1def46222da230a527c98c92ee27cf64583","dweb:/ipfs/Qmf5wW4T7F9sNQ1eAgaj94KcFS3hrtU5tTZyPZr8QhgXr8"]},"contracts/vendor/uniswap-v2-core/UniswapV2Factory.sol":{"keccak256":"0xa720c99b772d6127505ddaa942907aa2ef2ad5c824c5123a66f9bbed56f2c4ad","urls":["bzz-raw://4af3c9dbb92ab605d7d0351e2d95034773dfcf688bda310a0ac441f675ca0e22","dweb:/ipfs/QmZT1B2J7fr1U6JUJTAxNMsyvEgPnjdRgnWpW8DrMiCmSj"]},"contracts/vendor/uniswap-v2-core/UniswapV2Pair.sol":{"keccak256":"0xff7332962e80814ad2713d593794458d694a1133524ca393b77ef0912cfd0725","urls":["bzz-raw://6340a14c32430326637700bf79087de2e744fd78327177e7da757917baf5def8","dweb:/ipfs/QmaRygN869CLDx5mUYWmtFbt3MBtZqHVKasKMW5ukY4DX6"]},"contracts/vendor/uniswap-v2-core/interfaces/IERC20.sol":{"keccak256":"0x61db17aebc5d812c7002d15c1da954065e56abe49d64b14c034abe5604d70eb3","urls":["bzz-raw://b006685e753f9120469f10b09c159f222d4cb8b507a6c1f0c14ed50c883ebe66","dweb:/ipfs/QmSyY7iTugbczPwfGK67etiyPULenYGzzRYbt8aabwwkUb"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Callee.sol":{"keccak256":"0xdb17a1fb73e261e736ae8862be2d9a32964fc4b3741f48980f5cdc9d92b99a96","urls":["bzz-raw://468dab23a95d9d9b7d6ce74008d45eef3de2f137ede604e6be6c5e7d0121c5e9","dweb:/ipfs/QmcXwjTfp6tCRgf1KsNQyUAtrqKhiaN6fbaHVGr22eficP"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2ERC20.sol":{"keccak256":"0x9e433765e9ef7b4ff5e406b260b222c47c2aa27d36df756db708064fcb239ae7","urls":["bzz-raw://5b67c24a5e1652b51ad2f37adad2905519f0e05e7c8b2b4d8b3e00b429bb9213","dweb:/ipfs/QmarJq43GabAGGSqtMUb87ACYQt73mSFbXKyFAPDXpbFNM"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xe5905c0989cf5a865ed9bb7b9252536ca011c5b744017a82a7d4443b9c00a891","urls":["bzz-raw://5d2a90a0a796491507462a3da18c3f8819721d571572d765a2207c35bf0a0389","dweb:/ipfs/Qmf9ACYiT3qzjgsYuhm866FBdiBpRMXAPpQhSFbgqcyhHt"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x7c9bc70e5996c763e02ff38905282bc24fb242b0ef2519a003b36824fc524a4b","urls":["bzz-raw://85d5ad2dd23ee127f40907a12865a1e8cb5828814f6f2480285e1827dd72dedf","dweb:/ipfs/QmayKQWJgWmr46DqWseADyUanmqxh662hPNdAkdHRjiQQH"]},"contracts/vendor/uniswap-v2-core/libraries/Math.sol":{"keccak256":"0x05927cb4aa14897bd567607522c18d2d518fa803ade6f870fac244c6f3702a3b","urls":["bzz-raw://b2805464c2d75cbdd726d6bd5c9b8d1f2c8566b606ec769ffa9a194a42248862","dweb:/ipfs/QmWBa9BsCH8gbncvDFXmfMJX1USTHvAREtc8C7nz6miQpw"]},"contracts/vendor/uniswap-v2-core/libraries/SafeMath.sol":{"keccak256":"0x9c8465de751317860b623cd77f7f53f41a84b6624c0580ee526dcf7a2b7cb80c","urls":["bzz-raw://9b371b3eb0649b486f76cd628cc060354d1ac11fa8baed1170567271655f05d7","dweb:/ipfs/QmTUg31wK9UyX6o1Q1mxE4DQhuc1rWGBanNTu1uagNVQB6"]},"contracts/vendor/uniswap-v2-core/libraries/UQ112x112.sol":{"keccak256":"0x2240694530251ab376ae468d0a2d3ee8b3109e56f2acadbc203cdf341506dd31","urls":["bzz-raw://56f55c411faa2924df0915ff77129b9d8c64d3e4d28554e7234f3774ac95958a","dweb:/ipfs/QmYrzUurXL8ijzS8EnLtQTVD7fKPReosg2DsEPXXCY7ec3"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVHK94Up5RwBLcLPSe9xCGNWWbsoxA7pU7qqiXg7BWHaH/archive-info.json b/verification-sources/chain138-metadata-archive/QmVHK94Up5RwBLcLPSe9xCGNWWbsoxA7pU7qqiXg7BWHaH/archive-info.json new file mode 100644 index 0000000..1582fd8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVHK94Up5RwBLcLPSe9xCGNWWbsoxA7pU7qqiXg7BWHaH/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVHK94Up5RwBLcLPSe9xCGNWWbsoxA7pU7qqiXg7BWHaH", + "metadata_digest": "6726f03f2b74e5ac5b301cbba9438825b7ad2fd62c67e135556ed3a3d6036c72", + "source_path": "contracts/vault/interfaces/ILiquidation.sol", + "contract_name": "ILiquidation", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVHK94Up5RwBLcLPSe9xCGNWWbsoxA7pU7qqiXg7BWHaH/metadata.json b/verification-sources/chain138-metadata-archive/QmVHK94Up5RwBLcLPSe9xCGNWWbsoxA7pU7qqiXg7BWHaH/metadata.json new file mode 100644 index 0000000..25a10f4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVHK94Up5RwBLcLPSe9xCGNWWbsoxA7pU7qqiXg7BWHaH/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"uint256","name":"seizedCollateral","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repaidDebt","type":"uint256"},{"indexed":true,"internalType":"address","name":"liquidator","type":"address"}],"name":"VaultLiquidated","type":"event"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"canLiquidate","outputs":[{"internalType":"bool","name":"canLiquidate","type":"bool"},{"internalType":"uint256","name":"healthRatio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"maxDebt","type":"uint256"}],"name":"liquidate","outputs":[{"internalType":"uint256","name":"seizedCollateral","type":"uint256"},{"internalType":"uint256","name":"repaidDebt","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidationBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Handles liquidation of undercollateralized vaults","kind":"dev","methods":{"canLiquidate(address)":{"params":{"vault":"Vault address"},"returns":{"canLiquidate":"True if vault can be liquidated","healthRatio":"Current health ratio in basis points"}},"liquidate(address,address,uint256)":{"params":{"currency":"Debt currency address","maxDebt":"Maximum debt to liquidate","vault":"Vault address to liquidate"},"returns":{"repaidDebt":"Amount of debt repaid","seizedCollateral":"Amount of collateral seized"}},"liquidationBonus()":{"returns":{"_0":"bonus Liquidation bonus in basis points"}}},"title":"ILiquidation","version":1},"userdoc":{"kind":"user","methods":{"canLiquidate(address)":{"notice":"Check if a vault can be liquidated"},"liquidate(address,address,uint256)":{"notice":"Liquidate an undercollateralized vault"},"liquidationBonus()":{"notice":"Get liquidation bonus (penalty)"}},"notice":"Interface for Liquidation Module","version":1}},"settings":{"compilationTarget":{"contracts/vault/interfaces/ILiquidation.sol":"ILiquidation"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vault/interfaces/ILiquidation.sol":{"keccak256":"0xd2ee5b5fbb37cd8bc3f161ea91712ba127bb707b8e80bfd5d2a427e8a77bef25","license":"MIT","urls":["bzz-raw://45b557aeee05915ad1e7323791310255ffd7d9299ba1933b901e822cb9ce4d77","dweb:/ipfs/QmZu4UC3G6S4fRgKANyBNDvEUJvagEJEwyX6j3sNVS7VJ4"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVHqLeRbihHk956KSqeyw28goMxt6TyF99wE3RKDYNXqZ/archive-info.json b/verification-sources/chain138-metadata-archive/QmVHqLeRbihHk956KSqeyw28goMxt6TyF99wE3RKDYNXqZ/archive-info.json new file mode 100644 index 0000000..34a7a21 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVHqLeRbihHk956KSqeyw28goMxt6TyF99wE3RKDYNXqZ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVHqLeRbihHk956KSqeyw28goMxt6TyF99wE3RKDYNXqZ", + "metadata_digest": "674915de6dbc5e3968792e99cc35faf9316bca2484f74eb7ec960fdf79d4cb70", + "source_path": "contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol", + "contract_name": "ID3ProxyView", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVHqLeRbihHk956KSqeyw28goMxt6TyF99wE3RKDYNXqZ/metadata.json b/verification-sources/chain138-metadata-archive/QmVHqLeRbihHk956KSqeyw28goMxt6TyF99wE3RKDYNXqZ/metadata.json new file mode 100644 index 0000000..ff9858d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVHqLeRbihHk956KSqeyw28goMxt6TyF99wE3RKDYNXqZ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"_DODO_APPROVE_PROXY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"minReceiveAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"sellTokens","outputs":[{"internalType":"uint256","name":"receiveToAmount","type":"uint256"}],"stateMutability":"payable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol":"ID3ProxyView"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol":{"keccak256":"0x214ca73ac7045c2085a8a9a9441da261be92b18fcbbf91ac5024d75e936f89ad","license":"MIT","urls":["bzz-raw://ed826e12e33f9b59a2022f889bb40862a912d4672811027c886f7017cb38bec7","dweb:/ipfs/QmWaVH9sq2W8qKcYGsJXJNi5uB6u1cFKC9whSFLTezVGYx"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVJXTaLZyRqvMaE9ZAzDJ8wVKgbgpccdwDXNsc7sRedJb/archive-info.json b/verification-sources/chain138-metadata-archive/QmVJXTaLZyRqvMaE9ZAzDJ8wVKgbgpccdwDXNsc7sRedJb/archive-info.json new file mode 100644 index 0000000..47ccf63 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVJXTaLZyRqvMaE9ZAzDJ8wVKgbgpccdwDXNsc7sRedJb/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVJXTaLZyRqvMaE9ZAzDJ8wVKgbgpccdwDXNsc7sRedJb", + "metadata_digest": "677672db624ed59d56bea30d66c61c0c3f8ef677bbe3b1938a319fffa2d89894", + "source_path": "contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol", + "contract_name": "ReentrancyGuardUpgradeable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVJXTaLZyRqvMaE9ZAzDJ8wVKgbgpccdwDXNsc7sRedJb/metadata.json b/verification-sources/chain138-metadata-archive/QmVJXTaLZyRqvMaE9ZAzDJ8wVKgbgpccdwDXNsc7sRedJb/metadata.json new file mode 100644 index 0000000..4ed46b9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVJXTaLZyRqvMaE9ZAzDJ8wVKgbgpccdwDXNsc7sRedJb/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"}],"devdoc":{"details":"Compatibility shim for OZ 4.x-style upgradeable reentrancy protection. The repo still initializes `__ReentrancyGuard_init()` in several UUPS contracts, while the installed OZ 5.x upgradeable package no longer ships this module. Keeping the old initialization shape here lets both Foundry and Hardhat compile against the same upgrade-safe storage layout expectations.","errors":{"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":"ReentrancyGuardUpgradeable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVPEvAJUceWkdL9NznamhP3h6gHwc8wntxZxqF6ac9NTR/archive-info.json b/verification-sources/chain138-metadata-archive/QmVPEvAJUceWkdL9NznamhP3h6gHwc8wntxZxqF6ac9NTR/archive-info.json new file mode 100644 index 0000000..1c73142 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVPEvAJUceWkdL9NznamhP3h6gHwc8wntxZxqF6ac9NTR/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVPEvAJUceWkdL9NznamhP3h6gHwc8wntxZxqF6ac9NTR", + "metadata_digest": "68aba626a51c1678affc1c5f0480119d4cc8800f847fe1f4bb6fa5deee2c5e40", + "source_path": "contracts/vault/tokens/DepositToken.sol", + "contract_name": "DepositToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVPEvAJUceWkdL9NznamhP3h6gHwc8wntxZxqF6ac9NTR/metadata.json b/verification-sources/chain138-metadata-archive/QmVPEvAJUceWkdL9NznamhP3h6gHwc8wntxZxqF6ac9NTR/metadata.json new file mode 100644 index 0000000..0f43cdc --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVPEvAJUceWkdL9NznamhP3h6gHwc8wntxZxqF6ac9NTR/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collateralAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"vault_","type":"address"},{"internalType":"address","name":"collateralAsset_","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"vault_","type":"address"},{"internalType":"address","name":"collateralAsset_","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"initializeWithDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Minted when M0 collateral is deposited, burned on withdrawal Extends eMoneyToken pattern but simpler - no policy manager, just mint/burn control","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"burn(address,uint256)":{"params":{"amount":"Amount to burn","from":"Source address"}},"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"initializeWithDecimals(string,string,address,address,address,uint8)":{"params":{"decimals_":"Token decimals (e.g. 6 for stablecoins)"}},"mint(address,uint256)":{"params":{"amount":"Amount to mint","to":"Recipient address"}},"name()":{"details":"Returns the name of the token."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Skips emitting an {Approval} event indicating an allowance update. This is not required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"title":"DepositToken","version":1},"userdoc":{"kind":"user","methods":{"burn(address,uint256)":{"notice":"Burn deposit tokens (only by vault)"},"decimals()":{"notice":"Returns token decimals (matches underlying for DEX compatibility)"},"initialize(string,string,address,address,address)":{"notice":"Initialize the deposit token (5-arg for backward compatibility; decimals = 18)"},"initializeWithDecimals(string,string,address,address,address,uint8)":{"notice":"Initialize with explicit decimals (ERC-20 DEX-ready; decimals match underlying)"},"mint(address,uint256)":{"notice":"Mint deposit tokens (only by vault)"}},"notice":"Token representing supplied collateral position (aToken equivalent)","version":1}},"settings":{"compilationTarget":{"contracts/vault/tokens/DepositToken.sol":"DepositToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol":{"keccak256":"0xd518def45c722a6e803e1e26e625db25e01497f672ca566cca585d234ec903b0","license":"MIT","urls":["bzz-raw://6e7de3fccd96783244790cde282435ce0fd3a44ab4ccb10f17005c743202882f","dweb:/ipfs/QmYSepstTqs5UPJvjeJXkWU5R659yReqrSgSGGh65hkbdK"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/vault/tokens/DepositToken.sol":{"keccak256":"0xa1220a078010b1554f80da8f4883b2c339eca95ef1d20e070c97cccc3ab1723c","license":"MIT","urls":["bzz-raw://5879ab048f39cff3bcef678959740643a43eecb7fe8a864192339f5fe8591f17","dweb:/ipfs/QmRq6Jd25dkF7dt3YLbtvPQosegBEA1xqdU7Sgc1C1Tpep"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVPxdTcQFt6MiGckQG7UX3SioDY2SjxiPTdZjB442CZUF/archive-info.json b/verification-sources/chain138-metadata-archive/QmVPxdTcQFt6MiGckQG7UX3SioDY2SjxiPTdZjB442CZUF/archive-info.json new file mode 100644 index 0000000..c4524d8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVPxdTcQFt6MiGckQG7UX3SioDY2SjxiPTdZjB442CZUF/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVPxdTcQFt6MiGckQG7UX3SioDY2SjxiPTdZjB442CZUF", + "metadata_digest": "68dad01fad31a64867ae8b907d17d95d5f50e229b27d1763370b71ed8b7a5e14", + "source_path": "contracts/iso4217w/interfaces/IISO4217WToken.sol", + "contract_name": "IISO4217WToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVPxdTcQFt6MiGckQG7UX3SioDY2SjxiPTdZjB442CZUF/metadata.json b/verification-sources/chain138-metadata-archive/QmVPxdTcQFt6MiGckQG7UX3SioDY2SjxiPTdZjB442CZUF/metadata.json new file mode 100644 index 0000000..6979a34 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVPxdTcQFt6MiGckQG7UX3SioDY2SjxiPTdZjB442CZUF/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"ReserveInsufficient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newReserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ReserveUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"complianceGuard","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currencyCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"custodian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReserveSufficient","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"verifiedReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"M1 eMoney tokens representing 1:1 redeemable digital claims on fiat currency COMPLIANCE: - Classification: M1 eMoney - Legal Tender: NO - Synthetic / Reserve Unit: NO - Commodity-Backed: NO - Money Multiplier: m = 1.0 (fixed, no fractional reserve)","kind":"dev","methods":{"burn(address,uint256)":{"params":{"amount":"Amount to burn","from":"Address to burn from"}},"burnController()":{"returns":{"_0":"burnController Burn controller address"}},"complianceGuard()":{"returns":{"_0":"complianceGuard Compliance guard address"}},"currencyCode()":{"returns":{"_0":"currencyCode 3-letter ISO-4217 code (e.g., \"USD\")"}},"custodian()":{"returns":{"_0":"custodian Custodian address"}},"isReserveSufficient()":{"returns":{"_0":"isSufficient True if verifiedReserve >= totalSupply"}},"mint(address,uint256)":{"params":{"amount":"Amount to mint","to":"Address to mint to"}},"mintController()":{"returns":{"_0":"mintController Mint controller address"}},"totalSupply()":{"returns":{"_0":"supply Total supply"}},"verifiedReserve()":{"returns":{"_0":"reserveBalance Reserve balance in base currency units"}}},"title":"IISO4217WToken","version":1},"userdoc":{"kind":"user","methods":{"burn(address,uint256)":{"notice":"Burn tokens from an address"},"burnController()":{"notice":"Get burn controller address"},"complianceGuard()":{"notice":"Get compliance guard address"},"currencyCode()":{"notice":"Get the ISO-4217 currency code this token represents"},"custodian()":{"notice":"Get custodian address"},"isReserveSufficient()":{"notice":"Check if reserves are sufficient"},"mint(address,uint256)":{"notice":"Mint tokens to an address"},"mintController()":{"notice":"Get mint controller address"},"totalSupply()":{"notice":"Get total supply of tokens"},"verifiedReserve()":{"notice":"Get verified reserve balance for this currency"}},"notice":"Interface for ISO-4217 W tokens (e.g., USDW, EURW, GBPW)","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/interfaces/IISO4217WToken.sol":"IISO4217WToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/iso4217w/interfaces/IISO4217WToken.sol":{"keccak256":"0xd583b83e8598f54e2f3cc5e8bf954441fa73e959a0b816522eb66528b248d412","license":"MIT","urls":["bzz-raw://103a3010d1805dc5e1bbda03ce9338e03aa0ca36a914677cd45ece3ec8868ae3","dweb:/ipfs/QmQDnC1kxKbtedmyjMN4W8oonbGQ4y6LARWWqn7jK4V8W9"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVQLix3cWBZMUKHXkHzAUkTTUQkxycHuex2UJ5SctFa6B/archive-info.json b/verification-sources/chain138-metadata-archive/QmVQLix3cWBZMUKHXkHzAUkTTUQkxycHuex2UJ5SctFa6B/archive-info.json new file mode 100644 index 0000000..6e1e2f8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVQLix3cWBZMUKHXkHzAUkTTUQkxycHuex2UJ5SctFa6B/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVQLix3cWBZMUKHXkHzAUkTTUQkxycHuex2UJ5SctFa6B", + "metadata_digest": "68f3cba5878232a7dd3fb62e398b8c8f8efc226f0e5a64663b8ec223058cb150", + "source_path": "contracts/vendor/uniswap-v2-periphery/interfaces/IWETH.sol", + "contract_name": "IWETH", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVQLix3cWBZMUKHXkHzAUkTTUQkxycHuex2UJ5SctFa6B/metadata.json b/verification-sources/chain138-metadata-archive/QmVQLix3cWBZMUKHXkHzAUkTTUQkxycHuex2UJ5SctFa6B/metadata.json new file mode 100644 index 0000000..a6be434 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVQLix3cWBZMUKHXkHzAUkTTUQkxycHuex2UJ5SctFa6B/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/interfaces/IWETH.sol":"IWETH"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/uniswap-v2-periphery/interfaces/IWETH.sol":{"keccak256":"0xfc10758fd8dba790c39468dccd358cb7cef06ae7c4781832cc7aa76f91f167e6","urls":["bzz-raw://dc22493dea6c60d47835eeba53726f8a6f76f4fcd798d40e54608a1380515d49","dweb:/ipfs/QmS1QVcBRH4TELYNE7XCfjSVQEWFupyaNLKmMkKH7iPjrm"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVSnufHnT7cySxBeUEsy2afjzaosUjsaGTYaSPPGU7z2w/archive-info.json b/verification-sources/chain138-metadata-archive/QmVSnufHnT7cySxBeUEsy2afjzaosUjsaGTYaSPPGU7z2w/archive-info.json new file mode 100644 index 0000000..d770a7a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVSnufHnT7cySxBeUEsy2afjzaosUjsaGTYaSPPGU7z2w/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVSnufHnT7cySxBeUEsy2afjzaosUjsaGTYaSPPGU7z2w", + "metadata_digest": "699490709c3173c0ccf2b3edf5b501a35a3ae4744d4c65c3a6a3fb38ae758ef4", + "source_path": "contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol", + "contract_name": "TransferHelper", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVSnufHnT7cySxBeUEsy2afjzaosUjsaGTYaSPPGU7z2w/metadata.json b/verification-sources/chain138-metadata-archive/QmVSnufHnT7cySxBeUEsy2afjzaosUjsaGTYaSPPGU7z2w/metadata.json new file mode 100644 index 0000000..585a0be --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVSnufHnT7cySxBeUEsy2afjzaosUjsaGTYaSPPGU7z2w/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol":"TransferHelper"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol":{"keccak256":"0x7a9fb341d2bf50b0dfbce1d614f918ffc0598e1f3e31f8d2a949ab9ce25125af","license":"GPL-3.0","urls":["bzz-raw://81ad1ae72ccc1aeae4416b14cde0fab746ef47515ec3c6750dcbeaa8086d9188","dweb:/ipfs/QmePznL6SjS5iw2TAhwznEAAkVskeseMyNA9psvTB6YtrV"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVTGpmZpnsytNxnkbiHz8wRyMj4wVz5ugFT3oav2gqpaW/archive-info.json b/verification-sources/chain138-metadata-archive/QmVTGpmZpnsytNxnkbiHz8wRyMj4wVz5ugFT3oav2gqpaW/archive-info.json new file mode 100644 index 0000000..569e2f3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVTGpmZpnsytNxnkbiHz8wRyMj4wVz5ugFT3oav2gqpaW/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVTGpmZpnsytNxnkbiHz8wRyMj4wVz5ugFT3oav2gqpaW", + "metadata_digest": "69b420e8f1bb19e3880c4dd4d5c29f48552c90ca372c954c2adcda8e7bbafb83", + "source_path": "contracts/tokens/WETH10.sol", + "contract_name": "IERC3156FlashBorrower", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVTGpmZpnsytNxnkbiHz8wRyMj4wVz5ugFT3oav2gqpaW/metadata.json b/verification-sources/chain138-metadata-archive/QmVTGpmZpnsytNxnkbiHz8wRyMj4wVz5ugFT3oav2gqpaW/metadata.json new file mode 100644 index 0000000..531b115 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVTGpmZpnsytNxnkbiHz8wRyMj4wVz5ugFT3oav2gqpaW/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"initiator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onFlashLoan","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Based on WETH10 specification with additional quality-of-life features","kind":"dev","methods":{},"title":"WETH10","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Enhanced WETH implementation with ERC-3156 flash loans and withdraw-on-transfer-to-zero","version":1}},"settings":{"compilationTarget":{"contracts/tokens/WETH10.sol":"IERC3156FlashBorrower"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/tokens/WETH10.sol":{"keccak256":"0xdb94dafe131a1ecde041c9830f89e5c82f48a338b8b0f44b64e2c2fa8267d3fe","license":"MIT","urls":["bzz-raw://acf422bdefa787500f16dfce819d41194ee9bbaec119d664274c110101e7f15a","dweb:/ipfs/QmUZswCiwKNzk7P5iZdvw9m7Cw22znaDFwCH2Yrf987CLv"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVUKva7URDcy67SVneSSucEdyPM3XegmU9sds4hLuNk1r/archive-info.json b/verification-sources/chain138-metadata-archive/QmVUKva7URDcy67SVneSSucEdyPM3XegmU9sds4hLuNk1r/archive-info.json new file mode 100644 index 0000000..fd276f5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVUKva7URDcy67SVneSSucEdyPM3XegmU9sds4hLuNk1r/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmVUKva7URDcy67SVneSSucEdyPM3XegmU9sds4hLuNk1r", + "metadata_digest": "69f936ef9c2a5eacf03ba1c97bf19042170f45ca72b0f44583acb9eabc052825", + "source_path": "contracts/vendor/uniswap-v2-core/libraries/SafeMath.sol", + "contract_name": "SafeMath", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVUKva7URDcy67SVneSSucEdyPM3XegmU9sds4hLuNk1r/metadata.json b/verification-sources/chain138-metadata-archive/QmVUKva7URDcy67SVneSSucEdyPM3XegmU9sds4hLuNk1r/metadata.json new file mode 100644 index 0000000..84a7433 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVUKva7URDcy67SVneSSucEdyPM3XegmU9sds4hLuNk1r/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/libraries/SafeMath.sol":"SafeMath"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/libraries/SafeMath.sol":{"keccak256":"0x9c8465de751317860b623cd77f7f53f41a84b6624c0580ee526dcf7a2b7cb80c","urls":["bzz-raw://9b371b3eb0649b486f76cd628cc060354d1ac11fa8baed1170567271655f05d7","dweb:/ipfs/QmTUg31wK9UyX6o1Q1mxE4DQhuc1rWGBanNTu1uagNVQB6"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVV6dKHKmTsjvgmGvnNLWufTyorEkh6CnwQFvwyxw4eC2/archive-info.json b/verification-sources/chain138-metadata-archive/QmVV6dKHKmTsjvgmGvnNLWufTyorEkh6CnwQFvwyxw4eC2/archive-info.json new file mode 100644 index 0000000..0d378cd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVV6dKHKmTsjvgmGvnNLWufTyorEkh6CnwQFvwyxw4eC2/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVV6dKHKmTsjvgmGvnNLWufTyorEkh6CnwQFvwyxw4eC2", + "metadata_digest": "6a2bc2860eaac2f976aea5d3f79d91a23784afcc81894b230d8508bcb5584feb", + "source_path": "contracts/utils/FeeCollector.sol", + "contract_name": "FeeCollector", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVV6dKHKmTsjvgmGvnNLWufTyorEkh6CnwQFvwyxw4eC2/metadata.json b/verification-sources/chain138-metadata-archive/QmVV6dKHKmTsjvgmGvnNLWufTyorEkh6CnwQFvwyxw4eC2/metadata.json new file mode 100644 index 0000000..d9ffeb6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVV6dKHKmTsjvgmGvnNLWufTyorEkh6CnwQFvwyxw4eC2/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"shareBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FeeRecipientAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FeeRecipientRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FeesCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FeesDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"shareBps","type":"uint256"}],"name":"addFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"collectFees","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getFeeRecipients","outputs":[{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"shareBps","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"internalType":"struct FeeCollector.FeeRecipient[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTotalCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTotalDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"removeFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Supports multiple tokens and multiple fee recipients","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"addFeeRecipient(address,address,uint256)":{"details":"Requires FEE_MANAGER_ROLE","params":{"recipient":"Recipient address","shareBps":"Share in basis points (10000 = 100%)","token":"Token address (address(0) for native ETH)"}},"collectFees(address,uint256)":{"details":"Can be called by anyone, typically called by contracts that collect fees","params":{"amount":"Amount to collect","token":"Token address (address(0) for native ETH)"}},"constructor":{"params":{"admin":"Address that will receive DEFAULT_ADMIN_ROLE"}},"distributeFees(address)":{"details":"Requires FEE_MANAGER_ROLE","params":{"token":"Token address (address(0) for native ETH)"}},"emergencyWithdraw(address,address,uint256)":{"details":"Requires DEFAULT_ADMIN_ROLE","params":{"amount":"Amount to withdraw","to":"Recipient address","token":"Token address (address(0) for native ETH)"}},"getBalance(address)":{"params":{"token":"Token address (address(0) for native ETH)"},"returns":{"_0":"Current balance"}},"getFeeRecipients(address)":{"params":{"token":"Token address"},"returns":{"_0":"Array of fee recipients"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getTotalCollected(address)":{"params":{"token":"Token address"},"returns":{"_0":"Total collected amount"}},"getTotalDistributed(address)":{"params":{"token":"Token address"},"returns":{"_0":"Total distributed amount"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"removeFeeRecipient(address,address)":{"details":"Requires FEE_MANAGER_ROLE","params":{"recipient":"Recipient address to remove","token":"Token address"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"FeeCollector","version":1},"userdoc":{"kind":"user","methods":{"addFeeRecipient(address,address,uint256)":{"notice":"Add a fee recipient for a token"},"collectFees(address,uint256)":{"notice":"Collect fees in a token"},"constructor":{"notice":"Constructor"},"distributeFees(address)":{"notice":"Distribute collected fees to recipients"},"emergencyWithdraw(address,address,uint256)":{"notice":"Emergency withdraw (admin only)"},"getBalance(address)":{"notice":"Get current balance for a token"},"getFeeRecipients(address)":{"notice":"Get fee recipients for a token"},"getTotalCollected(address)":{"notice":"Get total collected fees for a token"},"getTotalDistributed(address)":{"notice":"Get total distributed fees for a token"},"removeFeeRecipient(address,address)":{"notice":"Remove a fee recipient"}},"notice":"Collects and distributes protocol fees","version":1}},"settings":{"compilationTarget":{"contracts/utils/FeeCollector.sol":"FeeCollector"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/utils/FeeCollector.sol":{"keccak256":"0x645da2db0b833a356a959e97e78c4220d42dc03151db1524025aaeb0f59204fb","license":"MIT","urls":["bzz-raw://893d814c81b38eaeeb5632a857065e3d0a5149984da1d3ca093191a1dbcca955","dweb:/ipfs/QmZheH2eYCVFDcSSEbfw13PEFTPc3AKSSTe7jodA7BhJvq"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVYcvaT3zxPkVo59ADrdh2gmNZhQq192w8b89suejti8Z/archive-info.json b/verification-sources/chain138-metadata-archive/QmVYcvaT3zxPkVo59ADrdh2gmNZhQq192w8b89suejti8Z/archive-info.json new file mode 100644 index 0000000..97faefe --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVYcvaT3zxPkVo59ADrdh2gmNZhQq192w8b89suejti8Z/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVYcvaT3zxPkVo59ADrdh2gmNZhQq192w8b89suejti8Z", + "metadata_digest": "6b12c2891d56945a0a68220789de915a8a7c82e5a11c31023a8b79525b236732", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol", + "contract_name": "IUniswapV2Factory", + "compiler": "0.6.6", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/fafa493132a3d2f65cdfc44051edfddd.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVYcvaT3zxPkVo59ADrdh2gmNZhQq192w8b89suejti8Z/metadata.json b/verification-sources/chain138-metadata-archive/QmVYcvaT3zxPkVo59ADrdh2gmNZhQq192w8b89suejti8Z/metadata.json new file mode 100644 index 0000000..4cf8172 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVYcvaT3zxPkVo59ADrdh2gmNZhQq192w8b89suejti8Z/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.6+commit.6c089d02"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PairCreated","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setFeeToSetter","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol":"IUniswapV2Factory"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xe5905c0989cf5a865ed9bb7b9252536ca011c5b744017a82a7d4443b9c00a891","urls":["bzz-raw://5d2a90a0a796491507462a3da18c3f8819721d571572d765a2207c35bf0a0389","dweb:/ipfs/Qmf9ACYiT3qzjgsYuhm866FBdiBpRMXAPpQhSFbgqcyhHt"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVa151BfQqABsEo5e6EExXBsSk39q9km3yPDsZkgR9poH/archive-info.json b/verification-sources/chain138-metadata-archive/QmVa151BfQqABsEo5e6EExXBsSk39q9km3yPDsZkgR9poH/archive-info.json new file mode 100644 index 0000000..a14aa6f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVa151BfQqABsEo5e6EExXBsSk39q9km3yPDsZkgR9poH/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVa151BfQqABsEo5e6EExXBsSk39q9km3yPDsZkgR9poH", + "metadata_digest": "6b6d616638052e4e8afa5ffd70c97eb1067249b27b9b7051dba722a5a35dc8f8", + "source_path": "contracts/vendor/uniswap-v2-periphery/UniswapV2Router02.sol", + "contract_name": "UniswapV2Router02", + "compiler": "0.6.6", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/fafa493132a3d2f65cdfc44051edfddd.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVa151BfQqABsEo5e6EExXBsSk39q9km3yPDsZkgR9poH/metadata.json b/verification-sources/chain138-metadata-archive/QmVa151BfQqABsEo5e6EExXBsSk39q9km3yPDsZkgR9poH/metadata.json new file mode 100644 index 0000000..728cef9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVa151BfQqABsEo5e6EExXBsSk39q9km3yPDsZkgR9poH/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.6+commit.6c089d02"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/UniswapV2Router02.sol":"UniswapV2Router02"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol":{"keccak256":"0x7a9fb341d2bf50b0dfbce1d614f918ffc0598e1f3e31f8d2a949ab9ce25125af","urls":["bzz-raw://81ad1ae72ccc1aeae4416b14cde0fab746ef47515ec3c6750dcbeaa8086d9188","dweb:/ipfs/QmePznL6SjS5iw2TAhwznEAAkVskeseMyNA9psvTB6YtrV"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xe5905c0989cf5a865ed9bb7b9252536ca011c5b744017a82a7d4443b9c00a891","urls":["bzz-raw://5d2a90a0a796491507462a3da18c3f8819721d571572d765a2207c35bf0a0389","dweb:/ipfs/Qmf9ACYiT3qzjgsYuhm866FBdiBpRMXAPpQhSFbgqcyhHt"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x7c9bc70e5996c763e02ff38905282bc24fb242b0ef2519a003b36824fc524a4b","urls":["bzz-raw://85d5ad2dd23ee127f40907a12865a1e8cb5828814f6f2480285e1827dd72dedf","dweb:/ipfs/QmayKQWJgWmr46DqWseADyUanmqxh662hPNdAkdHRjiQQH"]},"contracts/vendor/uniswap-v2-periphery/UniswapV2Router02.sol":{"keccak256":"0xfaffd3e5abef146b7b46c7c27831711cd192cc2f61af8e8870f91a73222a999f","urls":["bzz-raw://ac4a5c4b4e0842689ce6803388eea0d49eefe3e87e491edc8381e64c3ab2048a","dweb:/ipfs/QmSyAcMBAJYGzpPe6wes74QPNSbZbq6JJXyVciTykE2Eef"]},"contracts/vendor/uniswap-v2-periphery/interfaces/IERC20.sol":{"keccak256":"0x61db17aebc5d812c7002d15c1da954065e56abe49d64b14c034abe5604d70eb3","urls":["bzz-raw://b006685e753f9120469f10b09c159f222d4cb8b507a6c1f0c14ed50c883ebe66","dweb:/ipfs/QmSyY7iTugbczPwfGK67etiyPULenYGzzRYbt8aabwwkUb"]},"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router01.sol":{"keccak256":"0x8a3c5c449d4b7cd76513ed6995f4b86e4a86f222c770f8442f5fc128ce29b4d2","urls":["bzz-raw://1df63ca373dafae3bd0ee7fe70f890a1dc7c45ed869c01de68413e0e97ff9deb","dweb:/ipfs/QmefJgEYGUL8KX7kQKYTrDweF8GB7yjy3nw5Bmqzryg7PG"]},"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router02.sol":{"keccak256":"0x744e30c133bd0f7ca9e7163433cf6d72f45c6bb1508c2c9c02f1a6db796ae59d","urls":["bzz-raw://9bf2f4454ad63d4cff03a0630e787d9e8a9deed80aec89682cd8ad6379d9ef8c","dweb:/ipfs/Qme51hQNR2wpax7ooUadhtqLtXm8ffeVVYyubLkTT4wMCG"]},"contracts/vendor/uniswap-v2-periphery/interfaces/IWETH.sol":{"keccak256":"0xfc10758fd8dba790c39468dccd358cb7cef06ae7c4781832cc7aa76f91f167e6","urls":["bzz-raw://dc22493dea6c60d47835eeba53726f8a6f76f4fcd798d40e54608a1380515d49","dweb:/ipfs/QmS1QVcBRH4TELYNE7XCfjSVQEWFupyaNLKmMkKH7iPjrm"]},"contracts/vendor/uniswap-v2-periphery/libraries/SafeMath.sol":{"keccak256":"0x27f0ea82f879b3b01387b583e6d9d0ec858dca3b22b0aad173f8fbda06e761e1","urls":["bzz-raw://0db9cf37793eb7035f0bfced36323d240f0212150009c39a3a108701d9b50b6c","dweb:/ipfs/QmUAdiG9XNcieXkKfiMB49zQqD34FbXFE15csV2KQzwEqg"]},"contracts/vendor/uniswap-v2-periphery/libraries/UniswapV2Library.sol":{"keccak256":"0x32e87dbc83f43c624632f190dc2f942e9b6abbdbd0394f0340f26f326c0b2f67","urls":["bzz-raw://bcf991c5656366d118f383331c4d2513bf4d3359690a8b426edf29fcd112ec46","dweb:/ipfs/QmPqWMDzAxGhNqGXnC7WU9CpzGza8pzMmor6NC1SRZPxGq"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVbmVj15R6vsnVnkkTZCzh9x9WKSPupiiPTNkSRqRQSsv/archive-info.json b/verification-sources/chain138-metadata-archive/QmVbmVj15R6vsnVnkkTZCzh9x9WKSPupiiPTNkSRqRQSsv/archive-info.json new file mode 100644 index 0000000..4de234f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVbmVj15R6vsnVnkkTZCzh9x9WKSPupiiPTNkSRqRQSsv/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVbmVj15R6vsnVnkkTZCzh9x9WKSPupiiPTNkSRqRQSsv", + "metadata_digest": "6be131b4e80f301d5d7918bd5a88a136602335d23944d56a3edfbfdbe0df66a5", + "source_path": "contracts/ccip/CCIPReceiver.sol", + "contract_name": "CCIPReceiver", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVbmVj15R6vsnVnkkTZCzh9x9WKSPupiiPTNkSRqRQSsv/metadata.json b/verification-sources/chain138-metadata-archive/QmVbmVj15R6vsnVnkkTZCzh9x9WKSPupiiPTNkSRqRQSsv/metadata.json new file mode 100644 index 0000000..77cb397 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVbmVj15R6vsnVnkkTZCzh9x9WKSPupiiPTNkSRqRQSsv/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_oracleAggregator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAggregator","type":"address"},{"indexed":false,"internalType":"address","name":"newAggregator","type":"address"}],"name":"OracleAggregatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"answer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"OracleUpdated","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"isMessageProcessed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"lastNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleAggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAggregator","type":"address"}],"name":"updateOracleAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Implements CCIP message receiving and oracle update logic with validation","kind":"dev","methods":{"ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"params":{"message":"The received CCIP message"}}},"title":"CCIP Receiver with Oracle Integration","version":1},"userdoc":{"kind":"user","methods":{"ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"notice":"Handle CCIP message (called by CCIP Router)"},"changeAdmin(address)":{"notice":"Change admin"},"isMessageProcessed(bytes32)":{"notice":"Check if message has been processed"},"updateOracleAggregator(address)":{"notice":"Update oracle aggregator address"}},"notice":"Receives CCIP messages and updates oracle aggregator","version":1}},"settings":{"compilationTarget":{"contracts/ccip/CCIPReceiver.sol":"CCIPReceiver"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/ccip/CCIPMessageValidator.sol":{"keccak256":"0x22ed516aef5e109a9efa23f7f2286a8d8baa1aebff73548de1a237793cd94479","license":"MIT","urls":["bzz-raw://60b1df3a9e8a293805e1fa07ea30e64aaf9d49fa7583f7315c7388cdbe67827f","dweb:/ipfs/QmWTiR7gftFsD7zuXS4UuhDefS2McTwpjXgJENAEpdFssD"]},"contracts/ccip/CCIPReceiver.sol":{"keccak256":"0x34aebd94c7fdfb3e896e42366627f4d44820279c24c1b7066352d1b6c3ae5e38","license":"MIT","urls":["bzz-raw://addd052755a915b4f5f791190ffa4c8b92e32f992410bbde69a52ef051e8de96","dweb:/ipfs/QmZ76eaXEGnHL9wgro6H2yKbdTDFifng4NSMe8WSvG34q7"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/oracle/IAggregator.sol":{"keccak256":"0xcdbf107184805058e5725282eb6ade5778fe5ac5ac4cacc3d12438d2292e2951","license":"MIT","urls":["bzz-raw://552f85c4185c0c6273b28a9b5f5473154c0d490885e597dae305882d64377809","dweb:/ipfs/QmXMp3tKq42tUr1RoxhC81vfwQ7aYPFsGkpq5SHTpUmsnu"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVcxQBNyHkWipaTedesEWuZKMwKR59WbkRVkz9YLa3pkT/archive-info.json b/verification-sources/chain138-metadata-archive/QmVcxQBNyHkWipaTedesEWuZKMwKR59WbkRVkz9YLa3pkT/archive-info.json new file mode 100644 index 0000000..c148e80 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVcxQBNyHkWipaTedesEWuZKMwKR59WbkRVkz9YLa3pkT/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVcxQBNyHkWipaTedesEWuZKMwKR59WbkRVkz9YLa3pkT", + "metadata_digest": "6c2f1ac7da7e8c06bdc19d3b1855df6d7c30bca739973c0b5fcaf8c58e1fde74", + "source_path": "contracts/flash/DODOToUniswapV3MultiHopExternalUnwinder.sol", + "contract_name": "IDODOMultiHopSwapExactIn", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVcxQBNyHkWipaTedesEWuZKMwKR59WbkRVkz9YLa3pkT/metadata.json b/verification-sources/chain138-metadata-archive/QmVcxQBNyHkWipaTedesEWuZKMwKR59WbkRVkz9YLa3pkT/metadata.json new file mode 100644 index 0000000..f9f9693 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVcxQBNyHkWipaTedesEWuZKMwKR59WbkRVkz9YLa3pkT/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapExactIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/DODOToUniswapV3MultiHopExternalUnwinder.sol":"IDODOMultiHopSwapExactIn"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/flash/DODOToUniswapV3MultiHopExternalUnwinder.sol":{"keccak256":"0xc08d891c09ff16566d1ac2d06325bdf87d88ae6e34266b509254af41fd57984c","license":"MIT","urls":["bzz-raw://5505965afec47b6c9db357775ae1656e478b62968723675eb48c7241cf56cbd1","dweb:/ipfs/QmQFpXGACUkeGf39ZhcCLHVdLwPAZZ5LzNJnYm5emgPMaE"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVjjTNTuqrDBj2QfQCDmoqAX2J73Ji21WaB5Ze6iwfvLj/archive-info.json b/verification-sources/chain138-metadata-archive/QmVjjTNTuqrDBj2QfQCDmoqAX2J73Ji21WaB5Ze6iwfvLj/archive-info.json new file mode 100644 index 0000000..f445992 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVjjTNTuqrDBj2QfQCDmoqAX2J73Ji21WaB5Ze6iwfvLj/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVjjTNTuqrDBj2QfQCDmoqAX2J73Ji21WaB5Ze6iwfvLj", + "metadata_digest": "6deb8888ec8604ae0c8cde3b0779745343a367f245fd9d8a62b18e719430829c", + "source_path": "contracts/bridge/interop/wXRP.sol", + "contract_name": "wXRP", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVjjTNTuqrDBj2QfQCDmoqAX2J73Ji21WaB5Ze6iwfvLj/metadata.json b/verification-sources/chain138-metadata-archive/QmVjjTNTuqrDBj2QfQCDmoqAX2J73Ji21WaB5Ze6iwfvLj/metadata.json new file mode 100644 index 0000000..4f17d41 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVjjTNTuqrDBj2QfQCDmoqAX2J73Ji21WaB5Ze6iwfvLj/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"xrplTxHash","type":"bytes32"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"xrplTxHash","type":"bytes32"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"xrplTxHash","type":"bytes32"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"xrplTxHash","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Mintable/burnable by authorized bridge controller only","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"burn(uint256)":{"details":"Destroys a `value` amount of tokens from the caller. See {ERC20-_burn}."},"burnFrom(address,uint256)":{"details":"Destroys a `value` amount of tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `value`."},"burnFrom(address,uint256,bytes32)":{"params":{"amount":"Amount to burn","from":"Address to burn from","xrplTxHash":"XRPL transaction hash for the unlock"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"mint(address,uint256,bytes32)":{"params":{"amount":"Amount to mint","to":"Recipient address","xrplTxHash":"XRPL transaction hash that locked the XRP"}},"name()":{"details":"Returns the name of the token."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"title":"wXRP","version":1},"userdoc":{"kind":"user","methods":{"burnFrom(address,uint256,bytes32)":{"notice":"Burn wXRP tokens to unlock XRP on XRPL (bridge controller only)"},"decimals()":{"notice":"Override decimals to return 18"},"mint(address,uint256,bytes32)":{"notice":"Mint wXRP tokens (bridge controller only)"},"pause()":{"notice":"Pause token transfers"},"unpause()":{"notice":"Unpause token transfers"}},"notice":"Wrapped XRP token (ERC-20) representing XRP locked on XRPL","version":1}},"settings":{"compilationTarget":{"contracts/bridge/interop/wXRP.sol":"wXRP"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol":{"keccak256":"0x2659248df25e34000ed214b3dc8da2160bc39874c992b477d9e2b1b3283dc073","license":"MIT","urls":["bzz-raw://c345af1b0e7ea28d1216d6a04ab28f5534a5229b9edf9ca3cd0e84950ae58d26","dweb:/ipfs/QmY63jtSrYpLRe8Gj1ep2vMDCKxGNNG3hnNVKBVnrs2nmA"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/interop/wXRP.sol":{"keccak256":"0xe648c3bb2c8bb85fdc89b71bc8ca6bf7371505e60ea2bde3c61b922549fd6242","license":"MIT","urls":["bzz-raw://2e89e74f7774fa61c50dbae1baed1c827cb9b1aecab45050073e42d8773f53b6","dweb:/ipfs/Qmf4axmrG9A8RDg5hM4wnwTY6ygpq1v49u63911JmhBb9X"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVoTyhKc4eBeHxQCq7Rxps7WD4VQ8wZZBGMS5jGUU1HKB/archive-info.json b/verification-sources/chain138-metadata-archive/QmVoTyhKc4eBeHxQCq7Rxps7WD4VQ8wZZBGMS5jGUU1HKB/archive-info.json new file mode 100644 index 0000000..682c659 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVoTyhKc4eBeHxQCq7Rxps7WD4VQ8wZZBGMS5jGUU1HKB/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVoTyhKc4eBeHxQCq7Rxps7WD4VQ8wZZBGMS5jGUU1HKB", + "metadata_digest": "6ee05b43c349a99ad538a66926d0c9848258c01ef9e8fbeaef193bd0d1132bae", + "source_path": "contracts/bridge/interop/MintBurnController.sol", + "contract_name": "MintBurnController", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVoTyhKc4eBeHxQCq7Rxps7WD4VQ8wZZBGMS5jGUU1HKB/metadata.json b/verification-sources/chain138-metadata-archive/QmVoTyhKc4eBeHxQCq7Rxps7WD4VQ8wZZBGMS5jGUU1HKB/metadata.json new file mode 100644 index 0000000..128ca6c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVoTyhKc4eBeHxQCq7Rxps7WD4VQ8wZZBGMS5jGUU1HKB/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"_wXRP","type":"address"},{"internalType":"address","name":"_hsmSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"DeadlineExpired","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NonceAlreadyUsed","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"xrplTxHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"executor","type":"address"}],"name":"BurnExecuted","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldSigner","type":"address"},{"indexed":false,"internalType":"address","name":"newSigner","type":"address"}],"name":"HSMSignerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"xrplTxHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"executor","type":"address"}],"name":"MintExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"xrplTxHash","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"hsmSignature","type":"bytes"}],"internalType":"struct MintBurnController.BurnRequest","name":"request","type":"tuple"}],"name":"executeBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"xrplTxHash","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"hsmSignature","type":"bytes"}],"internalType":"struct MintBurnController.MintRequest","name":"request","type":"tuple"}],"name":"executeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hsmSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setHSMSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedNonces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wXRP_TOKEN","outputs":[{"internalType":"contract wXRP","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Uses EIP-712 signatures for HSM authorization","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}]},"events":{"EIP712DomainChanged()":{"details":"MAY be emitted to signal that the domain could have changed."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"eip712Domain()":{"details":"See {IERC-5267}."},"executeBurn((address,uint256,bytes32,uint256,uint256,bytes))":{"params":{"request":"Burn request with HSM signature"}},"executeMint((address,uint256,bytes32,uint256,uint256,bytes))":{"params":{"request":"Mint request with HSM signature"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setHSMSigner(address)":{"params":{"newSigner":"New HSM signer address"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"MintBurnController","version":1},"userdoc":{"kind":"user","methods":{"executeBurn((address,uint256,bytes32,uint256,uint256,bytes))":{"notice":"Execute burn with HSM signature"},"executeMint((address,uint256,bytes32,uint256,uint256,bytes))":{"notice":"Execute mint with HSM signature"},"pause()":{"notice":"Pause controller"},"setHSMSigner(address)":{"notice":"Update HSM signer address"},"unpause()":{"notice":"Unpause controller"}},"notice":"HSM-backed controller for wXRP mint/burn operations","version":1}},"settings":{"compilationTarget":{"contracts/bridge/interop/MintBurnController.sol":"MintBurnController"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol":{"keccak256":"0x2659248df25e34000ed214b3dc8da2160bc39874c992b477d9e2b1b3283dc073","license":"MIT","urls":["bzz-raw://c345af1b0e7ea28d1216d6a04ab28f5534a5229b9edf9ca3cd0e84950ae58d26","dweb:/ipfs/QmY63jtSrYpLRe8Gj1ep2vMDCKxGNNG3hnNVKBVnrs2nmA"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/bridge/interop/MintBurnController.sol":{"keccak256":"0x294a863b1a195f3abc41f45672bfcbc4ba6a447b22129f97edcb4572ca960e04","license":"MIT","urls":["bzz-raw://6aa97020c939dfca13935802813ccaa4846a45d986e16a75af93eaf819f269e7","dweb:/ipfs/QmWrrrF3XXsy5eM1uAYesggtPvXxjfVyZmrpScRhUAtr5p"]},"contracts/bridge/interop/wXRP.sol":{"keccak256":"0xe648c3bb2c8bb85fdc89b71bc8ca6bf7371505e60ea2bde3c61b922549fd6242","license":"MIT","urls":["bzz-raw://2e89e74f7774fa61c50dbae1baed1c827cb9b1aecab45050073e42d8773f53b6","dweb:/ipfs/Qmf4axmrG9A8RDg5hM4wnwTY6ygpq1v49u63911JmhBb9X"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVrGh2ykbxXesdvbQyCZFU17LauLvaMeQiszFp8rnmpvi/archive-info.json b/verification-sources/chain138-metadata-archive/QmVrGh2ykbxXesdvbQyCZFU17LauLvaMeQiszFp8rnmpvi/archive-info.json new file mode 100644 index 0000000..9e7861b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVrGh2ykbxXesdvbQyCZFU17LauLvaMeQiszFp8rnmpvi/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVrGh2ykbxXesdvbQyCZFU17LauLvaMeQiszFp8rnmpvi", + "metadata_digest": "6f98561d4b74968af1016281197028621aa731a5926f9ad71449c6990953f557", + "source_path": "contracts/iso4217w/controllers/MintController.sol", + "contract_name": "MintController", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVrGh2ykbxXesdvbQyCZFU17LauLvaMeQiszFp8rnmpvi/metadata.json b/verification-sources/chain138-metadata-archive/QmVrGh2ykbxXesdvbQyCZFU17LauLvaMeQiszFp8rnmpvi/metadata.json new file mode 100644 index 0000000..bd6b43e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVrGh2ykbxXesdvbQyCZFU17LauLvaMeQiszFp8rnmpvi/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"reserveOracle_","type":"address"},{"internalType":"address","name":"complianceGuard_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"settlementId","type":"bytes32"}],"name":"MintExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"name":"MintRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"approveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"canMint","outputs":[{"internalType":"bool","name":"allowed","type":"bool"},{"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"complianceGuard","outputs":[{"internalType":"contract IComplianceGuard","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isApprovedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isOracleQuorumMet","outputs":[{"internalType":"bool","name":"quorumMet","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"settlementId","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveOracle","outputs":[{"internalType":"contract IReserveOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"revokeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"complianceGuard_","type":"address"}],"name":"setComplianceGuard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reserveOracle_","type":"address"}],"name":"setReserveOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Minting requires: verified fiat settlement, custodian attestation, oracle quorum","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"approveToken(address)":{"params":{"token":"Token address"}},"canMint(address,uint256)":{"params":{"amount":"Amount to mint","token":"Token address"},"returns":{"allowed":"True if minting is allowed","reasonCode":"Reason if not allowed"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isOracleQuorumMet(address)":{"params":{"token":"Token address"},"returns":{"quorumMet":"True if quorum is met"}},"mint(address,address,uint256,bytes32)":{"params":{"amount":"Amount to mint (in token decimals)","settlementId":"Fiat settlement ID for audit trail","to":"Recipient address","token":"Token address"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"revokeToken(address)":{"params":{"token":"Token address"}},"setComplianceGuard(address)":{"params":{"complianceGuard_":"New guard address"}},"setReserveOracle(address)":{"params":{"reserveOracle_":"New oracle address"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"MintController","version":1},"userdoc":{"kind":"user","methods":{"approveToken(address)":{"notice":"Approve a token for minting"},"canMint(address,uint256)":{"notice":"Check if minting is allowed"},"isOracleQuorumMet(address)":{"notice":"Check if oracle quorum is met"},"mint(address,address,uint256,bytes32)":{"notice":"Mint tokens (requires reserve verification)"},"revokeToken(address)":{"notice":"Revoke token approval"},"setComplianceGuard(address)":{"notice":"Set compliance guard address"},"setReserveOracle(address)":{"notice":"Set reserve oracle address"}},"notice":"Controls minting of ISO-4217 W tokens with reserve verification","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/controllers/MintController.sol":"MintController"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/iso4217w/controllers/MintController.sol":{"keccak256":"0xc4681de2d1cb0c3f0b835ebb985fbf734b700283ec135c9288e2fb4811ad204d","license":"MIT","urls":["bzz-raw://05b90ec2ed22d58b7f35a266e3fd76f4d5fa9ab1118113837e6bc996a8e340f1","dweb:/ipfs/QmTn3SyqSWfiGbYDkVUCkJa4FjKiRJegGtYJwBVWDFDVSn"]},"contracts/iso4217w/interfaces/IComplianceGuard.sol":{"keccak256":"0x2f812514f56778c271667c97288de5d8c8b4c3745491a4e787abf4ff02dc74a6","license":"MIT","urls":["bzz-raw://97e6607a8262c270d90c9497df31259e7bb616e2e4d934a1c26c556b5e7e0f9e","dweb:/ipfs/Qmcsy2CjBZVh88yktxpRKawK1xrjMCQMqosPr78HxQWFzZ"]},"contracts/iso4217w/interfaces/IISO4217WToken.sol":{"keccak256":"0xd583b83e8598f54e2f3cc5e8bf954441fa73e959a0b816522eb66528b248d412","license":"MIT","urls":["bzz-raw://103a3010d1805dc5e1bbda03ce9338e03aa0ca36a914677cd45ece3ec8868ae3","dweb:/ipfs/QmQDnC1kxKbtedmyjMN4W8oonbGQ4y6LARWWqn7jK4V8W9"]},"contracts/iso4217w/interfaces/IMintController.sol":{"keccak256":"0xf3db44aba20bcba2d2bef96743dc7c6c6cdc0b8903256f821aef5f90c39c0a5a","license":"MIT","urls":["bzz-raw://69bd577b7f2b6064145073df7ed6a5f4c14ff28e7f43960c17888b04163ffda3","dweb:/ipfs/QmR4fTciLomqyq45EbHUFkDDfeAmfGq7FGSPYKtfA9jucA"]},"contracts/iso4217w/interfaces/IReserveOracle.sol":{"keccak256":"0x2f9808bf9f3816c6ecdf4ef1587561ad965533019d9ce776ade03b85cbca3984","license":"MIT","urls":["bzz-raw://02a32c5327766990352c77017831be93977e32944b078ed68d2583d3f1c06e97","dweb:/ipfs/QmNr3wLfNkxao2VWndxzMDpYDmqP1t5dYdY8NcFi7omFEU"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVrarNbgwbbffqLLN3hKfPDLZ9YQHY3WozMmFPWLrpxEG/archive-info.json b/verification-sources/chain138-metadata-archive/QmVrarNbgwbbffqLLN3hKfPDLZ9YQHY3WozMmFPWLrpxEG/archive-info.json new file mode 100644 index 0000000..04bb87b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVrarNbgwbbffqLLN3hKfPDLZ9YQHY3WozMmFPWLrpxEG/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVrarNbgwbbffqLLN3hKfPDLZ9YQHY3WozMmFPWLrpxEG", + "metadata_digest": "6facdf0045d387412b579d2b9f861277e5c83574604eab896434deec60305845", + "source_path": "contracts/bridge/integration/CWAssetReserveVerifier.sol", + "contract_name": "ICWMultiTokenBridgeL1AccountingV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVrarNbgwbbffqLLN3hKfPDLZ9YQHY3WozMmFPWLrpxEG/metadata.json b/verification-sources/chain138-metadata-archive/QmVrarNbgwbbffqLLN3hKfPDLZ9YQHY3WozMmFPWLrpxEG/metadata.json new file mode 100644 index 0000000..75772eb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVrarNbgwbbffqLLN3hKfPDLZ9YQHY3WozMmFPWLrpxEG/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"lockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"}],"name":"maxOutstanding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"}],"name":"outstandingMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"supportedCanonicalToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"totalOutstanding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/CWAssetReserveVerifier.sol":"ICWMultiTokenBridgeL1AccountingV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/CWAssetReserveVerifier.sol":{"keccak256":"0xcb55f1e9a1cf66ac3664c2b1aefe5fea606cb5cf49d6c1fe28d8a801a6304b26","license":"MIT","urls":["bzz-raw://cd2bdfc516e4e6ada08aea0e897acebdf9fbeca2fde3c4dc2141fcba100a31b3","dweb:/ipfs/QmQ7HiaLuE5x1tMZaMCiLrMMYwLx4ijeyBB9L9Cv7bci2y"]},"contracts/bridge/integration/ICWReserveVerifier.sol":{"keccak256":"0x4fc7b6b8f10d5ec64517fc31559a2b7ac52c7496a7effaac7d29fbfc64f44528","license":"MIT","urls":["bzz-raw://7ef5196aefc98a7d6b295118500062ec62c05d786e3f9ad1ae8414d48279605d","dweb:/ipfs/QmU6cE1rZA99DygbUECyCoQwc5t2g1aJrcs3BiZ4SPoksa"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVsA1aarYWAoUSjjfAyRfPzyLAFx7G5jowJC3ejEkpDqi/archive-info.json b/verification-sources/chain138-metadata-archive/QmVsA1aarYWAoUSjjfAyRfPzyLAFx7G5jowJC3ejEkpDqi/archive-info.json new file mode 100644 index 0000000..4cfbd72 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVsA1aarYWAoUSjjfAyRfPzyLAFx7G5jowJC3ejEkpDqi/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVsA1aarYWAoUSjjfAyRfPzyLAFx7G5jowJC3ejEkpDqi", + "metadata_digest": "6fd25d21f637d84680a521353d209c83d0bac2825358bc7489fa2b3d2e00bfe1", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IERC20.sol", + "contract_name": "IERC20Uniswap", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVsA1aarYWAoUSjjfAyRfPzyLAFx7G5jowJC3ejEkpDqi/metadata.json b/verification-sources/chain138-metadata-archive/QmVsA1aarYWAoUSjjfAyRfPzyLAFx7G5jowJC3ejEkpDqi/metadata.json new file mode 100644 index 0000000..88d3426 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVsA1aarYWAoUSjjfAyRfPzyLAFx7G5jowJC3ejEkpDqi/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IERC20.sol":"IERC20Uniswap"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IERC20.sol":{"keccak256":"0x76866491759a6f069ddc030d52df08d4105a8bcef0e3330dee261cf7ee049b1a","license":"GPL-3.0","urls":["bzz-raw://0b3b2a687415260c33e491cc2d03577729802b5ff8227cc9fd7b45b28cbd24e4","dweb:/ipfs/QmNtBCKh68KLnNj8M2rQDPnbBfKhntzaZ1JReQx4Axtx5w"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmVsVDrFmqUCDSRuSP4wn8kJ1ZN5UZFmFPdTcc9H35cbGj/archive-info.json b/verification-sources/chain138-metadata-archive/QmVsVDrFmqUCDSRuSP4wn8kJ1ZN5UZFmFPdTcc9H35cbGj/archive-info.json new file mode 100644 index 0000000..e918599 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVsVDrFmqUCDSRuSP4wn8kJ1ZN5UZFmFPdTcc9H35cbGj/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmVsVDrFmqUCDSRuSP4wn8kJ1ZN5UZFmFPdTcc9H35cbGj", + "metadata_digest": "6fe8161c9a806c8aeef8ac209f28c3cd674d5018663ce622f83b8d6a9731e650", + "source_path": "contracts/utils/CREATE2Factory.sol", + "contract_name": "CREATE2Factory", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmVsVDrFmqUCDSRuSP4wn8kJ1ZN5UZFmFPdTcc9H35cbGj/metadata.json b/verification-sources/chain138-metadata-archive/QmVsVDrFmqUCDSRuSP4wn8kJ1ZN5UZFmFPdTcc9H35cbGj/metadata.json new file mode 100644 index 0000000..7470dab --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmVsVDrFmqUCDSRuSP4wn8kJ1ZN5UZFmFPdTcc9H35cbGj/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"salt","type":"uint256"}],"name":"Deployed","type":"event"},{"inputs":[{"internalType":"bytes","name":"bytecode","type":"bytes"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"computeAddress","outputs":[{"internalType":"address","name":"addr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"deployer","type":"address"},{"internalType":"bytes","name":"bytecode","type":"bytes"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"computeAddressWithDeployer","outputs":[{"internalType":"address","name":"addr","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"bytecode","type":"bytes"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"deploy","outputs":[{"internalType":"address","name":"addr","type":"address"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Based on the canonical CREATE2 factory pattern","kind":"dev","methods":{"computeAddress(bytes,uint256)":{"params":{"bytecode":"Contract bytecode","salt":"Salt for deterministic address generation"},"returns":{"addr":"Predicted contract address"}},"computeAddressWithDeployer(address,bytes,uint256)":{"params":{"bytecode":"Contract bytecode","deployer":"Deployer address","salt":"Salt for deterministic address generation"},"returns":{"addr":"Predicted contract address"}},"deploy(bytes,uint256)":{"params":{"bytecode":"Contract bytecode","salt":"Salt for deterministic address generation"},"returns":{"addr":"Deployed contract address"}}},"title":"CREATE2 Factory","version":1},"userdoc":{"kind":"user","methods":{"computeAddress(bytes,uint256)":{"notice":"Compute the address that will be created with CREATE2"},"computeAddressWithDeployer(address,bytes,uint256)":{"notice":"Compute the address that will be created with CREATE2 (with deployer)"},"deploy(bytes,uint256)":{"notice":"Deploy a contract using CREATE2"}},"notice":"Factory for deploying contracts at deterministic addresses using CREATE2","version":1}},"settings":{"compilationTarget":{"contracts/utils/CREATE2Factory.sol":"CREATE2Factory"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/utils/CREATE2Factory.sol":{"keccak256":"0x9f4abc4e25969883676ef6277e90c3d82c5c624a544f2cd05e1d14562c563a1c","license":"MIT","urls":["bzz-raw://7f2c6198c4c7f836a4c6d1050d80fc0acae0068166ec52658051f629f07cbc11","dweb:/ipfs/QmTKQWsfMVToZ5Cg4t9AGPaZ4whKvScuAHydT3eiNfyzxn"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmW2WAHVVMry8dkJ6qMbzCgNkKXLw7X5iKYH5hW5DFGjvK/archive-info.json b/verification-sources/chain138-metadata-archive/QmW2WAHVVMry8dkJ6qMbzCgNkKXLw7X5iKYH5hW5DFGjvK/archive-info.json new file mode 100644 index 0000000..dddaab8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmW2WAHVVMry8dkJ6qMbzCgNkKXLw7X5iKYH5hW5DFGjvK/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmW2WAHVVMry8dkJ6qMbzCgNkKXLw7X5iKYH5hW5DFGjvK", + "metadata_digest": "72375ff6f6f4f6cefd7cc270b2d383b6d0580532202e726b1d15ce50b191a834", + "source_path": "contracts/reserve/ReserveTokenIntegration.sol", + "contract_name": "ReserveTokenIntegration", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmW2WAHVVMry8dkJ6qMbzCgNkKXLw7X5iKYH5hW5DFGjvK/metadata.json b/verification-sources/chain138-metadata-archive/QmW2WAHVVMry8dkJ6qMbzCgNkKXLw7X5iKYH5hW5DFGjvK/metadata.json new file mode 100644 index 0000000..ee77e0c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmW2WAHVVMry8dkJ6qMbzCgNkKXLw7X5iKYH5hW5DFGjvK/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"reserveSystem_","type":"address"},{"internalType":"address","name":"tokenFactory_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"reserveAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"newBackingRatio","type":"uint256"}],"name":"ReserveBackingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"reserveAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"backingRatio","type":"uint256"}],"name":"TokenBackedByReserve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceToken","type":"address"},{"indexed":true,"internalType":"address","name":"targetToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sourceAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"targetAmount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"conversionId","type":"bytes32"}],"name":"TokenConvertedViaReserve","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INTEGRATION_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"checkReserveAdequacy","outputs":[{"internalType":"bool","name":"isAdequate","type":"bool"},{"internalType":"uint256","name":"requiredReserve","type":"uint256"},{"internalType":"uint256","name":"currentReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sourceToken","type":"address"},{"internalType":"address","name":"targetToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"convertTokensViaReserve","outputs":[{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"bytes32","name":"conversionId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenBacking","outputs":[{"internalType":"address","name":"reserveAsset","type":"address"},{"internalType":"uint256","name":"backingRatio","type":"uint256"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveAssetToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveBackingRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveSystem","outputs":[{"internalType":"contract IReserveSystem","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"reserveAsset","type":"address"},{"internalType":"uint256","name":"backingRatio","type":"uint256"}],"name":"setTokenBacking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenFactory","outputs":[{"internalType":"contract ITokenFactory138","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenReserveAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"newBackingRatio","type":"uint256"}],"name":"updateBackingRatio","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Enables eMoney tokens to be backed by reserves and converted via the reserve system","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"checkReserveAdequacy(address)":{"params":{"token":"Address of the eMoney token"},"returns":{"currentReserve":"Current reserve amount","isAdequate":"True if reserves are adequate","requiredReserve":"Required reserve amount"}},"convertTokensViaReserve(address,address,uint256)":{"params":{"amount":"Amount of source tokens to convert","sourceToken":"Address of the source eMoney token","targetToken":"Address of the target eMoney token"},"returns":{"conversionId":"Conversion ID from reserve system","targetAmount":"Amount of target tokens received"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getTokenBacking(address)":{"params":{"token":"Address of the eMoney token"},"returns":{"backingRatio":"Backing ratio in basis points","reserveAsset":"Address of the reserve asset","reserveBalance":"Current reserve balance"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setTokenBacking(address,address,uint256)":{"params":{"backingRatio":"Backing ratio in basis points (10000 = 100%)","reserveAsset":"Address of the reserve asset","token":"Address of the eMoney token"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"updateBackingRatio(address,uint256)":{"params":{"newBackingRatio":"New backing ratio in basis points","token":"Address of the eMoney token"}}},"title":"ReserveTokenIntegration","version":1},"userdoc":{"kind":"user","methods":{"checkReserveAdequacy(address)":{"notice":"Check if token has adequate reserve backing"},"convertTokensViaReserve(address,address,uint256)":{"notice":"Convert eMoney tokens via reserve system"},"getTokenBacking(address)":{"notice":"Get reserve backing information for a token"},"setTokenBacking(address,address,uint256)":{"notice":"Set reserve asset backing for an eMoney token"},"updateBackingRatio(address,uint256)":{"notice":"Update reserve backing ratio for a token"}},"notice":"Integrates Reserve System with eMoney Token Factory","version":1}},"settings":{"compilationTarget":{"contracts/reserve/ReserveTokenIntegration.sol":"ReserveTokenIntegration"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/interfaces/ITokenFactory138.sol":{"keccak256":"0x841f40fa43d194f25e2e7d3eea98bcf8176427fbcf0072040e84636fdc8d8423","license":"MIT","urls":["bzz-raw://da86454337c45625cdd5ad6a87aa040f7124911d875243a5e9d3adb2e837fc38","dweb:/ipfs/QmVJ8gB4VRuka1amB1Mj5oDnhXsnwxVUAK8ShkKQugbHFk"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]},"contracts/reserve/ReserveTokenIntegration.sol":{"keccak256":"0x7d7db683b45951644862ea9407a9e3c0e738af372841f1961cc9a44751eaefe9","license":"MIT","urls":["bzz-raw://fc5ddf0313d828f0ce36719ca8daa6c35d1938fe783c0e75d448f914e594ed0f","dweb:/ipfs/QmaZefJ95Zhbv8HgCeyvim7wWvPsH1RNAKDGZ3Q34XaySN"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmW2vqMkboVFZ6SQAk7bvQ3fMLJ6ohjMmrWYtqrkEw6Kcj/archive-info.json b/verification-sources/chain138-metadata-archive/QmW2vqMkboVFZ6SQAk7bvQ3fMLJ6ohjMmrWYtqrkEw6Kcj/archive-info.json new file mode 100644 index 0000000..6dac672 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmW2vqMkboVFZ6SQAk7bvQ3fMLJ6ohjMmrWYtqrkEw6Kcj/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmW2vqMkboVFZ6SQAk7bvQ3fMLJ6ohjMmrWYtqrkEw6Kcj", + "metadata_digest": "72534602e06097b039d2ee8815782dbdaa96a892e3a59982076dcebbf81d9328", + "source_path": "contracts/ccip/CCIPWETH10Bridge.sol", + "contract_name": "CCIPWETH10Bridge", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmW2vqMkboVFZ6SQAk7bvQ3fMLJ6ohjMmrWYtqrkEw6Kcj/metadata.json b/verification-sources/chain138-metadata-archive/QmW2vqMkboVFZ6SQAk7bvQ3fMLJ6ohjMmrWYtqrkEw6Kcj/metadata.json new file mode 100644 index 0000000..0cfe469 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmW2vqMkboVFZ6SQAk7bvQ3fMLJ6ohjMmrWYtqrkEw6Kcj/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_ccipRouter","type":"address"},{"internalType":"address","name":"_weth10","type":"address"},{"internalType":"address","name":"_feeToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CrossChainTransferCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"CrossChainTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiverBridge","type":"address"}],"name":"DestinationAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"DestinationRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiverBridge","type":"address"}],"name":"DestinationUpdated","type":"event"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiverBridge","type":"address"}],"name":"addDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ccipRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"destinationChains","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destinations","outputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiverBridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDestinationChains","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"removeDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendCrossChain","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiverBridge","type":"address"}],"name":"updateDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeToken","type":"address"}],"name":"updateFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth10","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Enables users to send WETH10 tokens across chains via CCIP","kind":"dev","methods":{"calculateFee(uint64,uint256)":{"params":{"amount":"The amount of WETH10 to send","destinationChainSelector":"The chain selector of the destination chain"},"returns":{"fee":"The fee required for the transfer"}},"ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"params":{"message":"The CCIP message"}},"sendCrossChain(uint64,address,uint256)":{"params":{"amount":"The amount of WETH10 to send","destinationChainSelector":"The chain selector of the destination chain","recipient":"The recipient address on the destination chain"},"returns":{"messageId":"The CCIP message ID"}}},"title":"CCIP WETH10 Bridge","version":1},"userdoc":{"kind":"user","methods":{"addDestination(uint64,address)":{"notice":"Add destination chain"},"calculateFee(uint64,uint256)":{"notice":"Calculate fee for cross-chain transfer"},"ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"notice":"Receive WETH10 tokens from another chain via CCIP"},"changeAdmin(address)":{"notice":"Change admin"},"getDestinationChains()":{"notice":"Get destination chains"},"getUserNonce(address)":{"notice":"Get user nonce"},"removeDestination(uint64)":{"notice":"Remove destination chain"},"sendCrossChain(uint64,address,uint256)":{"notice":"Send WETH10 tokens to another chain via CCIP"},"updateDestination(uint64,address)":{"notice":"Update destination receiver bridge"},"updateFeeToken(address)":{"notice":"Update fee token"}},"notice":"Cross-chain WETH10 transfer bridge using Chainlink CCIP","version":1}},"settings":{"compilationTarget":{"contracts/ccip/CCIPWETH10Bridge.sol":"CCIPWETH10Bridge"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"contracts/ccip/CCIPWETH10Bridge.sol":{"keccak256":"0xb656b60a0744a7aaa95edd7fac1c3b0b7d981ec249f66c0601857481c5f51172","license":"MIT","urls":["bzz-raw://50889156535cf4f4686fc4ebe4c8c65ae32726d1d01f0bfd136754d9cdcec77f","dweb:/ipfs/QmePfjMnNyUMRz66HaGz8oQwfGdtHkpANEfza4VFfvLHzH"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmW57izUEd6uWXQe1FTkNDLrULDwSHqSV6pWxFLV1ezbx3/archive-info.json b/verification-sources/chain138-metadata-archive/QmW57izUEd6uWXQe1FTkNDLrULDwSHqSV6pWxFLV1ezbx3/archive-info.json new file mode 100644 index 0000000..84b2c22 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmW57izUEd6uWXQe1FTkNDLrULDwSHqSV6pWxFLV1ezbx3/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmW57izUEd6uWXQe1FTkNDLrULDwSHqSV6pWxFLV1ezbx3", + "metadata_digest": "72e2bfabe2d0e016f7ac2e0edf97d575c67644e5ae5995d298f352e621e957f8", + "source_path": "contracts/wrapped-lp-public/WLPNAVOracle.sol", + "contract_name": "WLPNAVOracle", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmW57izUEd6uWXQe1FTkNDLrULDwSHqSV6pWxFLV1ezbx3/metadata.json b/verification-sources/chain138-metadata-archive/QmW57izUEd6uWXQe1FTkNDLrULDwSHqSV6pWxFLV1ezbx3/metadata.json new file mode 100644 index 0000000..b584445 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmW57izUEd6uWXQe1FTkNDLrULDwSHqSV6pWxFLV1ezbx3/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"heartbeat_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"answer","type":"int256"},{"indexed":false,"internalType":"uint256","name":"updatedAt","type":"uint256"},{"indexed":true,"internalType":"address","name":"keeper","type":"address"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"tripped","type":"bool"}],"name":"CircuitBreakerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"heartbeat","type":"uint256"}],"name":"HeartbeatUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KEEPER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circuitBreaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"heartbeat","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"on","type":"bool"}],"name":"setCircuitBreaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"h","type":"uint256"}],"name":"setHeartbeat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"answer","type":"int256"}],"name":"submitAnswer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Keeper updates `latestAnswer` + `updatedAt`. Consumers must check `isStale()` before liquidations.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"WLPNAVOracle","version":1},"userdoc":{"kind":"user","methods":{"latestAnswer()":{"notice":"Price with 8 decimals (Chainlink USD convention)."}},"notice":"Chainlink-style read interface for wLP / vault share price in USD (8 decimals) for lending adapters.","version":1}},"settings":{"compilationTarget":{"contracts/wrapped-lp-public/WLPNAVOracle.sol":"WLPNAVOracle"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/wrapped-lp-public/WLPNAVOracle.sol":{"keccak256":"0x9ee28f6b204ab6070e7a31a979a7cdf08b1213be74dc259f78c6a5d14e22fa1b","license":"MIT","urls":["bzz-raw://1705f93ea5a5bdf33f3a06afc30b7c260477adcb6d51a31c0230b18b03297e11","dweb:/ipfs/QmSZY6bv1sf3u9PYwQYxSbRrn1GLh9SRPiHHkHCqGMWnoD"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmW5DSv6jFpYyVTWQLZNY7NYq9vQ44P3ET9j9cnsLUp2ey/archive-info.json b/verification-sources/chain138-metadata-archive/QmW5DSv6jFpYyVTWQLZNY7NYq9vQ44P3ET9j9cnsLUp2ey/archive-info.json new file mode 100644 index 0000000..1675a07 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmW5DSv6jFpYyVTWQLZNY7NYq9vQ44P3ET9j9cnsLUp2ey/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmW5DSv6jFpYyVTWQLZNY7NYq9vQ44P3ET9j9cnsLUp2ey", + "metadata_digest": "72e938347b5128fa1785f5fb4e669cd361bb65f0ae8ad47e14a8716520fbeaa6", + "source_path": "contracts/flash/AaveQuotePushFlashReceiver.sol", + "contract_name": "IAaveAtomicBridgeCoordinator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmW5DSv6jFpYyVTWQLZNY7NYq9vQ44P3ET9j9cnsLUp2ey/metadata.json b/verification-sources/chain138-metadata-archive/QmW5DSv6jFpYyVTWQLZNY7NYq9vQ44P3ET9j9cnsLUp2ey/metadata.json new file mode 100644 index 0000000..7bd0ebb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmW5DSv6jFpYyVTWQLZNY7NYq9vQ44P3ET9j9cnsLUp2ey/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"components":[{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"routeId","type":"bytes32"}],"internalType":"struct IAaveAtomicBridgeCoordinator.CreateIntentParams","name":"p","type":"tuple"}],"name":"createIntent","outputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"obligationEscrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"bytes32","name":"settlementMode","type":"bytes32"}],"name":"submitCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/AaveQuotePushFlashReceiver.sol":"IAaveAtomicBridgeCoordinator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/flash/AaveQuotePushFlashReceiver.sol":{"keccak256":"0x9648a35f371bb79c4782933d66237ee759ab4d546950bf79489c87091ff5d7e5","license":"MIT","urls":["bzz-raw://e4360e49daf3f2ac0a7f0299d0083479909f5ae30de80ad647b37421f4d871c8","dweb:/ipfs/QmVAkMWwMEJwFQ5ELSLJhhoxM6oSPUpkrjTzEZkMH5cdh7"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWGjvyuDCVScZCnFR5Afybm8B4ys7Yomfh9zxUYpv1MoD/archive-info.json b/verification-sources/chain138-metadata-archive/QmWGjvyuDCVScZCnFR5Afybm8B4ys7Yomfh9zxUYpv1MoD/archive-info.json new file mode 100644 index 0000000..0dd0870 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWGjvyuDCVScZCnFR5Afybm8B4ys7Yomfh9zxUYpv1MoD/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWGjvyuDCVScZCnFR5Afybm8B4ys7Yomfh9zxUYpv1MoD", + "metadata_digest": "75dd13a22df43ffec0dda2d265db2b4b69ca3854c37bd237a65f0750bc7a5c38", + "source_path": "contracts/liquidity/interfaces/ILiquidityProvider.sol", + "contract_name": "ILiquidityProvider", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWGjvyuDCVScZCnFR5Afybm8B4ys7Yomfh9zxUYpv1MoD/metadata.json b/verification-sources/chain138-metadata-archive/QmWGjvyuDCVScZCnFR5Afybm8B4ys7Yomfh9zxUYpv1MoD/metadata.json new file mode 100644 index 0000000..69cfc14 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWGjvyuDCVScZCnFR5Afybm8B4ys7Yomfh9zxUYpv1MoD/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"estimateGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"executeSwap","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getQuote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"slippageBps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"providerName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"supportsTokenPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/liquidity/interfaces/ILiquidityProvider.sol":"ILiquidityProvider"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/liquidity/interfaces/ILiquidityProvider.sol":{"keccak256":"0xa10b0aef06554835dc192851d0b487bc32d822f73d95558a82f9d37a29071248","license":"MIT","urls":["bzz-raw://5d579daa420f9219b117b44969f43058fbf81979f08a85403dbac621d64955b2","dweb:/ipfs/QmeDFsbuqfnFoVVZQ1S5LMriqLfB8H7qgkCS51yzCydwot"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWHLnMp3JqptAg6Lv8SjBXttFoBSvgvbD42zC1YR5hJrm/archive-info.json b/verification-sources/chain138-metadata-archive/QmWHLnMp3JqptAg6Lv8SjBXttFoBSvgvbD42zC1YR5hJrm/archive-info.json new file mode 100644 index 0000000..0717805 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWHLnMp3JqptAg6Lv8SjBXttFoBSvgvbD42zC1YR5hJrm/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWHLnMp3JqptAg6Lv8SjBXttFoBSvgvbD42zC1YR5hJrm", + "metadata_digest": "76047bb4f9c9faffbb69ae15695bf3bc1631e8d0a9ef93c4b16c7731d5db4eea", + "source_path": "contracts/dex/recovered/RecoveredWave1PoolFamily2682.sol", + "contract_name": "RecoveredWave1PoolFamily2682", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWHLnMp3JqptAg6Lv8SjBXttFoBSvgvbD42zC1YR5hJrm/metadata.json b/verification-sources/chain138-metadata-archive/QmWHLnMp3JqptAg6Lv8SjBXttFoBSvgvbD42zC1YR5hJrm/metadata.json new file mode 100644 index 0000000..d23462b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWHLnMp3JqptAg6Lv8SjBXttFoBSvgvbD42zC1YR5hJrm/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"}],"devdoc":{"details":"Generated by scripts/verify/recover-wave1-pool-source-families.py from live chain bytecode.","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"notice":"Recovered verbatim Wave 1 runtime family artifact.","version":1}},"settings":{"compilationTarget":{"contracts/dex/recovered/RecoveredWave1PoolFamily2682.sol":"RecoveredWave1PoolFamily2682"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/dex/recovered/RecoveredWave1PoolFamily2682.sol":{"keccak256":"0x03c8328d8d913f04220be593be858ccdebf88115605b1316971a661360acd49d","license":"MIT","urls":["bzz-raw://a648cf16c8d7a741c43eba26f071f84501a7cbc0d9e86929b9526ff0a86df89e","dweb:/ipfs/QmP9kZKaPBZkt2nGBCiCcoBsDLsgCudAaVDZZadQJqXLw9"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWJRSi7pw4XroaV9CdibmBHGQ1JgANNfXpPgTEWf1RXon/archive-info.json b/verification-sources/chain138-metadata-archive/QmWJRSi7pw4XroaV9CdibmBHGQ1JgANNfXpPgTEWf1RXon/archive-info.json new file mode 100644 index 0000000..5fce172 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWJRSi7pw4XroaV9CdibmBHGQ1JgANNfXpPgTEWf1RXon/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmWJRSi7pw4XroaV9CdibmBHGQ1JgANNfXpPgTEWf1RXon", + "metadata_digest": "764b55a0ceb388b2ce118dfc2d77f5936387ad4abd40540734bb3fac8d2dbc11", + "source_path": "contracts/vendor/sushiswap-v2/UniswapV2Factory.sol", + "contract_name": "UniswapV2Factory", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWJRSi7pw4XroaV9CdibmBHGQ1JgANNfXpPgTEWf1RXon/metadata.json b/verification-sources/chain138-metadata-archive/QmWJRSi7pw4XroaV9CdibmBHGQ1JgANNfXpPgTEWf1RXon/metadata.json new file mode 100644 index 0000000..aa85023 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWJRSi7pw4XroaV9CdibmBHGQ1JgANNfXpPgTEWf1RXon/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PairCreated","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairCodeHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"}],"name":"setFeeToSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/UniswapV2Factory.sol":"UniswapV2Factory"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/UniswapV2ERC20.sol":{"keccak256":"0x2effe906b7ffa4fd9ff704fb426f46d21b9af881bbc9ca35f221531243251826","license":"GPL-3.0","urls":["bzz-raw://27a0ecc1fff91645ccd91ba3305272aeb3fbd124a48760e984a0b7c192946377","dweb:/ipfs/QmZpWRVXgSvesXppoitQiEWv4QWw5Xt1e34rxocYcswn1b"]},"contracts/vendor/sushiswap-v2/UniswapV2Factory.sol":{"keccak256":"0x4a86bb81433b0d6e7bf64f824c664ee85c46ca97a25aca98b97d8ed9618400db","license":"GPL-3.0","urls":["bzz-raw://6dd2daf6a0cb681268f61fda506710986ffd767715ac292fb5c07ff3d54f7342","dweb:/ipfs/QmPHNJUTwPFzdhgKdNkWZHkgXa2x1H8x1KDeeDNgi9iZYB"]},"contracts/vendor/sushiswap-v2/UniswapV2Pair.sol":{"keccak256":"0x3b13a4696ca98b08fb2450c8b9820d7c6df6ccfa9274275af5a0fdac7624a2ce","license":"GPL-3.0","urls":["bzz-raw://eb27c08ddfb2387690ab2601c3a5329af50e2337b1ad0f01c9d3ecb86d47286b","dweb:/ipfs/Qmerb5ys7C8AQZLAnWgEGRCxkzCXYHRQiYjfZHRZ5JAKhJ"]},"contracts/vendor/sushiswap-v2/interfaces/IERC20.sol":{"keccak256":"0x76866491759a6f069ddc030d52df08d4105a8bcef0e3330dee261cf7ee049b1a","license":"GPL-3.0","urls":["bzz-raw://0b3b2a687415260c33e491cc2d03577729802b5ff8227cc9fd7b45b28cbd24e4","dweb:/ipfs/QmNtBCKh68KLnNj8M2rQDPnbBfKhntzaZ1JReQx4Axtx5w"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Callee.sol":{"keccak256":"0x6bf2e1cd601f8df7a25606a03fb01532f33aa5d77278ef6e7fb72a3b95a2d8d8","license":"GPL-3.0","urls":["bzz-raw://aaaf7c44351d883b3830e484cc20fe1f91b832aaeb8c4631b1848b6bb08c7661","dweb:/ipfs/QmbxistLwfsuywWLHgBpDcQu4f5j6wV13Vs3JrSd1gjX9N"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xcaec675e6250bf4cd3364459a0cbf789262af2aaa377d61d4d463f657aea7b50","license":"GPL-3.0","urls":["bzz-raw://2c09e004aa8654e1ad2a1e9d8500883f618d754e5a77c840e2c9064c7a80b5cb","dweb:/ipfs/QmamoA2xnZpLsu4gjNaWkfdYcL5VjRpFmR5shpoJ8wYjZw"]},"contracts/vendor/sushiswap-v2/libraries/Math.sol":{"keccak256":"0x3e0a5520297ed1dc711407fb10e309db409fc8143e19a0a7751aa064bb99dfa1","license":"GPL-3.0","urls":["bzz-raw://5d44428171de5cd02c255aebd53d88e78cfee0b877bc1a13bbafa6e83eb0597d","dweb:/ipfs/QmXLVkrxEpA57vgP2CYh26PPGqaFy8C5peKKSdLobfCv31"]},"contracts/vendor/sushiswap-v2/libraries/SafeMath.sol":{"keccak256":"0xbde2cf4655f2f21a4e6cc76c28cf88ade1d8150289c208d48662135be9d5dd97","license":"GPL-3.0","urls":["bzz-raw://bd8f46ed9dc5ad8123e596a3b762815503a04ce8a83098d80ba45085fe3c5953","dweb:/ipfs/QmUa6d2v7Miy26dzUctkrumi5My4G34TL9QNUj9u4hh7iS"]},"contracts/vendor/sushiswap-v2/libraries/UQ112x112.sol":{"keccak256":"0xc4574ee73aa220d7a8b363ef7c874c099b6007b0f30365993e758c8337a294d8","license":"GPL-3.0","urls":["bzz-raw://e27c362f1a0f0bf97004bccab2b19faaea0706bc8a21febca6e365de77a20536","dweb:/ipfs/QmZipPjDSok9FxPjMB5rPTuJ7P2VvhaNzHA92TpYvE16FR"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWJnqNAz44c4KLdarhU59A8iburUxJQgzGBuNaBPpp3L2/archive-info.json b/verification-sources/chain138-metadata-archive/QmWJnqNAz44c4KLdarhU59A8iburUxJQgzGBuNaBPpp3L2/archive-info.json new file mode 100644 index 0000000..089d86a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWJnqNAz44c4KLdarhU59A8iburUxJQgzGBuNaBPpp3L2/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWJnqNAz44c4KLdarhU59A8iburUxJQgzGBuNaBPpp3L2", + "metadata_digest": "7663855c4326c66d681994e4fa1c1b89a9b4b3eed4d595e9ca6a1068c722d39f", + "source_path": "contracts/oracle/IAggregator.sol", + "contract_name": "IAggregator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWJnqNAz44c4KLdarhU59A8iburUxJQgzGBuNaBPpp3L2/metadata.json b/verification-sources/chain138-metadata-archive/QmWJnqNAz44c4KLdarhU59A8iburUxJQgzGBuNaBPpp3L2/metadata.json new file mode 100644 index 0000000..5aca3ed --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWJnqNAz44c4KLdarhU59A8iburUxJQgzGBuNaBPpp3L2/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"answer","type":"uint256"}],"name":"updateAnswer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Based on Chainlink AggregatorV3Interface","kind":"dev","methods":{"decimals()":{"returns":{"_0":"decimals Number of decimals"}},"description()":{"returns":{"_0":"description Description"}},"getRoundData(uint80)":{"params":{"_roundId":"Round ID"},"returns":{"answer":"Answer","answeredInRound":"Answered in round","roundId":"Round ID","startedAt":"Started at timestamp","updatedAt":"Updated at timestamp"}},"latestAnswer()":{"returns":{"_0":"answer Latest answer"}},"latestRoundData()":{"returns":{"answer":"Answer","answeredInRound":"Answered in round","roundId":"Round ID","startedAt":"Started at timestamp","updatedAt":"Updated at timestamp"}},"updateAnswer(uint256)":{"params":{"answer":"New answer value"}},"version()":{"returns":{"_0":"version Version"}}},"title":"IAggregator Interface","version":1},"userdoc":{"kind":"user","methods":{"decimals()":{"notice":"Get decimals"},"description()":{"notice":"Get description"},"getRoundData(uint80)":{"notice":"Get round data for a specific round"},"latestAnswer()":{"notice":"Get the latest answer"},"latestRoundData()":{"notice":"Get the latest round data"},"updateAnswer(uint256)":{"notice":"Update the answer (for transmitters)"},"version()":{"notice":"Get version"}},"notice":"Interface for Chainlink-compatible oracle aggregator","version":1}},"settings":{"compilationTarget":{"contracts/oracle/IAggregator.sol":"IAggregator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/oracle/IAggregator.sol":{"keccak256":"0xcdbf107184805058e5725282eb6ade5778fe5ac5ac4cacc3d12438d2292e2951","license":"MIT","urls":["bzz-raw://552f85c4185c0c6273b28a9b5f5473154c0d490885e597dae305882d64377809","dweb:/ipfs/QmXMp3tKq42tUr1RoxhC81vfwQ7aYPFsGkpq5SHTpUmsnu"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWKHggDSJwEDsrt5gZoH3i3aaQmC5pHsUCMLMNVEHsRBH/archive-info.json b/verification-sources/chain138-metadata-archive/QmWKHggDSJwEDsrt5gZoH3i3aaQmC5pHsUCMLMNVEHsRBH/archive-info.json new file mode 100644 index 0000000..a3d0be6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWKHggDSJwEDsrt5gZoH3i3aaQmC5pHsUCMLMNVEHsRBH/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWKHggDSJwEDsrt5gZoH3i3aaQmC5pHsUCMLMNVEHsRBH", + "metadata_digest": "7684245717f6940b0975ad390f0821361dff93d0488133d5b962257f07416924", + "source_path": "contracts/utils/TokenRegistry.sol", + "contract_name": "TokenRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWKHggDSJwEDsrt5gZoH3i3aaQmC5pHsUCMLMNVEHsRBH/metadata.json b/verification-sources/chain138-metadata-archive/QmWKHggDSJwEDsrt5gZoH3i3aaQmC5pHsUCMLMNVEHsRBH/metadata.json new file mode 100644 index 0000000..c3e15c1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWKHggDSJwEDsrt5gZoH3i3aaQmC5pHsUCMLMNVEHsRBH/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint8","name":"decimals","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenUpdated","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTRAR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"getTokenBySymbol","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTokenInfo","outputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"isNative","type":"bool"},{"internalType":"address","name":"bridgeAddress","type":"address"},{"internalType":"uint256","name":"registeredAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"internalType":"struct TokenRegistry.TokenInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"isTokenActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"isTokenRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"bool","name":"isNative","type":"bool"},{"internalType":"address","name":"bridgeAddress","type":"address"}],"name":"registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"removeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"name":"updateTokenStatus","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Provides a centralized registry for token addresses, metadata, and status","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"constructor":{"params":{"admin":"Address that will receive DEFAULT_ADMIN_ROLE"}},"getAllTokens()":{"returns":{"_0":"Array of token addresses"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getTokenBySymbol(string)":{"params":{"symbol":"Token symbol"},"returns":{"_0":"Token address (address(0) if not found)"}},"getTokenCount()":{"returns":{"_0":"Number of registered tokens"}},"getTokenInfo(address)":{"params":{"tokenAddress":"Address of the token"},"returns":{"_0":"Token information struct"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isTokenActive(address)":{"params":{"tokenAddress":"Address of the token"},"returns":{"_0":"True if active, false otherwise"}},"isTokenRegistered(address)":{"params":{"tokenAddress":"Address of the token"},"returns":{"_0":"True if registered, false otherwise"}},"registerToken(address,string,string,uint8,bool,address)":{"details":"Requires REGISTRAR_ROLE","params":{"bridgeAddress":"Bridge address if this is a bridged token (address(0) if not)","decimals":"Number of decimals","isNative":"Whether this is a native token (e.g., ETH)","name":"Token name","symbol":"Token symbol","tokenAddress":"Address of the token contract"}},"removeToken(address)":{"details":"Requires REGISTRAR_ROLE","params":{"tokenAddress":"Address of the token"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"updateTokenStatus(address,bool)":{"details":"Requires REGISTRAR_ROLE","params":{"isActive":"New active status","tokenAddress":"Address of the token"}}},"title":"TokenRegistry","version":1},"userdoc":{"kind":"user","methods":{"constructor":{"notice":"Constructor"},"getAllTokens()":{"notice":"Get all registered tokens"},"getTokenBySymbol(string)":{"notice":"Get token address by symbol"},"getTokenCount()":{"notice":"Get count of registered tokens"},"getTokenInfo(address)":{"notice":"Get token information"},"isTokenActive(address)":{"notice":"Check if a token is active"},"isTokenRegistered(address)":{"notice":"Check if a token is registered"},"registerToken(address,string,string,uint8,bool,address)":{"notice":"Register a new token"},"removeToken(address)":{"notice":"Remove a token from the registry"},"updateTokenStatus(address,bool)":{"notice":"Update token status"}},"notice":"Registry for all tokens on ChainID 138","version":1}},"settings":{"compilationTarget":{"contracts/utils/TokenRegistry.sol":"TokenRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/utils/TokenRegistry.sol":{"keccak256":"0xae8342600d1c8727a44fb594a8b75550e4970e8cc337c7ee8e744581c01a69b1","license":"MIT","urls":["bzz-raw://0f75bf3214b2e081fd2527031257df7882ab85bc969bb564e9770836eb496060","dweb:/ipfs/QmcJHmbRbpiYASAdDFMnWA1iMPMXTSefypJxQvgGexAicY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWLAoBpHqXDLefeDyKXYUcWvWj3TSfWnE6vg5gn23WNzp/archive-info.json b/verification-sources/chain138-metadata-archive/QmWLAoBpHqXDLefeDyKXYUcWvWj3TSfWnE6vg5gn23WNzp/archive-info.json new file mode 100644 index 0000000..39b6d3d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWLAoBpHqXDLefeDyKXYUcWvWj3TSfWnE6vg5gn23WNzp/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWLAoBpHqXDLefeDyKXYUcWvWj3TSfWnE6vg5gn23WNzp", + "metadata_digest": "76bdef4c3493e98749f7f5b22b750f6e27cd12ebfb076aa010df359199a2c015", + "source_path": "contracts/treasury/StrategyExecutor138.sol", + "contract_name": "StrategyExecutor138", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWLAoBpHqXDLefeDyKXYUcWvWj3TSfWnE6vg5gn23WNzp/metadata.json b/verification-sources/chain138-metadata-archive/QmWLAoBpHqXDLefeDyKXYUcWvWj3TSfWnE6vg5gn23WNzp/metadata.json new file mode 100644 index 0000000..250f13b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWLAoBpHqXDLefeDyKXYUcWvWj3TSfWnE6vg5gn23WNzp/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_ccipAdapter","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"CooldownNotElapsed","type":"error"},{"inputs":[],"name":"ExportsNotEnabled","type":"error"},{"inputs":[],"name":"NoPendingIntent","type":"error"},{"inputs":[],"name":"NotImplemented","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"RouterNotApproved","type":"error"},{"inputs":[],"name":"TokenNotApproved","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"CooldownBlocksSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ExportIntentRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum StrategyExecutor138.ExportMode","name":"mode","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"minExportUsd","type":"uint256"}],"name":"ExportPolicySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ExportToMainnetRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PendingIntentProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KEEPER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedRoutersOrLp","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ccipAdapter","outputs":[{"internalType":"contract CcipBridgeAdapter138","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exportPolicy","outputs":[{"internalType":"enum StrategyExecutor138.ExportMode","name":"mode","type":"uint8"},{"internalType":"uint256","name":"minExportUsd","type":"uint256"},{"internalType":"uint256","name":"maxPerTxUsd","type":"uint256"},{"internalType":"uint256","name":"maxDailyUsd","type":"uint256"},{"internalType":"uint256","name":"rateLimitPerHour","type":"uint256"},{"internalType":"uint256","name":"cooldownBlocks","type":"uint256"},{"internalType":"address","name":"exportAsset","type":"address"},{"internalType":"uint64","name":"destinationSelector","type":"uint64"},{"internalType":"address","name":"destinationReceiver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"weth9Token","type":"address"},{"internalType":"uint256","name":"weth9Amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"exportToMainnet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestFees","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastExportBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingIntentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingIntentToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"processPendingIntent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rebalanceLp","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recordExportIntent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"setCooldownBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"enum StrategyExecutor138.ExportMode","name":"mode","type":"uint8"},{"internalType":"uint256","name":"minExportUsd","type":"uint256"},{"internalType":"uint256","name":"maxPerTxUsd","type":"uint256"},{"internalType":"uint256","name":"maxDailyUsd","type":"uint256"},{"internalType":"uint256","name":"rateLimitPerHour","type":"uint256"},{"internalType":"uint256","name":"cooldownBlocks","type":"uint256"},{"internalType":"address","name":"exportAsset","type":"address"},{"internalType":"uint64","name":"destinationSelector","type":"uint64"},{"internalType":"address","name":"destinationReceiver","type":"address"}],"internalType":"struct StrategyExecutor138.ExportPolicy","name":"policy","type":"tuple"}],"name":"setExportPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"routerOrLp","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setRouterOrLp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract TreasuryVault","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Token allowlist = canonical 138 list; no calldata-provided token/receiver for export. See docs/treasury/EXECUTOR_ALLOWLIST_MATRIX.md.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"exportToMainnet(address,uint256,uint256)":{"params":{"deadline":"Revert if block.timestamp > deadline.","weth9Amount":"Amount of WETH9 to export."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"StrategyExecutor138","version":1},"userdoc":{"kind":"user","methods":{"exportToMainnet(address,uint256,uint256)":{"notice":"Request WETH9 from vault and send to mainnet via CCIP. Only allowed WETH9; no calldata destinations."},"harvestFees()":{"notice":"Harvest fees from LP/router. Stub for bot integration; implement when LP contracts are wired."},"processPendingIntent(uint256)":{"notice":"Process the pending export intent once CCIP exports are enabled."},"rebalanceLp()":{"notice":"Rebalance LP positions. Stub for bot integration; implement when LP contracts are wired."},"recordExportIntent(address,uint256)":{"notice":"Record intent to export when CCIP is not yet live. Process later with processPendingIntent(). Only one pending intent (overwrites previous). Call when ccipAdapter.exportsEnabled() is false."}},"notice":"Single \"brain\" that can request moves from TreasuryVault and initiate export via CcipBridgeAdapter138.","version":1}},"settings":{"compilationTarget":{"contracts/treasury/StrategyExecutor138.sol":"StrategyExecutor138"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/ccip/CCIPWETH9Bridge.sol":{"keccak256":"0x9b370018bc9f9184523c5e92a9e704f62df0dd4c240b0a8b59ac33585ef05651","license":"MIT","urls":["bzz-raw://26901f83517dd654b1127c7eac8abbeca0a25d47552b012e86525bcdc6f6cb8a","dweb:/ipfs/QmYvAmmQL8FoTKK6Kb2rzHoUEVfK6gD4GwMXCcwynYJk7d"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/treasury/CcipBridgeAdapter138.sol":{"keccak256":"0x700e89a5b96b8bbee91e964c23420bc4f6f09399a2db9f518cd64498f243e8bb","license":"MIT","urls":["bzz-raw://2fb4d4444f51a9f272aa6db80cbfba7a45cb4c75086b57730a2ad30fed0cc370","dweb:/ipfs/QmU4Pu5FT5JrKjSZLzkMvrndx39RJ4L6eRNjnLQWBrgAMG"]},"contracts/treasury/StrategyExecutor138.sol":{"keccak256":"0xe1931042b27976192a4c048b493c9a949cd5f4e2413e3bd4e549cff0b189bee3","license":"MIT","urls":["bzz-raw://5f49d19299806f91864e861b9d5fd13b2c929e3dc5781153fbb4015f337465ac","dweb:/ipfs/Qmcwtzjwk3nVKsKragyRXViAEUb4FbUcQciVdSFBsh5nbU"]},"contracts/treasury/TreasuryVault.sol":{"keccak256":"0xcf7a323f25f134a54bcbe0aedd3fdeee01c2552b16861239dbe0c609dd9571ac","license":"MIT","urls":["bzz-raw://f09d043fd92d25301dc04375f50c7e73bd3cd34daec6d93bacc0dfd0460df7b1","dweb:/ipfs/QmNMsw2tTg5CCr7KwiwHCJQQD5DjVLHBrFpHw2zjbkqP8m"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWNcsTZhsRAWrHeL2T2KL6K6B6MLGf3GHjU9rB62rNBYp/archive-info.json b/verification-sources/chain138-metadata-archive/QmWNcsTZhsRAWrHeL2T2KL6K6B6MLGf3GHjU9rB62rNBYp/archive-info.json new file mode 100644 index 0000000..432f333 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWNcsTZhsRAWrHeL2T2KL6K6B6MLGf3GHjU9rB62rNBYp/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWNcsTZhsRAWrHeL2T2KL6K6B6MLGf3GHjU9rB62rNBYp", + "metadata_digest": "775e93f3f702f3374752275054f1ed56b7f61442fba955cc3e52e9a8e1062ad5", + "source_path": "contracts/bridge/trustless/ChallengeManager.sol", + "contract_name": "ChallengeManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWNcsTZhsRAWrHeL2T2KL6K6B6MLGf3GHjU9rB62rNBYp/metadata.json b/verification-sources/chain138-metadata-archive/QmWNcsTZhsRAWrHeL2T2KL6K6B6MLGf3GHjU9rB62rNBYp/metadata.json new file mode 100644 index 0000000..82f9c0b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWNcsTZhsRAWrHeL2T2KL6K6B6MLGf3GHjU9rB62rNBYp/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_bondManager","type":"address"},{"internalType":"uint256","name":"_challengeWindow","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ChallengeAlreadyResolved","type":"error"},{"inputs":[],"name":"ChallengeNotFound","type":"error"},{"inputs":[],"name":"ChallengeWindowExpired","type":"error"},{"inputs":[],"name":"ChallengeWindowNotExpired","type":"error"},{"inputs":[],"name":"ClaimAlreadyChallenged","type":"error"},{"inputs":[],"name":"ClaimAlreadyFinalized","type":"error"},{"inputs":[],"name":"ClaimNotFound","type":"error"},{"inputs":[],"name":"InvalidFraudProof","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"ZeroDepositId","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"challenger","type":"address"}],"name":"ChallengeRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"challenger","type":"address"},{"indexed":false,"internalType":"enum ChallengeManager.FraudProofType","name":"proofType","type":"uint8"}],"name":"ClaimChallenged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"ClaimFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"challengeWindowEnd","type":"uint256"}],"name":"ClaimSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"challenger","type":"address"},{"indexed":false,"internalType":"enum ChallengeManager.FraudProofType","name":"proofType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"slashedAmount","type":"uint256"}],"name":"FraudProven","type":"event"},{"inputs":[],"name":"bondManager","outputs":[{"internalType":"contract BondManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"canFinalize","outputs":[{"internalType":"bool","name":"canFinalize_","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"enum ChallengeManager.FraudProofType","name":"proofType","type":"uint8"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"challengeClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"challengeWindow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"challenges","outputs":[{"internalType":"address","name":"challenger","type":"address"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"enum ChallengeManager.FraudProofType","name":"proofType","type":"uint8"},{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"resolved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claims","outputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"challengeWindowEnd","type":"uint256"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"finalizeClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"depositIds","type":"uint256[]"}],"name":"finalizeClaimsBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"getChallenge","outputs":[{"components":[{"internalType":"address","name":"challenger","type":"address"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"enum ChallengeManager.FraudProofType","name":"proofType","type":"uint8"},{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"resolved","type":"bool"}],"internalType":"struct ChallengeManager.Challenge","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"getClaim","outputs":[{"components":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"challengeWindowEnd","type":"uint256"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"}],"internalType":"struct ChallengeManager.Claim","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"registerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Permissionless challenging mechanism with automated slashing on successful challenges","errors":{"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{"canFinalize(uint256)":{"params":{"depositId":"Deposit ID to check"},"returns":{"canFinalize_":"True if claim can be finalized","reason":"Reason if cannot finalize"}},"challengeClaim(uint256,uint8,bytes)":{"params":{"depositId":"Deposit ID of the claim to challenge","proof":"Fraud proof data (format depends on proofType)","proofType":"Type of fraud proof"}},"constructor":{"params":{"_bondManager":"Address of BondManager contract","_challengeWindow":"Challenge window duration in seconds"}},"finalizeClaim(uint256)":{"params":{"depositId":"Deposit ID to finalize"}},"finalizeClaimsBatch(uint256[])":{"params":{"depositIds":"Array of deposit IDs to finalize"}},"getChallenge(uint256)":{"params":{"depositId":"Deposit ID"},"returns":{"_0":"Challenge data"}},"getClaim(uint256)":{"params":{"depositId":"Deposit ID"},"returns":{"_0":"Claim data"}},"registerClaim(uint256,address,uint256,address)":{"params":{"amount":"Deposit amount","asset":"Asset address (address(0) for native ETH)","depositId":"Deposit ID from source chain","recipient":"Recipient address"}}},"title":"ChallengeManager","version":1},"userdoc":{"kind":"user","methods":{"canFinalize(uint256)":{"notice":"Check if a claim can be finalized"},"challengeClaim(uint256,uint8,bytes)":{"notice":"Challenge a claim with fraud proof"},"constructor":{"notice":"Constructor"},"finalizeClaim(uint256)":{"notice":"Finalize a claim after challenge window expires without challenge"},"finalizeClaimsBatch(uint256[])":{"notice":"Finalize multiple claims in batch (gas optimization)"},"getChallenge(uint256)":{"notice":"Get challenge information"},"getClaim(uint256)":{"notice":"Get claim information"},"registerClaim(uint256,address,uint256,address)":{"notice":"Register a claim (called by InboxETH)"}},"notice":"Manages fraud proof challenges for trustless bridge claims","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/ChallengeManager.sol":"ChallengeManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/BondManager.sol":{"keccak256":"0xd9c903ba88cae86f3477b282c24308a3e8da48885518337e551f747576edab8f","license":"MIT","urls":["bzz-raw://77b72abe65c34dbe450d7bef2be8bf49ce2e188fb18955143cae39d1318ed510","dweb:/ipfs/QmTZXXgixwpjzcsGuqRS6X9JWwaFawg2g6ptHWLNoGzeN2"]},"contracts/bridge/trustless/ChallengeManager.sol":{"keccak256":"0x1b78e36725fc1d8e0fc8f93ad6b6fb7c41205df7db81bc790338c9dbfbf9da5f","license":"MIT","urls":["bzz-raw://c6f8aa8fbf2996df80a4d8f97107c4dabebf1bd16da5c1a2c2267f67b421517f","dweb:/ipfs/QmSwYZ2mFi6fbtbZAqPerQVjuqov3QL7ramtrafS8cqijq"]},"contracts/bridge/trustless/libraries/FraudProofTypes.sol":{"keccak256":"0x15e2c59fc46db2ddb33eda2bcd632392564d859942fb1e0026622201f45fe9ab","license":"MIT","urls":["bzz-raw://81e5b0e23122f0d1bccab7d8470987e3aaa787c2d02e140631ff70a83567ae2c","dweb:/ipfs/QmbxNW8tY3FnyFM5GKrEj9Vtr9kLSX6X78xKQGjPdbfd46"]},"contracts/bridge/trustless/libraries/MerkleProofVerifier.sol":{"keccak256":"0x8d92e319d3f83a0e4218d89b598ed86c478a446b4e9271fa1d284842a1aca82b","license":"MIT","urls":["bzz-raw://2aad9a1e47f6e7177b8e7f77ebbb4f9bb32df02f43d07edbd76b7442d49f4e87","dweb:/ipfs/QmXdaJGiAXHqAW9d1zEyBY1vzJhoUaFhzFdPGsxFRrnCLi"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWQHBZSJR4Cw1RmtubVVvMHLT3icukojSyRkkjwnMD4sd/archive-info.json b/verification-sources/chain138-metadata-archive/QmWQHBZSJR4Cw1RmtubVVvMHLT3icukojSyRkkjwnMD4sd/archive-info.json new file mode 100644 index 0000000..cd9fcd0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWQHBZSJR4Cw1RmtubVVvMHLT3icukojSyRkkjwnMD4sd/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWQHBZSJR4Cw1RmtubVVvMHLT3icukojSyRkkjwnMD4sd", + "metadata_digest": "77cb7a7667f0d6599e4c9b9ada8544f3cc9d91766cf5dfb4b20b6d582b4562a4", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol", + "contract_name": "IUniswapV2Factory", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWQHBZSJR4Cw1RmtubVVvMHLT3icukojSyRkkjwnMD4sd/metadata.json b/verification-sources/chain138-metadata-archive/QmWQHBZSJR4Cw1RmtubVVvMHLT3icukojSyRkkjwnMD4sd/metadata.json new file mode 100644 index 0000000..c102bff --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWQHBZSJR4Cw1RmtubVVvMHLT3icukojSyRkkjwnMD4sd/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PairCreated","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setFeeToSetter","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol":"IUniswapV2Factory"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xe5905c0989cf5a865ed9bb7b9252536ca011c5b744017a82a7d4443b9c00a891","urls":["bzz-raw://5d2a90a0a796491507462a3da18c3f8819721d571572d765a2207c35bf0a0389","dweb:/ipfs/Qmf9ACYiT3qzjgsYuhm866FBdiBpRMXAPpQhSFbgqcyhHt"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWSSWka5oMYmKrZdib8CSkLWHSHsL4jFLfhRwW3naTUA2/archive-info.json b/verification-sources/chain138-metadata-archive/QmWSSWka5oMYmKrZdib8CSkLWHSHsL4jFLfhRwW3naTUA2/archive-info.json new file mode 100644 index 0000000..2524b2e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWSSWka5oMYmKrZdib8CSkLWHSHsL4jFLfhRwW3naTUA2/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWSSWka5oMYmKrZdib8CSkLWHSHsL4jFLfhRwW3naTUA2", + "metadata_digest": "785930c252c1127813b46cfe857f80fca1fcc2ae9742842cc7535160676e0c17", + "source_path": "@openzeppelin/contracts/access/Ownable.sol", + "contract_name": "Ownable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWSSWka5oMYmKrZdib8CSkLWHSHsL4jFLfhRwW3naTUA2/metadata.json b/verification-sources/chain138-metadata-archive/QmWSSWka5oMYmKrZdib8CSkLWHSHsL4jFLfhRwW3naTUA2/metadata.json new file mode 100644 index 0000000..5ac0a72 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWSSWka5oMYmKrZdib8CSkLWHSHsL4jFLfhRwW3naTUA2/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. The initial owner is set to the address provided by the deployer. This can later be changed with {transferOwnership}. This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.","errors":{"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"kind":"dev","methods":{"constructor":{"details":"Initializes the contract setting the address provided by the deployer as the initial owner."},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/access/Ownable.sol":"Ownable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWU8RPbQdHBLxm4h18vtAnwUFVBvLd29EFVaDSknH9azK/archive-info.json b/verification-sources/chain138-metadata-archive/QmWU8RPbQdHBLxm4h18vtAnwUFVBvLd29EFVaDSknH9azK/archive-info.json new file mode 100644 index 0000000..3d130d9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWU8RPbQdHBLxm4h18vtAnwUFVBvLd29EFVaDSknH9azK/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWU8RPbQdHBLxm4h18vtAnwUFVBvLd29EFVaDSknH9azK", + "metadata_digest": "78c7e517b76d85839bd55f780fe01e7bdae0813925db2b125fd3f63099595740", + "source_path": "contracts/dex/DVMFactoryAdapter.sol", + "contract_name": "IDVMFactoryOfficial", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWU8RPbQdHBLxm4h18vtAnwUFVBvLd29EFVaDSknH9azK/metadata.json b/verification-sources/chain138-metadata-archive/QmWU8RPbQdHBLxm4h18vtAnwUFVBvLd29EFVaDSknH9azK/metadata.json new file mode 100644 index 0000000..c16f01f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWU8RPbQdHBLxm4h18vtAnwUFVBvLd29EFVaDSknH9azK/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"createDODOVendingMachine","outputs":[{"internalType":"address","name":"newVendingMachine","type":"address"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"DODOPMMIntegration expects IDODOVendingMachine.createDVM(); official DODO uses createDODOVendingMachine.","kind":"dev","methods":{},"title":"DVMFactoryAdapter","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Wraps DODO DVMFactory.createDODOVendingMachine as createDVM for DODOPMMIntegration","version":1}},"settings":{"compilationTarget":{"contracts/dex/DVMFactoryAdapter.sol":"IDVMFactoryOfficial"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/dex/DVMFactoryAdapter.sol":{"keccak256":"0x021884d951cf53f598fdae1cabf66cf315953d1cb942ef020176c748bd60b7d1","license":"MIT","urls":["bzz-raw://ce87f60894385b4f9c528fb48c2dd5ee3965508c59907afce9f5a6d1fd3d3e9c","dweb:/ipfs/QmWoLoBpjjvP2Qs4ak4maw99xxqbSBr99RNRwo1ge7gDWU"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWVyN8roeE6nW8ERRPpmgdd7qoA6YUAS6LLyLyNHeFd69/archive-info.json b/verification-sources/chain138-metadata-archive/QmWVyN8roeE6nW8ERRPpmgdd7qoA6YUAS6LLyLyNHeFd69/archive-info.json new file mode 100644 index 0000000..aca0149 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWVyN8roeE6nW8ERRPpmgdd7qoA6YUAS6LLyLyNHeFd69/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWVyN8roeE6nW8ERRPpmgdd7qoA6YUAS6LLyLyNHeFd69", + "metadata_digest": "7940d115fa8d5b618bde79e0de617fa4740caa69df22320c6ffd8b578714cbfa", + "source_path": "contracts/utils/AddressMapper.sol", + "contract_name": "AddressMapper", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWVyN8roeE6nW8ERRPpmgdd7qoA6YUAS6LLyLyNHeFd69/metadata.json b/verification-sources/chain138-metadata-archive/QmWVyN8roeE6nW8ERRPpmgdd7qoA6YUAS6LLyLyNHeFd69/metadata.json new file mode 100644 index 0000000..15039b6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWVyN8roeE6nW8ERRPpmgdd7qoA6YUAS6LLyLyNHeFd69/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"genesisAddress","type":"address"},{"indexed":true,"internalType":"address","name":"deployedAddress","type":"address"}],"name":"AddressMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"genesisAddress","type":"address"}],"name":"MappingRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"genesisAddress","type":"address"}],"name":"getDeployedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"deployedAddress","type":"address"}],"name":"getGenesisAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isMapped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"genesisAddress","type":"address"}],"name":"removeMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"genesisAddress","type":"address"},{"internalType":"address","name":"deployedAddress","type":"address"}],"name":"setMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract provides a centralized mapping for addresses that were reserved in genesis.json but deployed to different addresses","kind":"dev","methods":{"getDeployedAddress(address)":{"params":{"genesisAddress":"The address from genesis.json"},"returns":{"_0":"deployedAddress The actual deployed address, or address(0) if not mapped"}},"getGenesisAddress(address)":{"params":{"deployedAddress":"The deployed address"},"returns":{"_0":"genesisAddress The genesis address, or address(0) if not mapped"}},"isMapped(address)":{"params":{"addr":"Address to check"},"returns":{"_0":"isMapped True if the address has a mapping"}},"removeMapping(address)":{"params":{"genesisAddress":"The genesis address to remove"}},"setMapping(address,address)":{"params":{"deployedAddress":"The deployed address","genesisAddress":"The genesis address"}},"transferOwnership(address)":{"params":{"newOwner":"The new owner address"}}},"title":"AddressMapper","version":1},"userdoc":{"kind":"user","methods":{"getDeployedAddress(address)":{"notice":"Get the deployed address for a genesis address"},"getGenesisAddress(address)":{"notice":"Get the genesis address for a deployed address"},"isMapped(address)":{"notice":"Check if an address is a genesis address that has been mapped"},"removeMapping(address)":{"notice":"Remove a mapping (owner only)"},"setMapping(address,address)":{"notice":"Add or update a mapping (owner only)"},"transferOwnership(address)":{"notice":"Transfer ownership (owner only)"}},"notice":"Maps reserved genesis.json addresses to actual deployed addresses","version":1}},"settings":{"compilationTarget":{"contracts/utils/AddressMapper.sol":"AddressMapper"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/utils/AddressMapper.sol":{"keccak256":"0xe8e09477970efb1ae7dc7e255b0a808f3bc320456dfc80007e52dffe46faf40c","license":"MIT","urls":["bzz-raw://324b353e5d6849624b054c2325068ac842c63c5460c608c44e6b1b2d74627edd","dweb:/ipfs/QmZhjKij2sHYZ7irranvWRwNyupk2eT3sA8hDJmRDCTZbW"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWXsHrMsbefXyTnZi8rsUcYoumzf8kQJg2WZzLbokXfw4/archive-info.json b/verification-sources/chain138-metadata-archive/QmWXsHrMsbefXyTnZi8rsUcYoumzf8kQJg2WZzLbokXfw4/archive-info.json new file mode 100644 index 0000000..4013ec1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWXsHrMsbefXyTnZi8rsUcYoumzf8kQJg2WZzLbokXfw4/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWXsHrMsbefXyTnZi8rsUcYoumzf8kQJg2WZzLbokXfw4", + "metadata_digest": "79bd1c5122788e6d0978884df6984d89bff601f1756ec03352af836c9e60e5b7", + "source_path": "contracts/vendor/uniswap-v2-periphery/libraries/SafeMath.sol", + "contract_name": "SafeMath", + "compiler": "0.6.6", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/fafa493132a3d2f65cdfc44051edfddd.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWXsHrMsbefXyTnZi8rsUcYoumzf8kQJg2WZzLbokXfw4/metadata.json b/verification-sources/chain138-metadata-archive/QmWXsHrMsbefXyTnZi8rsUcYoumzf8kQJg2WZzLbokXfw4/metadata.json new file mode 100644 index 0000000..93e563f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWXsHrMsbefXyTnZi8rsUcYoumzf8kQJg2WZzLbokXfw4/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.6+commit.6c089d02"},"language":"Solidity","output":{"abi":[],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/libraries/SafeMath.sol":"SafeMath"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-periphery/libraries/SafeMath.sol":{"keccak256":"0x27f0ea82f879b3b01387b583e6d9d0ec858dca3b22b0aad173f8fbda06e761e1","urls":["bzz-raw://0db9cf37793eb7035f0bfced36323d240f0212150009c39a3a108701d9b50b6c","dweb:/ipfs/QmUAdiG9XNcieXkKfiMB49zQqD34FbXFE15csV2KQzwEqg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWaU3MdcoJcQkzrZwqA9wbjFSqMCKLhTPP6XUcxua4a63/archive-info.json b/verification-sources/chain138-metadata-archive/QmWaU3MdcoJcQkzrZwqA9wbjFSqMCKLhTPP6XUcxua4a63/archive-info.json new file mode 100644 index 0000000..8b03b3d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWaU3MdcoJcQkzrZwqA9wbjFSqMCKLhTPP6XUcxua4a63/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWaU3MdcoJcQkzrZwqA9wbjFSqMCKLhTPP6XUcxua4a63", + "metadata_digest": "7a6790742c8ddcee04f79057d262c62542d7ad4b0b59db9b85eebc6e6a056710", + "source_path": "contracts/bridge/atomic/AtomicObligationEscrow.sol", + "contract_name": "AtomicObligationEscrow", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWaU3MdcoJcQkzrZwqA9wbjFSqMCKLhTPP6XUcxua4a63/metadata.json b/verification-sources/chain138-metadata-archive/QmWaU3MdcoJcQkzrZwqA9wbjFSqMCKLhTPP6XUcxua4a63/metadata.json new file mode 100644 index 0000000..b1a617d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWaU3MdcoJcQkzrZwqA9wbjFSqMCKLhTPP6XUcxua4a63/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EscrowExists","type":"error"},{"inputs":[],"name":"EscrowMissing","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientEscrow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EscrowFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EscrowRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EscrowReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"COORDINATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"escrowFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"escrows","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"payer","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"releasedAmount","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"to","type":"address"}],"name":"refundRemaining","outputs":[{"internalType":"uint256","name":"refunded","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"remaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/AtomicObligationEscrow.sol":"AtomicObligationEscrow"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/atomic/AtomicObligationEscrow.sol":{"keccak256":"0x3e8780aa6070bb89bbf6cfd28658347763723994d46606a1aad99787318e7e54","license":"MIT","urls":["bzz-raw://f712adc345f2a2d210cc5a129c00649148f6e7b3410622e9bd0e8e45fa3790cc","dweb:/ipfs/Qme21dFMqSoePbLfsJhh8C7RJAg3dMtWAUD4bJyFqwebid"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWee5doQA92XuAjEf7997XaGyYMeoDeL5dnvQiBrUY3ZS/archive-info.json b/verification-sources/chain138-metadata-archive/QmWee5doQA92XuAjEf7997XaGyYMeoDeL5dnvQiBrUY3ZS/archive-info.json new file mode 100644 index 0000000..8970153 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWee5doQA92XuAjEf7997XaGyYMeoDeL5dnvQiBrUY3ZS/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWee5doQA92XuAjEf7997XaGyYMeoDeL5dnvQiBrUY3ZS", + "metadata_digest": "7b793d2d191887b7d0166b2ea02496a7df6995113dbe88008507ef34c8f84ac9", + "source_path": "contracts/bridge/trustless/integration/StablecoinPegManager.sol", + "contract_name": "StablecoinPegManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWee5doQA92XuAjEf7997XaGyYMeoDeL5dnvQiBrUY3ZS/metadata.json b/verification-sources/chain138-metadata-archive/QmWee5doQA92XuAjEf7997XaGyYMeoDeL5dnvQiBrUY3ZS/metadata.json new file mode 100644 index 0000000..d63463b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWee5doQA92XuAjEf7997XaGyYMeoDeL5dnvQiBrUY3ZS/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_reserveSystem","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AssetNotRegistered","type":"error"},{"inputs":[],"name":"InvalidTargetPrice","type":"error"},{"inputs":[],"name":"InvalidThreshold","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"targetPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"thresholdBps","type":"uint256"}],"name":"AssetRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"currentPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"targetPrice","type":"uint256"},{"indexed":false,"internalType":"int256","name":"deviationBps","type":"int256"},{"indexed":false,"internalType":"bool","name":"isMaintained","type":"bool"}],"name":"PegChecked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"PegThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"int256","name":"deviationBps","type":"int256"},{"indexed":false,"internalType":"uint256","name":"requiredAdjustment","type":"uint256"}],"name":"RebalancingTriggered","type":"event"},{"inputs":[],"name":"ETH_TARGET_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PEG_THRESHOLD_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USD_TARGET_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assetPegs","outputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"targetPrice","type":"uint256"},{"internalType":"uint256","name":"thresholdBps","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"currentPrice","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"}],"name":"calculateDeviation","outputs":[{"internalType":"int256","name":"deviationBps","type":"int256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"weth","type":"address"}],"name":"checkETHpeg","outputs":[{"internalType":"bool","name":"isMaintained","type":"bool"},{"internalType":"int256","name":"deviationBps","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stablecoin","type":"address"}],"name":"checkUSDpeg","outputs":[{"internalType":"bool","name":"isMaintained","type":"bool"},{"internalType":"int256","name":"deviationBps","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPegThresholdBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getPegStatus","outputs":[{"internalType":"uint256","name":"currentPrice","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"},{"internalType":"int256","name":"deviationBps","type":"int256"},{"internalType":"bool","name":"isMaintained","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportedAssets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUSDStablecoin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"registerUSDStablecoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"weth","type":"address"}],"name":"registerWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveSystem","outputs":[{"internalType":"contract IReserveSystem","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setETHPegThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setUSDPegThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedAssets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"triggerRebalancing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdPegThresholdBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Monitors peg status and triggers rebalancing if deviation exceeds thresholds","errors":{"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{"calculateDeviation(address,uint256,uint256)":{"params":{"asset":"Asset address","currentPrice":"Current price","targetPrice":"Target price"},"returns":{"deviationBps":"Deviation in basis points (can be negative)"}},"checkETHpeg(address)":{"params":{"weth":"WETH address"},"returns":{"deviationBps":"Deviation in basis points","isMaintained":"Whether peg is maintained"}},"checkUSDpeg(address)":{"params":{"stablecoin":"Stablecoin address"},"returns":{"deviationBps":"Deviation in basis points","isMaintained":"Whether peg is maintained"}},"constructor":{"params":{"_reserveSystem":"ReserveSystem contract address"}},"getPegStatus(address)":{"params":{"asset":"Asset address"},"returns":{"currentPrice":"Current price","deviationBps":"Deviation in basis points","isMaintained":"Whether peg is maintained","targetPrice":"Target price"}},"getSupportedAssets()":{"returns":{"_0":"Array of supported asset addresses"}},"owner()":{"details":"Returns the address of the current owner."},"registerUSDStablecoin(address)":{"params":{"asset":"Asset address (USDT, USDC, DAI)"}},"registerWETH(address)":{"params":{"weth":"WETH token address"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"setETHPegThreshold(uint256)":{"params":{"newThreshold":"New threshold in basis points"}},"setUSDPegThreshold(uint256)":{"params":{"newThreshold":"New threshold in basis points"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"triggerRebalancing(address)":{"params":{"asset":"Asset address"}}},"title":"StablecoinPegManager","version":1},"userdoc":{"kind":"user","methods":{"calculateDeviation(address,uint256,uint256)":{"notice":"Calculate deviation from target price"},"checkETHpeg(address)":{"notice":"Check ETH peg for WETH"},"checkUSDpeg(address)":{"notice":"Check USD peg for a stablecoin"},"constructor":{"notice":"Constructor"},"getPegStatus(address)":{"notice":"Get peg status for an asset"},"getSupportedAssets()":{"notice":"Get all supported assets"},"registerUSDStablecoin(address)":{"notice":"Register a USD stablecoin"},"registerWETH(address)":{"notice":"Register WETH"},"setETHPegThreshold(uint256)":{"notice":"Set ETH peg threshold"},"setUSDPegThreshold(uint256)":{"notice":"Set USD peg threshold"},"triggerRebalancing(address)":{"notice":"Trigger rebalancing if deviation exceeds threshold"}},"notice":"Maintains USD peg for USDT/USDC, ETH peg for WETH, and monitors deviations","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/integration/StablecoinPegManager.sol":"StablecoinPegManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/integration/IStablecoinPegManager.sol":{"keccak256":"0x781bb48403013454143b4b539427949ded1f2627475a4d9fef6d95e070f31017","license":"MIT","urls":["bzz-raw://df35bbad3d7a6fcabfc9d543b750e8c2f6736c2fc69bcd3b7f8f22f98e5d395c","dweb:/ipfs/QmQjnE74iygDFtQmXKNuHmjdf1LKekiWcrW1UxW4r1oXrG"]},"contracts/bridge/trustless/integration/StablecoinPegManager.sol":{"keccak256":"0x6749026bb43c8f58e994f3da7fc7ac6525a8c5170ece4212ce29c2b38d3bae17","license":"MIT","urls":["bzz-raw://5d32aa2c12dcb715668b646387e86bec629023fbac71c826e77047fb2e2046a6","dweb:/ipfs/QmTDQke3zpUXS1vJbDeyendamTAyjVumDNYvgdHGWUxMgg"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWgoqL8MUbNPmsxMg7F7fJDLnKCDRTV6qkVSPmxys59ra/archive-info.json b/verification-sources/chain138-metadata-archive/QmWgoqL8MUbNPmsxMg7F7fJDLnKCDRTV6qkVSPmxys59ra/archive-info.json new file mode 100644 index 0000000..31ca9ba --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWgoqL8MUbNPmsxMg7F7fJDLnKCDRTV6qkVSPmxys59ra/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWgoqL8MUbNPmsxMg7F7fJDLnKCDRTV6qkVSPmxys59ra", + "metadata_digest": "7c076dc2e077185d791a49f70276e9791bcba207f9f31f830de597536827f2db", + "source_path": "contracts/bridge/trustless/RouteTypesV2.sol", + "contract_name": "RouteTypesV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWgoqL8MUbNPmsxMg7F7fJDLnKCDRTV6qkVSPmxys59ra/metadata.json b/verification-sources/chain138-metadata-archive/QmWgoqL8MUbNPmsxMg7F7fJDLnKCDRTV6qkVSPmxys59ra/metadata.json new file mode 100644 index 0000000..fb1bf44 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWgoqL8MUbNPmsxMg7F7fJDLnKCDRTV6qkVSPmxys59ra/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/RouteTypesV2.sol":"RouteTypesV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWhyxMBbu4ZqDRUsv7GKscFDQGeXFWDTgTYKiBC6RqKis/archive-info.json b/verification-sources/chain138-metadata-archive/QmWhyxMBbu4ZqDRUsv7GKscFDQGeXFWDTgTYKiBC6RqKis/archive-info.json new file mode 100644 index 0000000..6c390b0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWhyxMBbu4ZqDRUsv7GKscFDQGeXFWDTgTYKiBC6RqKis/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWhyxMBbu4ZqDRUsv7GKscFDQGeXFWDTgTYKiBC6RqKis", + "metadata_digest": "7c54741346af219e0d818b7405658cdd4643be2e0e995a8b942c9e81a31ce9e4", + "source_path": "contracts/liquidity/providers/DODOPMMProvider.sol", + "contract_name": "DODOPMMProvider", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWhyxMBbu4ZqDRUsv7GKscFDQGeXFWDTgTYKiBC6RqKis/metadata.json b/verification-sources/chain138-metadata-archive/QmWhyxMBbu4ZqDRUsv7GKscFDQGeXFWDTgTYKiBC6RqKis/metadata.json new file mode 100644 index 0000000..db297b1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWhyxMBbu4ZqDRUsv7GKscFDQGeXFWDTgTYKiBC6RqKis/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_dodoIntegration","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"address","name":"pool","type":"address"}],"name":"PoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"newK","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newI","type":"uint256"}],"name":"PoolOptimized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dodoIntegration","outputs":[{"internalType":"contract DODOPMMIntegration","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"ensurePoolExists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"estimateGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"executeSwap","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getQuote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"slippageBps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isKnownPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"newK","type":"uint256"},{"internalType":"uint256","name":"newI","type":"uint256"}],"name":"optimizePoolParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"providerName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"address","name":"pool","type":"address"}],"name":"registerPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"supportsTokenPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Implements ILiquidityProvider for multi-provider liquidity system","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"optimizePoolParameters(address,uint256,uint256)":{"details":"DODO PMM parameters are typically oracle-driven; DVM pools may expose setK/setI. Emits for off-chain monitoring. If the pool supports parameter updates, extend this to call the pool's update functions."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"stateVariables":{"DEFAULT_LP_FEE":{"details":"Default params for stablecoin pairs: 0.03% fee, 1:1 price, k=0.5e18"}},"title":"DODOPMMProvider","version":1},"userdoc":{"kind":"user","methods":{"ensurePoolExists(address,address)":{"notice":"Ensure pool exists for token pair"},"estimateGas(address,address,uint256)":{"notice":"Estimate gas for swap"},"executeSwap(address,address,uint256,uint256)":{"notice":"Execute swap via DODO PMM"},"getQuote(address,address,uint256)":{"notice":"Get quote from DODO PMM"},"optimizePoolParameters(address,uint256,uint256)":{"notice":"Optimize pool parameters (K, I)"},"providerName()":{"notice":"Get provider name"},"registerPool(address,address,address)":{"notice":"Register existing pool"},"supportsTokenPair(address,address)":{"notice":"Check if provider supports token pair"}},"notice":"Wrapper for DODO PMM with extended functionality","version":1}},"settings":{"compilationTarget":{"contracts/liquidity/providers/DODOPMMProvider.sol":"DODOPMMProvider"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dex/DODOPMMIntegration.sol":{"keccak256":"0x1405e3af6768c64eca2f10258049ad1c6ba71facaef4efe24a97ca6d5f068132","license":"MIT","urls":["bzz-raw://cda6ca9dd862d1bbf228d774aa6eb02c4608797da335ac32be00b3f8ad5c1721","dweb:/ipfs/Qmcko5CRpsfR4hx7QmndPUDjcD3bEtQdjzPcJe1u7jDEUB"]},"contracts/liquidity/interfaces/ILiquidityProvider.sol":{"keccak256":"0xa10b0aef06554835dc192851d0b487bc32d822f73d95558a82f9d37a29071248","license":"MIT","urls":["bzz-raw://5d579daa420f9219b117b44969f43058fbf81979f08a85403dbac621d64955b2","dweb:/ipfs/QmeDFsbuqfnFoVVZQ1S5LMriqLfB8H7qgkCS51yzCydwot"]},"contracts/liquidity/providers/DODOPMMProvider.sol":{"keccak256":"0x178119680d032b3fccf6f8dfba12912905fb5657e9d4dbfc4446ff2e8cea8ed3","license":"MIT","urls":["bzz-raw://25d77fe8ec3a769d57beec4b8707cb8fd725e26c9aab2065ee79a748d67bbb9a","dweb:/ipfs/QmTP4K6trYd1zH2vev5WAoPjpnCfUnnfAyzNKg8FAZEHD9"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWk7SgTwJLGwgcvXdUSV7UmwsSjZXBkiypiDfGaegQLFa/archive-info.json b/verification-sources/chain138-metadata-archive/QmWk7SgTwJLGwgcvXdUSV7UmwsSjZXBkiypiDfGaegQLFa/archive-info.json new file mode 100644 index 0000000..680c736 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWk7SgTwJLGwgcvXdUSV7UmwsSjZXBkiypiDfGaegQLFa/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWk7SgTwJLGwgcvXdUSV7UmwsSjZXBkiypiDfGaegQLFa", + "metadata_digest": "7ce01511a2a58c93bcccf6dac8a1b74fc1ce6714322b8166aa669bcff6d099e1", + "source_path": "contracts/dex/MockDVMPool.sol", + "contract_name": "MockDVMPool", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWk7SgTwJLGwgcvXdUSV7UmwsSjZXBkiypiDfGaegQLFa/metadata.json b/verification-sources/chain138-metadata-archive/QmWk7SgTwJLGwgcvXdUSV7UmwsSjZXBkiypiDfGaegQLFa/metadata.json new file mode 100644 index 0000000..a729903 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWk7SgTwJLGwgcvXdUSV7UmwsSjZXBkiypiDfGaegQLFa/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"address","name":"_quoteToken","type":"address"},{"internalType":"uint256","name":"_initialPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"_BASE_RESERVE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_K_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_LP_FEE_RATE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_RESERVE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"buyShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMidPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOraclePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"midPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"querySellBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"querySellQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoteReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoteToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellBase","outputs":[{"internalType":"uint256","name":"receiveQuoteAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellQuote","outputs":[{"internalType":"uint256","name":"receiveBaseAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Not for production; use real DODO DVM when available. Implements view and swap stubs.","kind":"dev","methods":{},"title":"MockDVMPool","version":1},"userdoc":{"kind":"user","methods":{"getOraclePrice()":{"notice":"Oracle price (same as mid for mock); enables MCP dodo_pmm_v2_like profile"}},"notice":"Minimal mock of a DODO PMM pool so DODOPMMIntegration can deploy and create pools on Chain 138","version":1}},"settings":{"compilationTarget":{"contracts/dex/MockDVMPool.sol":"MockDVMPool"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"contracts/dex/MockDVMPool.sol":{"keccak256":"0xc24e46eb32ec6901bdc96eb3d90266f0765314493851b0a3ceb2af38202ff043","license":"MIT","urls":["bzz-raw://a99bbfd3c96d2bc0aae4f5d59809ec85508c687fbc9029743b5aa834ed01b3cf","dweb:/ipfs/QmcaDdUvgFZHw3HNSxDer55Yz6mnDAk9pRCZzJDvRqJj7k"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWmQyM81VQ5Gbueart5rezEKjyWJTyJ4WN3WJ8nLUseJr/archive-info.json b/verification-sources/chain138-metadata-archive/QmWmQyM81VQ5Gbueart5rezEKjyWJTyJ4WN3WJ8nLUseJr/archive-info.json new file mode 100644 index 0000000..373a66d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWmQyM81VQ5Gbueart5rezEKjyWJTyJ4WN3WJ8nLUseJr/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWmQyM81VQ5Gbueart5rezEKjyWJTyJ4WN3WJ8nLUseJr", + "metadata_digest": "7d357ba00670bdd16343d25cfc77b2ce3fc072a5232b1984bbed5280f587675f", + "source_path": "contracts/bridge/atomic/AtomicBridgeCoordinator.sol", + "contract_name": "AtomicBridgeCoordinator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWmQyM81VQ5Gbueart5rezEKjyWJTyJ4WN3WJ8nLUseJr/metadata.json b/verification-sources/chain138-metadata-archive/QmWmQyM81VQ5Gbueart5rezEKjyWJTyJ4WN3WJ8nLUseJr/metadata.json new file mode 100644 index 0000000..d5f03a2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWmQyM81VQ5Gbueart5rezEKjyWJTyJ4WN3WJ8nLUseJr/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"liquidityVault_","type":"address"},{"internalType":"address","name":"fulfillerRegistry_","type":"address"},{"internalType":"address","name":"obligationEscrow_","type":"address"},{"internalType":"address","name":"settlementRouter_","type":"address"},{"internalType":"address","name":"feePolicy_","type":"address"},{"internalType":"address","name":"slashingManager_","type":"address"},{"internalType":"address","name":"protocolTreasury_","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"CorridorDegradedError","type":"error"},{"inputs":[],"name":"CorridorDisabled","type":"error"},{"inputs":[],"name":"DeadlineNotReached","type":"error"},{"inputs":[],"name":"InvalidCorridor","type":"error"},{"inputs":[],"name":"InvalidDeadline","type":"error"},{"inputs":[],"name":"InvalidStatus","type":"error"},{"inputs":[],"name":"MaxNotionalExceeded","type":"error"},{"inputs":[],"name":"MinimumReplenishNotMet","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"ReservedLiquidityLimitExceeded","type":"error"},{"inputs":[],"name":"SettlementBacklogExceeded","type":"error"},{"inputs":[],"name":"SettlementTimeoutNotReached","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"fulfiller","type":"address"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"CommitmentAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"assetIn","type":"address"},{"indexed":true,"internalType":"address","name":"assetOut","type":"address"}],"name":"CorridorConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"reason","type":"bytes32"}],"name":"CorridorDegraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"intentId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"IntentCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"refundedAmount","type":"uint256"}],"name":"IntentRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"replenishAmount","type":"uint256"}],"name":"SettlementConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"settlementId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"settlementMode","type":"bytes32"}],"name":"SettlementInitiated","type":"event"},{"inputs":[],"name":"CORRIDOR_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SETTLEMENT_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"bool","name":"degraded","type":"bool"},{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"maxNotional","type":"uint256"},{"internalType":"uint16","name":"maxReservedBps","type":"uint16"},{"internalType":"uint256","name":"targetBuffer","type":"uint256"},{"internalType":"uint256","name":"maxSettlementBacklog","type":"uint256"},{"internalType":"uint16","name":"maxOracleDriftBps","type":"uint16"},{"internalType":"uint256","name":"fulfilmentTimeout","type":"uint256"},{"internalType":"uint256","name":"settlementTimeout","type":"uint256"},{"internalType":"bytes32","name":"defaultSettlementMode","type":"bytes32"}],"internalType":"struct AtomicTypes.CorridorConfig","name":"cfg","type":"tuple"}],"name":"configureCorridor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"uint256","name":"replenishAmount","type":"uint256"}],"name":"confirmSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"routeId","type":"bytes32"}],"internalType":"struct AtomicBridgeCoordinator.CreateIntentParams","name":"p","type":"tuple"}],"name":"createIntent","outputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feePolicy","outputs":[{"internalType":"contract AtomicFeePolicy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fulfillerRegistry","outputs":[{"internalType":"contract IAtomicFulfillerRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"getCommitment","outputs":[{"components":[{"internalType":"bytes32","name":"intentId","type":"bytes32"},{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"uint256","name":"reservedLiquidity","type":"uint256"},{"internalType":"uint256","name":"bondAmount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes32","name":"settlementMode","type":"bytes32"}],"internalType":"struct AtomicTypes.AtomicCommitment","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"}],"name":"getCorridorConfig","outputs":[{"components":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"bool","name":"degraded","type":"bool"},{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"maxNotional","type":"uint256"},{"internalType":"uint16","name":"maxReservedBps","type":"uint16"},{"internalType":"uint256","name":"targetBuffer","type":"uint256"},{"internalType":"uint256","name":"maxSettlementBacklog","type":"uint256"},{"internalType":"uint16","name":"maxOracleDriftBps","type":"uint16"},{"internalType":"uint256","name":"fulfilmentTimeout","type":"uint256"},{"internalType":"uint256","name":"settlementTimeout","type":"uint256"},{"internalType":"bytes32","name":"defaultSettlementMode","type":"bytes32"}],"internalType":"struct AtomicTypes.CorridorConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"}],"name":"getCorridorId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"getIntent","outputs":[{"components":[{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"routeId","type":"bytes32"},{"internalType":"bytes32","name":"intentId","type":"bytes32"}],"internalType":"struct AtomicTypes.AtomicIntent","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"getObligation","outputs":[{"components":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"bytes32","name":"intentId","type":"bytes32"},{"internalType":"uint256","name":"sourceEscrow","type":"uint256"},{"internalType":"uint256","name":"destinationReserve","type":"uint256"},{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"enum AtomicTypes.ObligationStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"settlementInitiatedAt","type":"uint256"}],"internalType":"struct AtomicTypes.AtomicObligation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"handleSettlementTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"bytes","name":"settlementData","type":"bytes"}],"name":"initiateSettlement","outputs":[{"internalType":"bytes32","name":"settlementId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"intentNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityVault","outputs":[{"internalType":"contract IAtomicLiquidityVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"obligationEscrow","outputs":[{"internalType":"contract AtomicObligationEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"refundExpiredIntent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"bool","name":"degraded","type":"bool"}],"name":"setCorridorDegraded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settlementRouter","outputs":[{"internalType":"contract AtomicSettlementRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"slashingManager","outputs":[{"internalType":"contract AtomicSlashingManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"bytes32","name":"settlementMode","type":"bytes32"}],"name":"submitCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/AtomicBridgeCoordinator.sol":"AtomicBridgeCoordinator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/atomic/AtomicBridgeCoordinator.sol":{"keccak256":"0xd734bd9d9054bae48199ded021c886a9222f298bb6164a7ed1ea368b6f2619f1","license":"MIT","urls":["bzz-raw://af0530ad4b6d204c10b3a5b9145795e4acd2a25ee85011fb1dba625b6e489b93","dweb:/ipfs/QmfGRvN1oH6SSY9QbY74e9EjoZhVhG5gma4Ni8HTBtRdvT"]},"contracts/bridge/atomic/AtomicFeePolicy.sol":{"keccak256":"0xfe8256cd10ae6129f7cd0919a85f81055a129a974052ea5e9015534bc3c23069","license":"MIT","urls":["bzz-raw://f3f08ef8182b2ac2b9ebf6c5f1289214da84a918c79911f65c3bb43448c7a958","dweb:/ipfs/QmesykVxZqsK3E952iVLhhA6zHvfLchcJtftZ7dcstJYA5"]},"contracts/bridge/atomic/AtomicObligationEscrow.sol":{"keccak256":"0x3e8780aa6070bb89bbf6cfd28658347763723994d46606a1aad99787318e7e54","license":"MIT","urls":["bzz-raw://f712adc345f2a2d210cc5a129c00649148f6e7b3410622e9bd0e8e45fa3790cc","dweb:/ipfs/Qme21dFMqSoePbLfsJhh8C7RJAg3dMtWAUD4bJyFqwebid"]},"contracts/bridge/atomic/AtomicSettlementRouter.sol":{"keccak256":"0xc360580846bb131594208af93d7647327a5cbd57c05747cdf6ccc2b876196b0e","license":"MIT","urls":["bzz-raw://652d593fe30f952deaad75b3bd4a453720b68b1464555c86e1375ac1aef91161","dweb:/ipfs/QmTUcwuoNKuUtxjzzfM3cAxf2pPweRSyhwkK4guSJGqdXU"]},"contracts/bridge/atomic/AtomicSlashingManager.sol":{"keccak256":"0x032d17693a83532b96811ab2a6d074fc7f633f9b3bcd0d068573b4154ad17e03","license":"MIT","urls":["bzz-raw://9a04ff170fc789959b32aac35c78e526d7bb4120524e9f83104e5e15c65e33e6","dweb:/ipfs/QmV93uTcENLGAWdPsRWmLr7t2eiRWhHn3KdLKLvdKNvxfv"]},"contracts/bridge/atomic/AtomicTypes.sol":{"keccak256":"0x85a1bdb93368582a1dea40790269ee2eda65047cd8812b88efdee02eebd343c1","license":"MIT","urls":["bzz-raw://ace009c17e8b2d13ef3be8d1116d772fd5e2c4cc3483e17c63915e8d9fa00fba","dweb:/ipfs/Qmayj5VSpYsqftkgYnmTQahKXaBK9tiAivjjMHvyYwZoRM"]},"contracts/bridge/atomic/interfaces/IAtomicBridgeCoordinator.sol":{"keccak256":"0xc46f27fc9863b9cc75578f9e73ad83fff40b072af5113ecb791173c71f0dd52b","license":"MIT","urls":["bzz-raw://a7ab01dc396a4f37fc9feb172b849ba54a27ff84aa3d8a821e440f732be72aee","dweb:/ipfs/Qmcppu22yE9EMUJzH9hfXbpyjZRzTyHEs7RaWpahF4mnbB"]},"contracts/bridge/atomic/interfaces/IAtomicFulfillerRegistry.sol":{"keccak256":"0xdd5c9766af720fb2b40a8e5232b818004999ab640e0420fd4cfd6198fdc9bf56","license":"MIT","urls":["bzz-raw://20a172cfc8b4a54f94bd889d464a84530467ab11085748437158368d931d828d","dweb:/ipfs/QmUKBHadjvVmiSc3cxBcMCg8496hpqFS1gEi4vhQJvj7R7"]},"contracts/bridge/atomic/interfaces/IAtomicLiquidityVault.sol":{"keccak256":"0x9925c6204834dd91ba469fde05c36b0506f9b62ea0d27c4ce1b43cc131cf0de2","license":"MIT","urls":["bzz-raw://28dc9ad6da6abf6db5850ef2528f81b679fdf0df40400a752cb84f6fdcce3df4","dweb:/ipfs/QmY5wVrfriGcXsRHw2HRcUNsFQoGY8AFHiVTYxuCWWD5nX"]},"contracts/bridge/atomic/interfaces/IAtomicSettlementAdapter.sol":{"keccak256":"0x4277422986484c9f70c1748efbc4b211a7ff9c8d2327de8b3b9c923fad1abf8a","license":"MIT","urls":["bzz-raw://b61515a52067561730e08bc58aaf52d99a226c004d19dd4e7756142195e578ec","dweb:/ipfs/QmdBieKpqd7QdEPaPqXJDjH9m7o9LvMLVtLhGcpNBx8B15"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWnKCc3byMsnGZUuWACzFsRY5pDCXrMvJRsuGE7LJBEyB/archive-info.json b/verification-sources/chain138-metadata-archive/QmWnKCc3byMsnGZUuWACzFsRY5pDCXrMvJRsuGE7LJBEyB/archive-info.json new file mode 100644 index 0000000..730e70b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWnKCc3byMsnGZUuWACzFsRY5pDCXrMvJRsuGE7LJBEyB/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWnKCc3byMsnGZUuWACzFsRY5pDCXrMvJRsuGE7LJBEyB", + "metadata_digest": "7d7089b6f2841ebb481425ee1650db6001ddf7211be2c544bb436917d668330e", + "source_path": "contracts/wrapped-lp-public/PublicChainMintController.sol", + "contract_name": "PublicChainMintController", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWnKCc3byMsnGZUuWACzFsRY5pDCXrMvJRsuGE7LJBEyB/metadata.json b/verification-sources/chain138-metadata-archive/QmWnKCc3byMsnGZUuWACzFsRY5pDCXrMvJRsuGE7LJBEyB/metadata.json new file mode 100644 index 0000000..ad7ad2c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWnKCc3byMsnGZUuWACzFsRY5pDCXrMvJRsuGE7LJBEyB/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"wlp_","type":"address"},{"internalType":"address","name":"chain138Locker_","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"}],"name":"LPLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"}],"name":"LPReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"wlpAmount","type":"uint256"}],"name":"RedemptionRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WLPMinted","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELAYER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chain138Locker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintForLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedForLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setMintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlp","outputs":[{"internalType":"contract WLPReceiptToken","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Relayer must verify Chain 138 `LPLocked` event / attestation off-chain or via future ZK proof.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"PublicChainMintController","version":1},"userdoc":{"kind":"user","methods":{"chain138Locker()":{"notice":"Optional Chain 138 locker address for documentation / future cross-verify hooks."},"mintForLock(bytes32,address,uint256)":{"notice":"Idempotent mint keyed by `lockRef` (must match Chain 138 locker emission)."}},"notice":"Destination-chain controller: mints `wLP` once per `lockRef` (replay protection).","version":1}},"settings":{"compilationTarget":{"contracts/wrapped-lp-public/PublicChainMintController.sol":"PublicChainMintController"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/wrapped-lp-public/PublicChainMintController.sol":{"keccak256":"0x31fd80f0684ec0449a39941e672c269d73ed2e40f7fbb72ad17067899a75b873","license":"MIT","urls":["bzz-raw://b460045207cb7b13f0f5f1c2a49acb14a3d1758ea5dd86d8c023e4a09215a98b","dweb:/ipfs/QmU8LogxZTh7CRacW8bb75rYynQB9tAxTenFCWhntazdD8"]},"contracts/wrapped-lp-public/WLPReceiptToken.sol":{"keccak256":"0x9d1879a7675e4ae33c7372f3a58209a27b407f2baf1bcf835c5228c084a2886f","license":"MIT","urls":["bzz-raw://15e061ae708ce3ac36b7fffb3f2816c75ea269ea221d931b123bd12758aa9875","dweb:/ipfs/QmUcs3JbYkq6C2pTKrqoWmCLF3KMkqyGeoMEuTFhKyy5XX"]},"contracts/wrapped-lp-public/interfaces/IWLPProgramEvents.sol":{"keccak256":"0x71b9c9f9de8553c6c638b02cf93ce7d948021c6ca1719d42725f7eca9ea211d2","license":"MIT","urls":["bzz-raw://76c5b3e693702cd5c2cc2b5131e02046346e8b38d88208f9fa030563852f8786","dweb:/ipfs/QmXWwwAB9zjaVBGW8wCx4coiusmFxtvB24jGozaYXeH7M2"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWqjNURKLzcGoFpHe9H7KdYVdaieYohZncCHdgtNj2YY1/archive-info.json b/verification-sources/chain138-metadata-archive/QmWqjNURKLzcGoFpHe9H7KdYVdaieYohZncCHdgtNj2YY1/archive-info.json new file mode 100644 index 0000000..8227c67 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWqjNURKLzcGoFpHe9H7KdYVdaieYohZncCHdgtNj2YY1/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWqjNURKLzcGoFpHe9H7KdYVdaieYohZncCHdgtNj2YY1", + "metadata_digest": "7e509c11d8d12358461f70f96927c6153729c782ad4755c74df0104e1f44938a", + "source_path": "contracts/bridge/interfaces/IAlltraTransport.sol", + "contract_name": "IAlltraTransport", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWqjNURKLzcGoFpHe9H7KdYVdaieYohZncCHdgtNj2YY1/metadata.json b/verification-sources/chain138-metadata-archive/QmWqjNURKLzcGoFpHe9H7KdYVdaieYohZncCHdgtNj2YY1/metadata.json new file mode 100644 index 0000000..acff735 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWqjNURKLzcGoFpHe9H7KdYVdaieYohZncCHdgtNj2YY1/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"isConfigured","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"lockAndRelay","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"ALL Mainnet is not supported by CCIP. This interface is used by AlltraAdapter to delegate the actual lock/relay/mint flow to a custom bridge or relay.","kind":"dev","methods":{"lockAndRelay(address,uint256,address)":{"params":{"amount":"Amount to bridge.","recipient":"Recipient on ALL Mainnet.","token":"Token address (address(0) for native)."},"returns":{"requestId":"Unique request id for status/confirmation."}}},"title":"IAlltraTransport","version":1},"userdoc":{"kind":"user","methods":{"isConfigured()":{"notice":"Check if this transport is configured (e.g. relayer set)."},"lockAndRelay(address,uint256,address)":{"notice":"Lock tokens and initiate transfer to ALL Mainnet (651940)."}},"notice":"Transport for 138 <-> ALL Mainnet (651940); does not use CCIP.","version":1}},"settings":{"compilationTarget":{"contracts/bridge/interfaces/IAlltraTransport.sol":"IAlltraTransport"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/interfaces/IAlltraTransport.sol":{"keccak256":"0x30bdcf8b8ea4a74cdaa4e51e680b5f1faae66e9f6ad8714be1e6ed1d5d9df557","license":"MIT","urls":["bzz-raw://a4200c839b19e9d5c1d2fbc3f82e7c9627042e3db532a93fd57996c1e2e78977","dweb:/ipfs/QmVjCGgLP9Suj8xR6YL6vpCRfaK5ngTSv677dRMqxn3mfH"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWqyPp42cZCUXAC4GiT7k8PuivN7x9PQG41CbvjHEF3GK/archive-info.json b/verification-sources/chain138-metadata-archive/QmWqyPp42cZCUXAC4GiT7k8PuivN7x9PQG41CbvjHEF3GK/archive-info.json new file mode 100644 index 0000000..0100888 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWqyPp42cZCUXAC4GiT7k8PuivN7x9PQG41CbvjHEF3GK/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWqyPp42cZCUXAC4GiT7k8PuivN7x9PQG41CbvjHEF3GK", + "metadata_digest": "7e6077310442e31dea9d5844e30872e7ac0fcd7921ef3806fa06aaec588f6ac0", + "source_path": "contracts/wrapped-lp-public/WLPRedemptionGateway.sol", + "contract_name": "WLPRedemptionGateway", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWqyPp42cZCUXAC4GiT7k8PuivN7x9PQG41CbvjHEF3GK/metadata.json b/verification-sources/chain138-metadata-archive/QmWqyPp42cZCUXAC4GiT7k8PuivN7x9PQG41CbvjHEF3GK/metadata.json new file mode 100644 index 0000000..fbe16ac --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWqyPp42cZCUXAC4GiT7k8PuivN7x9PQG41CbvjHEF3GK/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"wlp_","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"}],"name":"LPLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"}],"name":"LPReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"wlpAmount","type":"uint256"}],"name":"RedemptionRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WLPMinted","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wlpAmount","type":"uint256"}],"name":"requestRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlp","outputs":[{"internalType":"contract WLPReceiptToken","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Relayer observes event, submits `Chain138LPLocker.release*` on 138. Fungible wLP + secondary trading may break 1:1 depositor-only redemption; production may require NFT receipts or curated policy.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"WLPRedemptionGateway","version":1},"userdoc":{"kind":"user","methods":{"requestRedeem(uint256)":{"notice":"User burns wLP; relayer fulfills LP release on 138 per operational policy."}},"notice":"Burns wLP from user and emits `RedemptionRequested` for relayers to release LP on Chain 138.","version":1}},"settings":{"compilationTarget":{"contracts/wrapped-lp-public/WLPRedemptionGateway.sol":"WLPRedemptionGateway"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/wrapped-lp-public/WLPReceiptToken.sol":{"keccak256":"0x9d1879a7675e4ae33c7372f3a58209a27b407f2baf1bcf835c5228c084a2886f","license":"MIT","urls":["bzz-raw://15e061ae708ce3ac36b7fffb3f2816c75ea269ea221d931b123bd12758aa9875","dweb:/ipfs/QmUcs3JbYkq6C2pTKrqoWmCLF3KMkqyGeoMEuTFhKyy5XX"]},"contracts/wrapped-lp-public/WLPRedemptionGateway.sol":{"keccak256":"0xd4ed484e403829d7caddb189adc2afec7e779b7af86a89cc15ad7c3c325883c0","license":"MIT","urls":["bzz-raw://1d18f9d35b7a72641e9dc440711ffcbefe7dceef2b291cfd9846247e3b8d47b8","dweb:/ipfs/QmZfb2SFa7FN1hVtPi6WhZ2y2UXQSjZuC98oEryqXuDZbr"]},"contracts/wrapped-lp-public/interfaces/IWLPProgramEvents.sol":{"keccak256":"0x71b9c9f9de8553c6c638b02cf93ce7d948021c6ca1719d42725f7eca9ea211d2","license":"MIT","urls":["bzz-raw://76c5b3e693702cd5c2cc2b5131e02046346e8b38d88208f9fa030563852f8786","dweb:/ipfs/QmXWwwAB9zjaVBGW8wCx4coiusmFxtvB24jGozaYXeH7M2"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWrhNPXDdzW1qWBcM1QDKVtoGGj5C7Yz32tkvHPNMxvvf/archive-info.json b/verification-sources/chain138-metadata-archive/QmWrhNPXDdzW1qWBcM1QDKVtoGGj5C7Yz32tkvHPNMxvvf/archive-info.json new file mode 100644 index 0000000..e0f629a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWrhNPXDdzW1qWBcM1QDKVtoGGj5C7Yz32tkvHPNMxvvf/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWrhNPXDdzW1qWBcM1QDKVtoGGj5C7Yz32tkvHPNMxvvf", + "metadata_digest": "7e8fed6a4502d2b2edf2dd25d1bc49eb8c00bdfe746ab169186b2fa6328c8714", + "source_path": "contracts/tokens/interfaces/ICompliantFiatTokenV2.sol", + "contract_name": "ICompliantFiatTokenV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWrhNPXDdzW1qWBcM1QDKVtoGGj5C7Yz32tkvHPNMxvvf/metadata.json b/verification-sources/chain138-metadata-archive/QmWrhNPXDdzW1qWBcM1QDKVtoGGj5C7Yz32tkvHPNMxvvf/metadata.json new file mode 100644 index 0000000..8b71ae5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWrhNPXDdzW1qWBcM1QDKVtoGGj5C7Yz32tkvHPNMxvvf/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AuthorizationUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"}],"name":"CanonicalUnderlyingAssetUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"forwardCanonical","type":"bool"}],"name":"ForwardCanonicalUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"}],"name":"GovernanceProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"aliasValue","type":"string"}],"name":"LegacyAliasAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"}],"name":"PrimaryJurisdictionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"approvalId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"actionType","type":"string"},{"indexed":false,"internalType":"bytes32","name":"referenceHash","type":"bytes32"}],"name":"RegulatoryApprovalRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"disclosureURI","type":"string"}],"name":"RegulatoryDisclosureURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reportingURI","type":"string"}],"name":"ReportingURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"storageNamespace","type":"bytes32"}],"name":"StorageNamespaceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"supervisionRequired","type":"bool"},{"indexed":false,"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"indexed":false,"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"}],"name":"SupervisionConfigurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"}],"name":"SupervisionProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"category","type":"string"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"SupervisoryNoticeRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"supplyCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintingPeriodCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintingPeriodDuration","type":"uint256"}],"name":"SupplyControlsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbolDisplay","type":"string"}],"name":"SymbolDisplayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"TokenURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetVersionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"authorizationState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"reasonHash","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"cancelAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canonicalUnderlyingAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currencyCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwardCanonical","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governmentApprovalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legacyAliases","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumUpgradeNoticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"reasonHash","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"primaryJurisdiction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"receiveWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"approvalId","type":"bytes32"},{"internalType":"string","name":"actionType","type":"string"},{"internalType":"bytes32","name":"referenceHash","type":"bytes32"}],"name":"recordRegulatoryApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"noticeId","type":"bytes32"},{"internalType":"string","name":"category","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"name":"recordSupervisoryNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"regulatoryDisclosureURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reportingURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalUnderlyingAsset_","type":"address"}],"name":"setCanonicalUnderlyingAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governanceController_","type":"address"}],"name":"setGovernanceController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"governanceProfileId_","type":"bytes32"}],"name":"setGovernanceProfileId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction_","type":"string"}],"name":"setPrimaryJurisdiction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"disclosureURI_","type":"string"}],"name":"setRegulatoryDisclosureURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"reportingURI_","type":"string"}],"name":"setReportingURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"storageNamespace_","type":"bytes32"}],"name":"setStorageNamespace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"supervisionRequired_","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired_","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod_","type":"uint256"}],"name":"setSupervisionConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"supervisionProfileId_","type":"bytes32"}],"name":"setSupervisionProfileId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storageNamespace","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbolDisplay","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"versionTag","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedTransport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"EIP712DomainChanged()":{"details":"MAY be emitted to signal that the domain could have changed."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}."},"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"decimals()":{"details":"Returns the decimals places of the token."},"eip712Domain()":{"details":"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature."},"name()":{"details":"Returns the name of the token."},"nonces(address)":{"details":"Returns the current nonce for `owner`. This value must be included whenever a signature is generated for {permit}. Every successful call to {permit} increases ``owner``'s nonce by one. This prevents a signature from being used multiple times."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Sets `value` as the allowance of `spender` over ``owner``'s tokens, given ``owner``'s signed approval. IMPORTANT: The same issues {IERC20-approve} has related to transaction ordering also apply here. Emits an {Approval} event. Requirements: - `spender` cannot be the zero address. - `deadline` must be a timestamp in the future. - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` over the EIP712-formatted function arguments. - the signature must use ``owner``'s current nonce (see {nonces}). For more information on the signature format, see the https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section]. CAUTION: See Security Considerations above."},"symbol()":{"details":"Returns the symbol of the token."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."}},"title":"ICompliantFiatTokenV2","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Canonical interface for GRU c* V2 compliant money tokens.","version":1}},"settings":{"compilationTarget":{"contracts/tokens/interfaces/ICompliantFiatTokenV2.sol":"ICompliantFiatTokenV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/tokens/interfaces/ICompliantFiatTokenV2.sol":{"keccak256":"0xe3c7a30c697eb0b1088ac434537edb848e41e7575f2f8c278879d87ace145145","license":"MIT","urls":["bzz-raw://85b112dc21132487dd6a7361d142748005721ae16d7ed2647c0df4630048f55c","dweb:/ipfs/QmNr8eX8kR82ZR388uhAJDKZopn3pLX3YN7pDqELwiWo8w"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWsntBwjkicrYF5vJC7zC7Tvc2gSvXnF9Yk7jzVR34Myy/archive-info.json b/verification-sources/chain138-metadata-archive/QmWsntBwjkicrYF5vJC7zC7Tvc2gSvXnF9Yk7jzVR34Myy/archive-info.json new file mode 100644 index 0000000..61e1591 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWsntBwjkicrYF5vJC7zC7Tvc2gSvXnF9Yk7jzVR34Myy/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWsntBwjkicrYF5vJC7zC7Tvc2gSvXnF9Yk7jzVR34Myy", + "metadata_digest": "7ed7be209ee96b381f87e6eabf66d93a9e3950f3ea84db160da9c274758cb2d0", + "source_path": "contracts/relay/CCIPRelayBridge.sol", + "contract_name": "CCIPRelayBridge", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWsntBwjkicrYF5vJC7zC7Tvc2gSvXnF9Yk7jzVR34Myy/metadata.json b/verification-sources/chain138-metadata-archive/QmWsntBwjkicrYF5vJC7zC7Tvc2gSvXnF9Yk7jzVR34Myy/metadata.json new file mode 100644 index 0000000..96b2755 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWsntBwjkicrYF5vJC7zC7Tvc2gSvXnF9Yk7jzVR34Myy/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_weth9","type":"address"},{"internalType":"address","name":"_relayRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CrossChainTransferCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"relayRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newRelayRouter","type":"address"}],"name":"updateRelayRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth9","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Modified version of CCIPWETH9Bridge that accepts relay router","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"params":{"message":"The CCIP message"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"CCIP Relay Bridge","version":1},"userdoc":{"kind":"user","methods":{"ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"notice":"Receive WETH9 tokens from another chain via relay"},"getUserNonce(address)":{"notice":"Get user nonce"},"updateRelayRouter(address)":{"notice":"Update relay router address"}},"notice":"Bridge that accepts messages from a relay router","version":1}},"settings":{"compilationTarget":{"contracts/relay/CCIPRelayBridge.sol":"CCIPRelayBridge"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/relay/CCIPRelayBridge.sol":{"keccak256":"0xfa2f4fc7cab2ee8391e85855836f9e6363013088afb813967a0b05a89db509f9","license":"MIT","urls":["bzz-raw://6f7ff1153f8b147a08deb97b1a46759e2af81dadb3b9881f4c264d91a6a56847","dweb:/ipfs/QmV2Q6ESbwdbamEjVg6sWRgusyubefUgsbc2LoED6QuxDs"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWwMEKXoE9AGLiGZbi4W5yRuyNg3TxmfyXW8V9cF4KUTh/archive-info.json b/verification-sources/chain138-metadata-archive/QmWwMEKXoE9AGLiGZbi4W5yRuyNg3TxmfyXW8V9cF4KUTh/archive-info.json new file mode 100644 index 0000000..9d46cc9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWwMEKXoE9AGLiGZbi4W5yRuyNg3TxmfyXW8V9cF4KUTh/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWwMEKXoE9AGLiGZbi4W5yRuyNg3TxmfyXW8V9cF4KUTh", + "metadata_digest": "7fc10f612151377446fea196469d47e4e01ac6247f3b3cb56fdcd94574cf7a58", + "source_path": "contracts/iso4217w/interfaces/IReserveOracle.sol", + "contract_name": "IReserveOracle", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWwMEKXoE9AGLiGZbi4W5yRuyNg3TxmfyXW8V9cF4KUTh/metadata.json b/verification-sources/chain138-metadata-archive/QmWwMEKXoE9AGLiGZbi4W5yRuyNg3TxmfyXW8V9cF4KUTh/metadata.json new file mode 100644 index 0000000..9311bb8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWwMEKXoE9AGLiGZbi4W5yRuyNg3TxmfyXW8V9cF4KUTh/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"uint256","name":"consensusReserve","type":"uint256"}],"name":"QuorumMet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":true,"internalType":"address","name":"reporter","type":"address"},{"indexed":false,"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ReserveReportSubmitted","type":"event"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getConsensusReserve","outputs":[{"internalType":"uint256","name":"consensusReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getVerifiedReserve","outputs":[{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"isQuorumMet","outputs":[{"internalType":"bool","name":"quorumMet","type":"bool"},{"internalType":"uint256","name":"reportCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"bytes32","name":"attestationHash","type":"bytes32"}],"name":"submitReserveReport","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Quorum-based oracle system for verifying fiat reserves","kind":"dev","methods":{"getConsensusReserve(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"consensusReserve":"Consensus reserve balance"}},"getVerifiedReserve(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"reserveBalance":"Verified reserve balance","timestamp":"Last update timestamp"}},"isQuorumMet(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"quorumMet":"True if quorum is met","reportCount":"Number of valid reports"}},"submitReserveReport(string,uint256,bytes32)":{"params":{"attestationHash":"Hash of custodian attestation","currencyCode":"ISO-4217 currency code","reserveBalance":"Reserve balance in base currency units"}}},"title":"IReserveOracle","version":1},"userdoc":{"kind":"user","methods":{"getConsensusReserve(string)":{"notice":"Get consensus reserve balance (median/average of quorum reports)"},"getVerifiedReserve(string)":{"notice":"Get verified reserve balance for a currency"},"isQuorumMet(string)":{"notice":"Check if oracle quorum is met for a currency"},"submitReserveReport(string,uint256,bytes32)":{"notice":"Submit reserve report for a currency"}},"notice":"Interface for reserve verification oracles","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/interfaces/IReserveOracle.sol":"IReserveOracle"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/iso4217w/interfaces/IReserveOracle.sol":{"keccak256":"0x2f9808bf9f3816c6ecdf4ef1587561ad965533019d9ce776ade03b85cbca3984","license":"MIT","urls":["bzz-raw://02a32c5327766990352c77017831be93977e32944b078ed68d2583d3f1c06e97","dweb:/ipfs/QmNr3wLfNkxao2VWndxzMDpYDmqP1t5dYdY8NcFi7omFEU"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmWyFVsSizbyV9ab9tCiW88zCbHmdMVKayYQ8itj4nZfyS/archive-info.json b/verification-sources/chain138-metadata-archive/QmWyFVsSizbyV9ab9tCiW88zCbHmdMVKayYQ8itj4nZfyS/archive-info.json new file mode 100644 index 0000000..4e4bb71 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWyFVsSizbyV9ab9tCiW88zCbHmdMVKayYQ8itj4nZfyS/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmWyFVsSizbyV9ab9tCiW88zCbHmdMVKayYQ8itj4nZfyS", + "metadata_digest": "803dbd996917063d8b061abcdb46823e5bfe57e70e3b15eb5ff7b40ec4ade2d1", + "source_path": "contracts/governance/GovernanceController.sol", + "contract_name": "GovernanceController", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmWyFVsSizbyV9ab9tCiW88zCbHmdMVKayYQ8itj4nZfyS/metadata.json b/verification-sources/chain138-metadata-archive/QmWyFVsSizbyV9ab9tCiW88zCbHmdMVKayYQ8itj4nZfyS/metadata.json new file mode 100644 index 0000000..ab81934 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmWyFVsSizbyV9ab9tCiW88zCbHmdMVKayYQ8itj4nZfyS/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"bytes32","name":"jurisdictionId","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"reviewRequired","type":"bool"},{"indexed":false,"internalType":"uint256","name":"minimumNoticePeriod","type":"uint256"}],"name":"ProposalAssetScoped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"jurisdictionId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"authority","type":"address"},{"indexed":false,"internalType":"uint256","name":"approvalCount","type":"uint256"}],"name":"ProposalJurisdictionApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"support","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"VoteCast","type":"event"},{"inputs":[],"name":"CANCELLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXECUTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROPOSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMELOCK_LONG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMELOCK_MODERATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMELOCK_SHORT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"approveProposalJurisdiction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetRegistry","outputs":[{"internalType":"contract UniversalAssetRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"}],"name":"castVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"string","name":"reason","type":"string"}],"name":"castVoteWithReason","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalEta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"authority","type":"address"}],"name":"hasJurisdictionApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"authority","type":"address"}],"name":"hasTransitionJurisdictionApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_assetRegistry","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalAssets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalJurisdictionApprovalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalJurisdictionIds","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalJurisdictionReviewRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalLastJurisdictionApprover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalLastTransitionJurisdictionApprover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalMinimumNoticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalTransitionJurisdictionApprovalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalTransitionJurisdictionIds","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"enum GovernanceController.GovernanceMode","name":"mode","type":"uint8"},{"internalType":"enum GovernanceController.ProposalState","name":"state","type":"uint8"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"uint256","name":"abstainVotes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"},{"internalType":"enum GovernanceController.GovernanceMode","name":"mode","type":"uint8"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"},{"internalType":"enum GovernanceController.GovernanceMode","name":"mode","type":"uint8"}],"name":"proposeForAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quorumNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newQuorumNumerator","type":"uint256"}],"name":"setQuorumNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVotingDelay","type":"uint256"}],"name":"setVotingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVotingPeriod","type":"uint256"}],"name":"setVotingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum GovernanceController.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"votingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Modes: Admin-only, 1-day timelock, 3-day + voting, 7-day + quorum","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"title":"GovernanceController","version":1},"userdoc":{"kind":"user","methods":{"cancel(uint256)":{"notice":"Cancel a proposal"},"castVote(uint256,uint8)":{"notice":"Cast a vote on a proposal"},"castVoteWithReason(uint256,uint8,string)":{"notice":"Cast a vote with reason"},"execute(uint256)":{"notice":"Execute a queued proposal"},"propose(address[],uint256[],bytes[],string,uint8)":{"notice":"Create a new proposal"},"queue(uint256)":{"notice":"Queue a successful proposal"},"state(uint256)":{"notice":"Get proposal state"}},"notice":"Hybrid governance with progressive timelock based on asset risk","version":1}},"settings":{"compilationTarget":{"contracts/governance/GovernanceController.sol":"GovernanceController"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/governance/GovernanceController.sol":{"keccak256":"0xeeb22e75207e859a87037b00a59e0f12bc2dd83036a65028680eca25a88d0145","license":"MIT","urls":["bzz-raw://e98c64fd791201639f7033b70a6023420940496d5eaa3c333a98833a660e7f38","dweb:/ipfs/QmXo1ED6rmU8nBKTjE7W4XS43jnW1FoWeXpamrk1V3no4G"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmX2WLBH3ft5vpbS4gzC2nkyKsvFsBE8zPF3wembTaSAwA/archive-info.json b/verification-sources/chain138-metadata-archive/QmX2WLBH3ft5vpbS4gzC2nkyKsvFsBE8zPF3wembTaSAwA/archive-info.json new file mode 100644 index 0000000..ed5fa27 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmX2WLBH3ft5vpbS4gzC2nkyKsvFsBE8zPF3wembTaSAwA/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmX2WLBH3ft5vpbS4gzC2nkyKsvFsBE8zPF3wembTaSAwA", + "metadata_digest": "81134130a5e673e58114963d6c06b9e158fbf17ae65d8945cd3b6e550e63cd41", + "source_path": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol", + "contract_name": "ERC1967Utils", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmX2WLBH3ft5vpbS4gzC2nkyKsvFsBE8zPF3wembTaSAwA/metadata.json b/verification-sources/chain138-metadata-archive/QmX2WLBH3ft5vpbS4gzC2nkyKsvFsBE8zPF3wembTaSAwA/metadata.json new file mode 100644 index 0000000..6f436b2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmX2WLBH3ft5vpbS4gzC2nkyKsvFsBE8zPF3wembTaSAwA/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"ERC1967InvalidAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"beacon","type":"address"}],"name":"ERC1967InvalidBeacon","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"}],"devdoc":{"details":"This abstract contract provides getters and event emitting update functions for https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.","errors":{"ERC1967InvalidAdmin(address)":[{"details":"The `admin` of the proxy is invalid."}],"ERC1967InvalidBeacon(address)":[{"details":"The `beacon` of the proxy is invalid."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}]},"events":{"AdminChanged(address,address)":{"details":"Emitted when the admin account has changed."},"BeaconUpgraded(address)":{"details":"Emitted when the beacon is changed."},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{},"stateVariables":{"ADMIN_SLOT":{"details":"Storage slot with the admin of the contract. This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1."},"BEACON_SLOT":{"details":"The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1."},"IMPLEMENTATION_SLOT":{"details":"Storage slot with the address of the current implementation. This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":"ERC1967Utils"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmX37SZGSJiWHi6b4v8EV4TjdsMAgJb7fY2VW3ShiSYuNL/archive-info.json b/verification-sources/chain138-metadata-archive/QmX37SZGSJiWHi6b4v8EV4TjdsMAgJb7fY2VW3ShiSYuNL/archive-info.json new file mode 100644 index 0000000..d8c4a4c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmX37SZGSJiWHi6b4v8EV4TjdsMAgJb7fY2VW3ShiSYuNL/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmX37SZGSJiWHi6b4v8EV4TjdsMAgJb7fY2VW3ShiSYuNL", + "metadata_digest": "813af4216ecdf7b4ae3420f13a49005161f2e61648d340bc1d55bbdb73e074ad", + "source_path": "@openzeppelin/contracts/proxy/utils/Initializable.sol", + "contract_name": "Initializable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmX37SZGSJiWHi6b4v8EV4TjdsMAgJb7fY2VW3ShiSYuNL/metadata.json b/verification-sources/chain138-metadata-archive/QmX37SZGSJiWHi6b4v8EV4TjdsMAgJb7fY2VW3ShiSYuNL/metadata.json new file mode 100644 index 0000000..f3ff591 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmX37SZGSJiWHi6b4v8EV4TjdsMAgJb7fY2VW3ShiSYuNL/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"}],"devdoc":{"custom:oz-upgrades-unsafe-allow":"constructor constructor() { _disableInitializers(); } ``` ====","details":"This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. The initialization functions use a version number. Once a version number is used, it is consumed and cannot be reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in case an upgrade adds a module that needs to be initialized. For example: [.hljs-theme-light.nopadding] ```solidity contract MyToken is ERC20Upgradeable { function initialize() initializer public { __ERC20_init(\"MyToken\", \"MTK\"); } } contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { function initializeV2() reinitializer(2) public { __ERC20Permit_init(\"MyToken\"); } } ``` TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. [CAUTION] ==== Avoid leaving a contract uninitialized. An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: [.hljs-theme-light.nopadding] ```","errors":{"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/proxy/utils/Initializable.sol":"Initializable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmX9grvHyshkypUJT87otsz9mq28vG23kJw2UAApaoYdEY/archive-info.json b/verification-sources/chain138-metadata-archive/QmX9grvHyshkypUJT87otsz9mq28vG23kJw2UAApaoYdEY/archive-info.json new file mode 100644 index 0000000..598f82f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmX9grvHyshkypUJT87otsz9mq28vG23kJw2UAApaoYdEY/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmX9grvHyshkypUJT87otsz9mq28vG23kJw2UAApaoYdEY", + "metadata_digest": "82ea3a05f430f0a842f84860d60b29c30ab5257d80e069ff78ead9826ddab8b9", + "source_path": "contracts/tokens/CompliantUSDTTokenV2.sol", + "contract_name": "CompliantUSDTTokenV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmX9grvHyshkypUJT87otsz9mq28vG23kJw2UAApaoYdEY/metadata.json b/verification-sources/chain138-metadata-archive/QmX9grvHyshkypUJT87otsz9mq28vG23kJw2UAApaoYdEY/metadata.json new file mode 100644 index 0000000..c9ebbcb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmX9grvHyshkypUJT87otsz9mq28vG23kJw2UAApaoYdEY/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"initialOperator","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"bool","name":"forwardCanonical_","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationAlreadyUsed","type":"error"},{"inputs":[{"internalType":"uint256","name":"validBefore","type":"uint256"}],"name":"AuthorizationExpired","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"authorizer","type":"address"}],"name":"AuthorizationInvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"address","name":"caller","type":"address"}],"name":"AuthorizationMustBeUsedByPayee","type":"error"},{"inputs":[{"internalType":"uint256","name":"validAfter","type":"uint256"}],"name":"AuthorizationNotYetValid","type":"error"},{"inputs":[{"internalType":"string","name":"aliasValue","type":"string"}],"name":"DuplicateAlias","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC2612ExpiredSignature","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC2612InvalidSigner","type":"error"},{"inputs":[],"name":"EmptyAlias","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"GovernanceControllerNotConfigured","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"GovernanceControllerOnly","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidAccountNonce","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint256","name":"attemptedPeriodMint","type":"uint256"}],"name":"MintCapExceeded","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"OwnerUnauthorized","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint256","name":"attemptedTotalSupply","type":"uint256"}],"name":"SupplyCapExceeded","type":"error"},{"inputs":[],"name":"ZeroGovernanceController","type":"error"},{"inputs":[],"name":"ZeroOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AuthorizationUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"}],"name":"CanonicalUnderlyingAssetUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"operationType","type":"bytes32"},{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"reasonHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"accountingRef","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"messageCorrelationId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"CompliantOperationDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mechanism","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisputeResolutionMechanismSet","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"forwardCanonical","type":"bool"}],"name":"ForwardCanonicalUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"}],"name":"GovernanceProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"JurisdictionDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"aliasValue","type":"string"}],"name":"LegacyAliasAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LegalNotice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"}],"name":"PrimaryJurisdictionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"approvalId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"actionType","type":"string"},{"indexed":false,"internalType":"bytes32","name":"referenceHash","type":"bytes32"}],"name":"RegulatoryApprovalRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"disclosureURI","type":"string"}],"name":"RegulatoryDisclosureURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reportingURI","type":"string"}],"name":"ReportingURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"storageNamespace","type":"bytes32"}],"name":"StorageNamespaceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"supervisionRequired","type":"bool"},{"indexed":false,"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"indexed":false,"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"}],"name":"SupervisionConfigurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"}],"name":"SupervisionProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"category","type":"string"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"SupervisoryNoticeRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"supplyCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintingPeriodCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintingPeriodDuration","type":"uint256"}],"name":"SupplyControlsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbolDisplay","type":"string"}],"name":"SymbolDisplayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"TokenURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"ValueTransferDeclared","type":"event"},{"inputs":[],"name":"BRIDGE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CANCEL_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COMPLIANCE_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISPUTE_RESOLUTION_MECHANISM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNANCE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_ARBITRATION_SUPPORT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_TRADE_TERMS_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_UNIFORM_RULES_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTRUMENT_CLASSIFICATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_20022_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_27001_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_3166_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_4217_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_8601_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JURISDICTION_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_ENFORCEABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_FRAMEWORK_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_JURISDICTION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_BURN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_MINT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_RECEIVE_WITH_AUTHORIZATION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_TRANSFER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_TRANSFER_WITH_AUTHORIZATION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RECEIVE_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATORY_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_OF_PROCESS_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPERVISOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFERABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAVEL_RULE_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"aliasValue","type":"string"}],"name":"addLegacyAlias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetVersionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"authorizationState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"reasonHash","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"cancelAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canonicalUnderlyingAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currencyCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintingPeriodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"aliasValue","type":"string"}],"name":"emergencyAddLegacyAlias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"disclosureURI_","type":"string"},{"internalType":"string","name":"reportingURI_","type":"string"}],"name":"emergencySetDisclosureMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"emergencySetForwardCanonical","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"governanceProfileId_","type":"bytes32"},{"internalType":"bytes32","name":"supervisionProfileId_","type":"bytes32"},{"internalType":"bytes32","name":"storageNamespace_","type":"bytes32"},{"internalType":"string","name":"jurisdiction_","type":"string"},{"internalType":"address","name":"canonicalUnderlyingAsset_","type":"address"},{"internalType":"bool","name":"supervisionRequired_","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired_","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod_","type":"uint256"}],"name":"emergencySetGovernanceMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"forwardCanonical_","type":"bool"},{"internalType":"string","name":"tokenURI_","type":"string"},{"internalType":"string","name":"symbolDisplay_","type":"string"}],"name":"emergencySetPresentationMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwardCanonical","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governmentApprovalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legacyAliases","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumUpgradeNoticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"reasonHash","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedInCurrentPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPeriodCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPeriodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"primaryJurisdiction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"receiveWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"recordLegalNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"approvalId","type":"bytes32"},{"internalType":"string","name":"actionType","type":"string"},{"internalType":"bytes32","name":"referenceHash","type":"bytes32"}],"name":"recordRegulatoryApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"noticeId","type":"bytes32"},{"internalType":"string","name":"category","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"name":"recordSupervisoryNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"regulatoryDisclosureURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reportingURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalUnderlyingAsset_","type":"address"}],"name":"setCanonicalUnderlyingAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setForwardCanonical","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governanceController_","type":"address"}],"name":"setGovernanceController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"governanceProfileId_","type":"bytes32"}],"name":"setGovernanceProfileId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction_","type":"string"}],"name":"setPrimaryJurisdiction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"disclosureURI_","type":"string"}],"name":"setRegulatoryDisclosureURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"reportingURI_","type":"string"}],"name":"setReportingURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"storageNamespace_","type":"bytes32"}],"name":"setStorageNamespace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"supervisionRequired_","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired_","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod_","type":"uint256"}],"name":"setSupervisionConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"supervisionProfileId_","type":"bytes32"}],"name":"setSupervisionProfileId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supplyCap_","type":"uint256"},{"internalType":"uint256","name":"mintingPeriodCap_","type":"uint256"},{"internalType":"uint256","name":"mintingPeriodDuration_","type":"uint256"}],"name":"setSupplyControls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbolDisplay_","type":"string"}],"name":"setSymbolDisplay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storageNamespace","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbolDisplay","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"versionTag","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedTransport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"InvalidAccountNonce(address,uint256)":[{"details":"The nonce used for an `account` is not the expected current nonce."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"EIP712DomainChanged()":{"details":"MAY be emitted to signal that the domain could have changed."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}."},"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"eip712Domain()":{"details":"See {IERC-5267}."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"name()":{"details":"Returns the name of the token."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"title":"CompliantUSDTTokenV2","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Thin cUSDT V2 specialization over the shared compliant fiat token base.","version":1}},"settings":{"compilationTarget":{"contracts/tokens/CompliantUSDTTokenV2.sol":"CompliantUSDTTokenV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Nonces.sol":{"keccak256":"0x0082767004fca261c332e9ad100868327a863a88ef724e844857128845ab350f","license":"MIT","urls":["bzz-raw://132dce9686a54e025eb5ba5d2e48208f847a1ec3e60a3e527766d7bf53fb7f9e","dweb:/ipfs/QmXn1a2nUZMpu2z6S88UoTfMVtY2YNh86iGrzJDYmMkKeZ"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/compliance/LegallyCompliantBaseV2.sol":{"keccak256":"0x8097270ea1c6c78c9d39861536d19d01318a136d425c85d758105de4eeb0049c","license":"MIT","urls":["bzz-raw://4a629636fc02ed9cfd4134274d8a2125e440d0b024793c1ab0d12a96422596d9","dweb:/ipfs/QmdvmzFw21CJzKAL4Cf89dssoSFCPhurNGn1fCDkAS3bBN"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/tokens/CompliantFiatTokenV2.sol":{"keccak256":"0x397d0a74841b3fdafb237597c704ae2e143cf77210ca2890c844935ea6c14995","license":"MIT","urls":["bzz-raw://572326b14b654fcab80768037fff300282cae505aef1bac34e78df358a842f36","dweb:/ipfs/QmNmYsUHEM9ZJbcrPTu2gYpqLwsbKAjtDG74ZX8hfKNp23"]},"contracts/tokens/CompliantUSDTTokenV2.sol":{"keccak256":"0x8be5514759eac5b8914c6463ef173f25669e059b7a2f012d870bf6031d0dbf18","license":"MIT","urls":["bzz-raw://65c5d19c47ea224ad0fbd1c549d8df33f3b157933516d098c6c9c2a2e50d8270","dweb:/ipfs/QmP2pNRtv9bxGxyxT24kANuRaTHQ8PGCR7XQpTEsyFKA6D"]},"contracts/tokens/interfaces/ICompliantFiatTokenV2.sol":{"keccak256":"0xe3c7a30c697eb0b1088ac434537edb848e41e7575f2f8c278879d87ace145145","license":"MIT","urls":["bzz-raw://85b112dc21132487dd6a7361d142748005721ae16d7ed2647c0df4630048f55c","dweb:/ipfs/QmNr8eX8kR82ZR388uhAJDKZopn3pLX3YN7pDqELwiWo8w"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXB8ZWcrFS45G1gKwzAwZQELsBx7ASAq42qUWP6sLZoNn/archive-info.json b/verification-sources/chain138-metadata-archive/QmXB8ZWcrFS45G1gKwzAwZQELsBx7ASAq42qUWP6sLZoNn/archive-info.json new file mode 100644 index 0000000..b98e4e3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXB8ZWcrFS45G1gKwzAwZQELsBx7ASAq42qUWP6sLZoNn/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmXB8ZWcrFS45G1gKwzAwZQELsBx7ASAq42qUWP6sLZoNn", + "metadata_digest": "8348ddcb70f41ba38ec7808942abe8aee5e7d8038642a4cd52bd6d88489e5117", + "source_path": "contracts/bridge/trustless/integration/CommodityPegManager.sol", + "contract_name": "CommodityPegManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXB8ZWcrFS45G1gKwzAwZQELsBx7ASAq42qUWP6sLZoNn/metadata.json b/verification-sources/chain138-metadata-archive/QmXB8ZWcrFS45G1gKwzAwZQELsBx7ASAq42qUWP6sLZoNn/metadata.json new file mode 100644 index 0000000..1f51c6a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXB8ZWcrFS45G1gKwzAwZQELsBx7ASAq42qUWP6sLZoNn/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_reserveSystem","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CommodityNotRegistered","type":"error"},{"inputs":[],"name":"InvalidThreshold","type":"error"},{"inputs":[],"name":"InvalidXauRate","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"XauNotSet","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"commodity","type":"address"},{"indexed":false,"internalType":"uint256","name":"currentPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"targetPrice","type":"uint256"},{"indexed":false,"internalType":"int256","name":"deviationBps","type":"int256"},{"indexed":false,"internalType":"bool","name":"isMaintained","type":"bool"}],"name":"CommodityPegChecked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"commodity","type":"address"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"xauRate","type":"uint256"}],"name":"CommodityRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"commodity","type":"address"},{"indexed":false,"internalType":"int256","name":"deviationBps","type":"int256"}],"name":"RebalancingTriggered","type":"event"},{"inputs":[],"name":"MAX_PEG_THRESHOLD_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"commodity","type":"address"}],"name":"checkCommodityPeg","outputs":[{"internalType":"bool","name":"isMaintained","type":"bool"},{"internalType":"int256","name":"deviationBps","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"commodities","outputs":[{"internalType":"address","name":"commodityAddress","type":"address"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"xauRate","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commodityPegThresholdBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"commodity","type":"address"}],"name":"getCommodityPegStatus","outputs":[{"internalType":"uint256","name":"currentPrice","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"},{"internalType":"int256","name":"deviationBps","type":"int256"},{"internalType":"bool","name":"isMaintained","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"commodity","type":"address"},{"internalType":"address","name":"targetCurrency","type":"address"}],"name":"getCommodityPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportedCommodities","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"commodity","type":"address"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"xauRate","type":"uint256"}],"name":"registerCommodity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveSystem","outputs":[{"internalType":"contract IReserveSystem","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setCommodityPegThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_xauAddress","type":"address"}],"name":"setXAUAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedCommodities","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"commodity","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"targetCurrency","type":"address"}],"name":"triangulateViaXAU","outputs":[{"internalType":"uint256","name":"targetAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"commodity","type":"address"},{"internalType":"uint256","name":"newXauRate","type":"uint256"}],"name":"updateXauRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xauAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"All commodities are pegged through XAU (gold) as the base anchor","errors":{"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{"checkCommodityPeg(address)":{"params":{"commodity":"Commodity address"},"returns":{"deviationBps":"Deviation in basis points","isMaintained":"Whether peg is maintained"}},"constructor":{"params":{"_reserveSystem":"ReserveSystem contract address"}},"getCommodityPegStatus(address)":{"params":{"commodity":"Commodity address"},"returns":{"currentPrice":"Current price","deviationBps":"Deviation in basis points","isMaintained":"Whether peg is maintained","targetPrice":"Target price (via XAU)"}},"getCommodityPrice(address,address)":{"params":{"commodity":"Commodity address","targetCurrency":"Target currency address"},"returns":{"price":"Price in target currency"}},"getSupportedCommodities()":{"returns":{"_0":"Array of commodity addresses"}},"owner()":{"details":"Returns the address of the current owner."},"registerCommodity(address,string,uint256)":{"params":{"commodity":"Commodity token address","symbol":"Commodity symbol (XAG, XPT, XPD, etc.)","xauRate":"Rate: 1 oz XAU = xauRate units of commodity (in 18 decimals)"},"returns":{"_0":"success Whether registration was successful"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"setCommodityPegThreshold(uint256)":{"params":{"newThreshold":"New threshold in basis points"}},"setXAUAddress(address)":{"params":{"_xauAddress":"XAU token address"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"triangulateViaXAU(address,uint256,address)":{"params":{"amount":"Amount of commodity","commodity":"Commodity address","targetCurrency":"Target currency address (e.g., USDT for USD)"},"returns":{"targetAmount":"Amount in target currency"}},"updateXauRate(address,uint256)":{"params":{"commodity":"Commodity address","newXauRate":"New XAU rate"}}},"title":"CommodityPegManager","version":1},"userdoc":{"kind":"user","methods":{"checkCommodityPeg(address)":{"notice":"Check commodity peg via XAU"},"constructor":{"notice":"Constructor"},"getCommodityPegStatus(address)":{"notice":"Get commodity peg status"},"getCommodityPrice(address,address)":{"notice":"Get commodity price in target currency"},"getSupportedCommodities()":{"notice":"Get all supported commodities"},"registerCommodity(address,string,uint256)":{"notice":"Register a commodity for pegging"},"setCommodityPegThreshold(uint256)":{"notice":"Set commodity peg threshold"},"setXAUAddress(address)":{"notice":"Set XAU (gold) address"},"triangulateViaXAU(address,uint256,address)":{"notice":"Triangulate commodity value through XAU to target currency"},"updateXauRate(address,uint256)":{"notice":"Update XAU rate for a commodity"}},"notice":"Manages commodity pegging (gold XAU, silver, oil, etc.) via XAU triangulation","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/integration/CommodityPegManager.sol":"CommodityPegManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/integration/CommodityPegManager.sol":{"keccak256":"0x6cc6c4bd05b6eff88ba995687a054a340dd3e1540695d53eb78fe453517ebd07","license":"MIT","urls":["bzz-raw://66410267e11f652c63f1a0d6756f54acdb9cf1f00cf992e059e46152e99c27cb","dweb:/ipfs/QmPrcrUg9Rz6rZj9atAqLaGUnQnqwSmKWcTp5K5jbksxX8"]},"contracts/bridge/trustless/integration/ICommodityPegManager.sol":{"keccak256":"0xac6ea4e0e063e63248f9e45c67cf6e73c7a9fe78cecd6dfd653fa639a4d19523","license":"MIT","urls":["bzz-raw://283095df7e58b829bf90fe4d4a790ab407d4d0c17cb175f7f82abc0d678890e5","dweb:/ipfs/QmZ97YmiFv8KFMkZX7CALQCvdwxPcdw673HCaZe2EQMxDY"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXEJco6H6RKvv7Z5y8LpMSBKwpP2qX3AHbRaSDymN8ymz/archive-info.json b/verification-sources/chain138-metadata-archive/QmXEJco6H6RKvv7Z5y8LpMSBKwpP2qX3AHbRaSDymN8ymz/archive-info.json new file mode 100644 index 0000000..eec7797 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXEJco6H6RKvv7Z5y8LpMSBKwpP2qX3AHbRaSDymN8ymz/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmXEJco6H6RKvv7Z5y8LpMSBKwpP2qX3AHbRaSDymN8ymz", + "metadata_digest": "8418fad8c7da4657e9535c3950f5fd26fb6164e6ad3e87791cea58fd1bb8c9f9", + "source_path": "contracts/bridge/integration/VaultBridgeIntegration.sol", + "contract_name": "VaultBridgeIntegration", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXEJco6H6RKvv7Z5y8LpMSBKwpP2qX3AHbRaSDymN8ymz/metadata.json b/verification-sources/chain138-metadata-archive/QmXEJco6H6RKvv7Z5y8LpMSBKwpP2qX3AHbRaSDymN8ymz/metadata.json new file mode 100644 index 0000000..2c2ec42 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXEJco6H6RKvv7Z5y8LpMSBKwpP2qX3AHbRaSDymN8ymz/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"vaultFactory_","type":"address"},{"internalType":"address","name":"bridgeRegistry_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositToken","type":"address"},{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"destinationChainIds","type":"uint256[]"}],"name":"DepositTokenRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INTEGRATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeRegistry","outputs":[{"internalType":"contract BridgeRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultBridgeFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"defaultDestinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMaxBridgeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMinBridgeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultRiskLevel","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultDestinations","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"uint256[]","name":"destinationChainIds","type":"uint256[]"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint8","name":"riskLevel","type":"uint8"},{"internalType":"uint256","name":"bridgeFeeBps","type":"uint256"}],"name":"registerDepositToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"}],"name":"registerDepositTokenDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeBps","type":"uint256"}],"name":"setDefaultBridgeFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"chainIds","type":"uint256[]"}],"name":"setDefaultDestinations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"setDefaultMaxBridgeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"setDefaultMinBridgeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"riskLevel","type":"uint8"}],"name":"setDefaultRiskLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultFactory","outputs":[{"internalType":"contract VaultFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Extends VaultFactory to auto-register deposit tokens on creation","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"registerDepositToken(address,uint256[],uint256,uint256,uint8,uint256)":{"params":{"bridgeFeeBps":"Bridge fee in basis points","depositToken":"Deposit token address","destinationChainIds":"Array of allowed destination chain IDs","maxAmount":"Maximum bridge amount","minAmount":"Minimum bridge amount","riskLevel":"Risk level (0-255)"}},"registerDepositTokenDefault(address)":{"params":{"depositToken":"Deposit token address"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"VaultBridgeIntegration","version":1},"userdoc":{"kind":"user","methods":{"getDefaultDestinations()":{"notice":"Get default destinations"},"registerDepositToken(address,uint256[],uint256,uint256,uint8,uint256)":{"notice":"Register a deposit token with bridge registry"},"registerDepositTokenDefault(address)":{"notice":"Register a deposit token with default configuration"},"setDefaultMinBridgeAmount(uint256)":{"notice":"Set default bridge configuration"}},"notice":"Automatically registers vault deposit tokens with BridgeRegistry","version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/VaultBridgeIntegration.sol":"VaultBridgeIntegration"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol":{"keccak256":"0xd518def45c722a6e803e1e26e625db25e01497f672ca566cca585d234ec903b0","license":"MIT","urls":["bzz-raw://6e7de3fccd96783244790cde282435ce0fd3a44ab4ccb10f17005c743202882f","dweb:/ipfs/QmYSepstTqs5UPJvjeJXkWU5R659yReqrSgSGGh65hkbdK"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"keccak256":"0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec","license":"MIT","urls":["bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c","dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/Proxy.sol":{"keccak256":"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd","license":"MIT","urls":["bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac","dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/VaultBridgeIntegration.sol":{"keccak256":"0x229783509d07f84145ba4d874b7d5c1c6ce3de667090ed2b5483f4d1bd892c3d","license":"MIT","urls":["bzz-raw://aba7fbe204b5116e095e9639af2c84f170060214899ff3f787da8cc8f9d16791","dweb:/ipfs/Qme7WrYXbbLn4zTb9TptLoqnbWGuZ7iCYSVCYmzC9P92jJ"]},"contracts/bridge/interop/BridgeRegistry.sol":{"keccak256":"0x7e813c5d8f9762804a35c98244f09831f1ad6ea6df8f2b562c2d031cb246bbc3","license":"MIT","urls":["bzz-raw://e1bba0b26d12b384a26b0e8c09a7c4279a309c24783f501ba4c6bcaa79f6eb7f","dweb:/ipfs/QmRkuvkgurzKtMKAe4oiKc45G3JJ4vwXfM6jPb7PHS49Ts"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/vault/Vault.sol":{"keccak256":"0x9a064d7713140a036c81c34f4cde7b964eff46e9f9a0ed128b3b30e79216e646","license":"MIT","urls":["bzz-raw://c8077104750c8578014c60914558c21489bb83d84086a127bc31897558f0668b","dweb:/ipfs/Qme5eDJizvYQdBjUKunhsyeTVLycCkSWPQY8g3TPfqKYh6"]},"contracts/vault/VaultFactory.sol":{"keccak256":"0x48f8f2dc1d3460b8b061b34e5f6d9a9f99a05ee94d7a2d8d9966cc2e2372eee4","license":"MIT","urls":["bzz-raw://8f2ccaf6b7756e3885bd50a5545a2d9bdd80af179da1d1022e08d50f519b7828","dweb:/ipfs/QmcR6krjQ3dxbkXwRbsd6KAB7FFoVpTLi86fMRuusNCS64"]},"contracts/vault/interfaces/ICollateralAdapter.sol":{"keccak256":"0x45c2214f58500a3ad92ea1ea2c018bb0e71e1dd441e6c293cfbb88ffa5629efc","license":"MIT","urls":["bzz-raw://92e981007a82373da7f08bd7ec4de0b92126091b73356e641adaaf3d46531a1b","dweb:/ipfs/QmbcB6qSdN9imJEEdQQngBkokhtXNMK5eTUyjccpjyLSVd"]},"contracts/vault/interfaces/ILedger.sol":{"keccak256":"0x3a8e8a2d48458202fffe065e691c1abeae50ccb8fc2af8971af7e94ae23d9273","license":"MIT","urls":["bzz-raw://6214e1b92f519cb100b315b2eb64b61e21479f75ebecd3a2e74524806347a5d4","dweb:/ipfs/QmRzswWJmFPa5BAy2npMN2WwrdmNd8pymySMHo1EdSZXED"]},"contracts/vault/interfaces/IRegulatedEntityRegistry.sol":{"keccak256":"0xf3ec40774d215299eae68db073b733885023d6f8d1d9a00575c02842a8c54af4","license":"MIT","urls":["bzz-raw://ea06721c4f4ca7f59e3c9e14fc376e3c43d7cd83f544dbdf18c6e182441186b0","dweb:/ipfs/QmRFbfhyDp9UJBepDinYvs7TC6pLbZBgajnZbtPXqmpcWp"]},"contracts/vault/interfaces/IVault.sol":{"keccak256":"0x8d8b34ee40744f19fc1c758cd08815b748750059ea87eb89b25b0490c3613c9c","license":"MIT","urls":["bzz-raw://af6f236b0a80f6eb36c4c006df04c5199247c021182c5afb08184503b187a552","dweb:/ipfs/QmSobXGKCjL8WfvKA312zK3dtE7M5DmioKEucN4MP4TZEZ"]},"contracts/vault/interfaces/IeMoneyJoin.sol":{"keccak256":"0x61df69d6ee9f5966c1b3bfb9bdf938506af7895b0afa8543d73588fb6470ca49","license":"MIT","urls":["bzz-raw://063843b2dfc41802c80bb808e1783701273ce23ef773aa08827f3b923d7102d3","dweb:/ipfs/QmXwc26Y1yAgetLapiUGPLCPoxkp3tAHf5cuSfPBC4PPLw"]},"contracts/vault/tokens/DebtToken.sol":{"keccak256":"0xb791a91845fa03b3b69fb92165dd8c716a270920171ff63de7b17489eb4871da","license":"MIT","urls":["bzz-raw://84a630592b68a85070e26195cc5a24ed085078f5bf04d4b2b35037e6295c1e45","dweb:/ipfs/QmTXHxwdnPZKMKNyvgXtKh8AYvqSPKxMBL6eR5KzsJRs1T"]},"contracts/vault/tokens/DepositToken.sol":{"keccak256":"0xa1220a078010b1554f80da8f4883b2c339eca95ef1d20e070c97cccc3ab1723c","license":"MIT","urls":["bzz-raw://5879ab048f39cff3bcef678959740643a43eecb7fe8a864192339f5fe8591f17","dweb:/ipfs/QmRq6Jd25dkF7dt3YLbtvPQosegBEA1xqdU7Sgc1C1Tpep"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXFhfmLAfi9NmWamofAH6ZzfB2G5RMatYEcKg5cFDrEL9/archive-info.json b/verification-sources/chain138-metadata-archive/QmXFhfmLAfi9NmWamofAH6ZzfB2G5RMatYEcKg5cFDrEL9/archive-info.json new file mode 100644 index 0000000..fbca14f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXFhfmLAfi9NmWamofAH6ZzfB2G5RMatYEcKg5cFDrEL9/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmXFhfmLAfi9NmWamofAH6ZzfB2G5RMatYEcKg5cFDrEL9", + "metadata_digest": "84749feff5365c1627d737c1daeeddb45b6552be6aca7231bd3af8038cc32012", + "source_path": "contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol", + "contract_name": "DodoV3RouteExecutorAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXFhfmLAfi9NmWamofAH6ZzfB2G5RMatYEcKg5cFDrEL9/metadata.json b/verification-sources/chain138-metadata-archive/QmXFhfmLAfi9NmWamofAH6ZzfB2G5RMatYEcKg5cFDrEL9/metadata.json new file mode 100644 index 0000000..aef130a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXFhfmLAfi9NmWamofAH6ZzfB2G5RMatYEcKg5cFDrEL9/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"execute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"}],"name":"validate","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol":"DodoV3RouteExecutorAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol":{"keccak256":"0x214ca73ac7045c2085a8a9a9441da261be92b18fcbbf91ac5024d75e936f89ad","license":"MIT","urls":["bzz-raw://ed826e12e33f9b59a2022f889bb40862a912d4672811027c886f7017cb38bec7","dweb:/ipfs/QmWaVH9sq2W8qKcYGsJXJNi5uB6u1cFKC9whSFLTezVGYx"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXS7SBnvZ4t7xzLgUnuv2SKsjZx6QRp8JFzdSruRgVhnt/archive-info.json b/verification-sources/chain138-metadata-archive/QmXS7SBnvZ4t7xzLgUnuv2SKsjZx6QRp8JFzdSruRgVhnt/archive-info.json new file mode 100644 index 0000000..4024725 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXS7SBnvZ4t7xzLgUnuv2SKsjZx6QRp8JFzdSruRgVhnt/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmXS7SBnvZ4t7xzLgUnuv2SKsjZx6QRp8JFzdSruRgVhnt", + "metadata_digest": "871f4e162dfb14577e679b38f5ba8e39b47ee3e4f845eb356200ba87574a0555", + "source_path": "contracts/bridge/trustless/EnhancedSwapRouterV2.sol", + "contract_name": "EnhancedSwapRouterV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXS7SBnvZ4t7xzLgUnuv2SKsjZx6QRp8JFzdSruRgVhnt/metadata.json b/verification-sources/chain138-metadata-archive/QmXS7SBnvZ4t7xzLgUnuv2SKsjZx6QRp8JFzdSruRgVhnt/metadata.json new file mode 100644 index 0000000..754b047 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXS7SBnvZ4t7xzLgUnuv2SKsjZx6QRp8JFzdSruRgVhnt/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_dai","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientOutput","type":"error"},{"inputs":[],"name":"InvalidPlan","type":"error"},{"inputs":[],"name":"InvalidStablecoin","type":"error"},{"inputs":[],"name":"ProviderAdapterNotConfigured","type":"error"},{"inputs":[],"name":"ProviderDisabled","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"RouteNotConfigured","type":"error"},{"inputs":[{"internalType":"string","name":"reason","type":"string"}],"name":"RouteValidationFailed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"indexed":true,"internalType":"address","name":"adapter","type":"address"}],"name":"ProviderAdapterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":true,"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ProviderRouteSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ProviderToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"routeHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"inputToken","type":"address"},{"indexed":false,"internalType":"address","name":"outputToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"RouteExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"sizeCategory","type":"uint256"},{"indexed":false,"internalType":"enum RouteTypesV2.Provider[]","name":"providers","type":"uint8[]"}],"name":"RoutingConfigUpdated","type":"event"},{"inputs":[],"name":"COORDINATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTING_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"address","name":"outputToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg[]","name":"legs","type":"tuple[]"}],"internalType":"struct RouteTypesV2.RoutePlan","name":"plan","type":"tuple"}],"name":"executeRoute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"}],"name":"getProviderRoute","outputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"providerAdapters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"providerEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quoteConfiguredProviders","outputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"estimatedGas","type":"uint256"},{"internalType":"bool","name":"executable","type":"bool"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.ProviderQuote[]","name":"quotes","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"adapter","type":"address"}],"name":"setProviderAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setProviderEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setProviderRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sizeCategory","type":"uint256"},{"internalType":"enum RouteTypesV2.Provider[]","name":"providers","type":"uint8[]"}],"name":"setRoutingConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum LiquidityPoolETH.AssetType","name":"inputAsset","type":"uint8"},{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"swapToStablecoin","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"enum LiquidityPoolETH.AssetType","name":"inputAsset","type":"uint8"},{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"enum RouteTypesV2.Provider","name":"preferredProvider","type":"uint8"}],"name":"swapToStablecoin","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"swapTokenToToken","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"enum RouteTypesV2.Provider","name":"preferredProvider","type":"uint8"}],"name":"swapTokenToToken","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/EnhancedSwapRouterV2.sol":"EnhancedSwapRouterV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/trustless/EnhancedSwapRouterV2.sol":{"keccak256":"0x30e599fe05b2004d8c462a3989bc18dcf6296174481725207839800f1f2bb70d","license":"MIT","urls":["bzz-raw://7e9df5f573bb93146add4d6863b22dcc9b7bf0ece1692c5c56db416e6cbac464","dweb:/ipfs/QmPvvmkTKDNpY7N99aBPoXK9WiyD5v4bcsY7VS8PeAm76G"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]},"contracts/bridge/trustless/interfaces/IWETH.sol":{"keccak256":"0x2797f22d48c59542f0c7eb5d4405c7c5c2156c764faf9798de2493e5f6487977","license":"MIT","urls":["bzz-raw://e876c569dce230e2eaf208885fa3df05879363b80df005bbe1841f404c789202","dweb:/ipfs/QmTMEUjEVx2ZvKKe7L6uuEWZYbFaTUYAkabF91189J5wMf"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXTP8i8CZFCGhWtEogFSxkQmhTJaGa7znLrzRTQGJmdKm/archive-info.json b/verification-sources/chain138-metadata-archive/QmXTP8i8CZFCGhWtEogFSxkQmhTJaGa7znLrzRTQGJmdKm/archive-info.json new file mode 100644 index 0000000..02253dc --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXTP8i8CZFCGhWtEogFSxkQmhTJaGa7znLrzRTQGJmdKm/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmXTP8i8CZFCGhWtEogFSxkQmhTJaGa7znLrzRTQGJmdKm", + "metadata_digest": "8772a2e9cbb6e9434530f6d046c6a3a6332cc19a3e6ac960a89d33351c8b4d60", + "source_path": "contracts/dbis/DBIS_RootRegistry.sol", + "contract_name": "DBIS_RootRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXTP8i8CZFCGhWtEogFSxkQmhTJaGa7znLrzRTQGJmdKm/metadata.json b/verification-sources/chain138-metadata-archive/QmXTP8i8CZFCGhWtEogFSxkQmhTJaGa7znLrzRTQGJmdKm/metadata.json new file mode 100644 index 0000000..922f3ea --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXTP8i8CZFCGhWtEogFSxkQmhTJaGa7znLrzRTQGJmdKm/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"string","name":"_railVersion","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"string","name":"railVersion","type":"string"}],"name":"ComponentUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getComponent","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"railVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"addr","type":"address"}],"name":"setComponent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_version","type":"string"}],"name":"setRailVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/DBIS_RootRegistry.sol":"DBIS_RootRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dbis/DBIS_RootRegistry.sol":{"keccak256":"0x8363d9754d5d068b8551d61ad589496faae637714bf383ba5463e1b321b42a4b","license":"MIT","urls":["bzz-raw://407f94c0fb1229bff4d5cbf4c3728757d4bb970dd731bfddf5cbb1bfa1924505","dweb:/ipfs/QmPVzxWWUmkZpS6RLn5VXjSQbr5gwP6uXUobWGTbcw2Pvg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXhF8sQycMzojsdhgUjkdCFGShd2Spzz8dK1JwEZkVYPv/archive-info.json b/verification-sources/chain138-metadata-archive/QmXhF8sQycMzojsdhgUjkdCFGShd2Spzz8dK1JwEZkVYPv/archive-info.json new file mode 100644 index 0000000..3867b59 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXhF8sQycMzojsdhgUjkdCFGShd2Spzz8dK1JwEZkVYPv/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmXhF8sQycMzojsdhgUjkdCFGShd2Spzz8dK1JwEZkVYPv", + "metadata_digest": "8affb9a6bc8664be3eab2781127c0f8bddb113439837810e8291733edf934fdd", + "source_path": "@openzeppelin/contracts/interfaces/IERC5267.sol", + "contract_name": "IERC5267", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXhF8sQycMzojsdhgUjkdCFGShd2Spzz8dK1JwEZkVYPv/metadata.json b/verification-sources/chain138-metadata-archive/QmXhF8sQycMzojsdhgUjkdCFGShd2Spzz8dK1JwEZkVYPv/metadata.json new file mode 100644 index 0000000..55a2921 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXhF8sQycMzojsdhgUjkdCFGShd2Spzz8dK1JwEZkVYPv/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"}],"devdoc":{"events":{"EIP712DomainChanged()":{"details":"MAY be emitted to signal that the domain could have changed."}},"kind":"dev","methods":{"eip712Domain()":{"details":"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/interfaces/IERC5267.sol":"IERC5267"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXsUVfjTudVpn6c9VrHKX6QdDzQG46yx1ogdZspUKo9Di/archive-info.json b/verification-sources/chain138-metadata-archive/QmXsUVfjTudVpn6c9VrHKX6QdDzQG46yx1ogdZspUKo9Di/archive-info.json new file mode 100644 index 0000000..025f161 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXsUVfjTudVpn6c9VrHKX6QdDzQG46yx1ogdZspUKo9Di/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmXsUVfjTudVpn6c9VrHKX6QdDzQG46yx1ogdZspUKo9Di", + "metadata_digest": "8d9ea34db4dd6fcbf5cd03ab0a0752359a42b8adffeb5bc018d21aaa2123d8f1", + "source_path": "contracts/iso4217w/interfaces/IComplianceGuard.sol", + "contract_name": "IComplianceGuard", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXsUVfjTudVpn6c9VrHKX6QdDzQG46yx1ogdZspUKo9Di/metadata.json b/verification-sources/chain138-metadata-archive/QmXsUVfjTudVpn6c9VrHKX6QdDzQG46yx1ogdZspUKo9Di/metadata.json new file mode 100644 index 0000000..2161677 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXsUVfjTudVpn6c9VrHKX6QdDzQG46yx1ogdZspUKo9Di/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"bytes32","name":"checkType","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"name":"ComplianceCheckFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"bytes32","name":"checkType","type":"bytes32"}],"name":"ComplianceCheckPassed","type":"event"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"isISO4217Compliant","outputs":[{"internalType":"bool","name":"isISO4217","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserve","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"isReserveSufficient","outputs":[{"internalType":"bool","name":"isSufficient","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"currentSupply","type":"uint256"},{"internalType":"uint256","name":"verifiedReserve","type":"uint256"}],"name":"validateMint","outputs":[{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserve","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"validateMoneyMultiplier","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"violatesGRUIsolation","outputs":[{"internalType":"bool","name":"violatesIsolation","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"Ensures GRU isolation, money multiplier = 1.0, reserve constraints","kind":"dev","methods":{"isISO4217Compliant(string)":{"params":{"currencyCode":"Currency code to validate"},"returns":{"isISO4217":"True if ISO-4217 compliant"}},"isReserveSufficient(uint256,uint256)":{"params":{"reserve":"Reserve balance","supply":"Token supply"},"returns":{"isSufficient":"True if reserve >= supply"}},"validateMint(string,uint256,uint256,uint256)":{"params":{"amount":"Amount to mint","currencyCode":"ISO-4217 currency code","currentSupply":"Current token supply","verifiedReserve":"Verified reserve balance"},"returns":{"isValid":"True if mint is compliant","reasonCode":"Reason if not compliant"}},"validateMoneyMultiplier(uint256,uint256)":{"details":"Hard constraint: m = 1.0 (no fractional reserve)","params":{"reserve":"Reserve balance","supply":"Token supply"},"returns":{"isValid":"True if multiplier = 1.0"}},"violatesGRUIsolation(string)":{"params":{"currencyCode":"Currency code"},"returns":{"violatesIsolation":"True if GRU linkage detected"}}},"title":"IComplianceGuard","version":1},"userdoc":{"kind":"user","methods":{"isISO4217Compliant(string)":{"notice":"Check if currency is ISO-4217 compliant"},"isReserveSufficient(uint256,uint256)":{"notice":"Validate reserve sufficiency"},"validateMint(string,uint256,uint256,uint256)":{"notice":"Validate mint operation"},"validateMoneyMultiplier(uint256,uint256)":{"notice":"Validate that money multiplier = 1.0"},"violatesGRUIsolation(string)":{"notice":"Check if operation violates GRU isolation"}},"notice":"Interface for compliance guard enforcing ISO-4217 W token rules","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/interfaces/IComplianceGuard.sol":"IComplianceGuard"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/iso4217w/interfaces/IComplianceGuard.sol":{"keccak256":"0x2f812514f56778c271667c97288de5d8c8b4c3745491a4e787abf4ff02dc74a6","license":"MIT","urls":["bzz-raw://97e6607a8262c270d90c9497df31259e7bb616e2e4d934a1c26c556b5e7e0f9e","dweb:/ipfs/Qmcsy2CjBZVh88yktxpRKawK1xrjMCQMqosPr78HxQWFzZ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXsdQ1unP1VcNNNcVyAgnrfZoMYTiPVfGjE7LXHn2UahZ/archive-info.json b/verification-sources/chain138-metadata-archive/QmXsdQ1unP1VcNNNcVyAgnrfZoMYTiPVfGjE7LXHn2UahZ/archive-info.json new file mode 100644 index 0000000..6b15153 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXsdQ1unP1VcNNNcVyAgnrfZoMYTiPVfGjE7LXHn2UahZ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmXsdQ1unP1VcNNNcVyAgnrfZoMYTiPVfGjE7LXHn2UahZ", + "metadata_digest": "8da8b43c9a77d16cb364dd58cc9d50255d36398e166235c4515b1293ccd4f93c", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol", + "contract_name": "IUniswapV2Pair", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXsdQ1unP1VcNNNcVyAgnrfZoMYTiPVfGjE7LXHn2UahZ/metadata.json b/verification-sources/chain138-metadata-archive/QmXsdQ1unP1VcNNNcVyAgnrfZoMYTiPVfGjE7LXHn2UahZ/metadata.json new file mode 100644 index 0000000..954bf51 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXsdQ1unP1VcNNNcVyAgnrfZoMYTiPVfGjE7LXHn2UahZ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"reserve0","type":"uint112"},{"internalType":"uint112","name":"reserve1","type":"uint112"},{"internalType":"uint32","name":"blockTimestampLast","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"sync","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol":"IUniswapV2Pair"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x7c9bc70e5996c763e02ff38905282bc24fb242b0ef2519a003b36824fc524a4b","urls":["bzz-raw://85d5ad2dd23ee127f40907a12865a1e8cb5828814f6f2480285e1827dd72dedf","dweb:/ipfs/QmayKQWJgWmr46DqWseADyUanmqxh662hPNdAkdHRjiQQH"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXumzC6YSF7UeiKzP63rRbMYif5aVztv9HchxNVwC4zn9/archive-info.json b/verification-sources/chain138-metadata-archive/QmXumzC6YSF7UeiKzP63rRbMYif5aVztv9HchxNVwC4zn9/archive-info.json new file mode 100644 index 0000000..a50e18c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXumzC6YSF7UeiKzP63rRbMYif5aVztv9HchxNVwC4zn9/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmXumzC6YSF7UeiKzP63rRbMYif5aVztv9HchxNVwC4zn9", + "metadata_digest": "8e3593da16a0aacd69c54ec325f3296d02fefb356995dad789034193fc8e43a6", + "source_path": "contracts/wrapped-lp-public/Chain138LPLocker.sol", + "contract_name": "Chain138LPLocker", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXumzC6YSF7UeiKzP63rRbMYif5aVztv9HchxNVwC4zn9/metadata.json b/verification-sources/chain138-metadata-archive/QmXumzC6YSF7UeiKzP63rRbMYif5aVztv9HchxNVwC4zn9/metadata.json new file mode 100644 index 0000000..59fa17a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXumzC6YSF7UeiKzP63rRbMYif5aVztv9HchxNVwC4zn9/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"lpToken_","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"}],"name":"LPLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"}],"name":"LPReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"wlpAmount","type":"uint256"}],"name":"RedemptionRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WLPMinted","type":"event"},{"inputs":[],"name":"BRIDGE_RELEASE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"bytes32","name":"lockRef","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"deposits","outputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"released","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"releaseAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"lockRef","type":"bytes32"},{"internalType":"address","name":"to","type":"address"}],"name":"releaseLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEscrowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Per-lock `lockRef` is used as the cross-chain idempotency key for destination mint. One deployment typically corresponds to one `lpToken` (one pool\u2019s LP token).","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"Chain138LPLocker","version":1},"userdoc":{"kind":"user","methods":{"deposit(uint256)":{"notice":"Lock LP into escrow; `lockRef` must be relayed to the public chain for mint."},"releaseAmount(address,uint256)":{"notice":"Aggregate release for pro-rata / FIFO policies (requires off-chain ordering)."},"releaseLock(bytes32,address)":{"notice":"Release one full lock to `to` after redemption message (or operational unwind)."}},"notice":"Escrows DODO PMM LP ERC20 on Chain 138; releases only to BRIDGE_RELEASE_ROLE (Option A).","version":1}},"settings":{"compilationTarget":{"contracts/wrapped-lp-public/Chain138LPLocker.sol":"Chain138LPLocker"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/wrapped-lp-public/Chain138LPLocker.sol":{"keccak256":"0xf48f8b90206b40ba028f80b3146bc518e0dbf4b72a6b41c13681f23adc41a9a2","license":"MIT","urls":["bzz-raw://35a2d840126b3be6363b4a90c2fda01a26da3e6135e61b6204a3fdae007851b0","dweb:/ipfs/QmPFHzNns16PLmdo3A1gtt3Mdnz2paVVQ9LeJ1ighy6G5p"]},"contracts/wrapped-lp-public/interfaces/IWLPProgramEvents.sol":{"keccak256":"0x71b9c9f9de8553c6c638b02cf93ce7d948021c6ca1719d42725f7eca9ea211d2","license":"MIT","urls":["bzz-raw://76c5b3e693702cd5c2cc2b5131e02046346e8b38d88208f9fa030563852f8786","dweb:/ipfs/QmXWwwAB9zjaVBGW8wCx4coiusmFxtvB24jGozaYXeH7M2"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXvvbNKQo7GhWo6XxFhKcTTyG1uB9ydx14jZ4M8kZWL9n/archive-info.json b/verification-sources/chain138-metadata-archive/QmXvvbNKQo7GhWo6XxFhKcTTyG1uB9ydx14jZ4M8kZWL9n/archive-info.json new file mode 100644 index 0000000..26609dc --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXvvbNKQo7GhWo6XxFhKcTTyG1uB9ydx14jZ4M8kZWL9n/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmXvvbNKQo7GhWo6XxFhKcTTyG1uB9ydx14jZ4M8kZWL9n", + "metadata_digest": "8e80e3c6167a18b44c8aa534f135588929c5507f657ece78a2bc17e0bfbf36d1", + "source_path": "contracts/bridge/integration/USDWPublicWrapVault.sol", + "contract_name": "USDWPublicWrapVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXvvbNKQo7GhWo6XxFhKcTTyG1uB9ydx14jZ4M8kZWL9n/metadata.json b/verification-sources/chain138-metadata-archive/QmXvvbNKQo7GhWo6XxFhKcTTyG1uB9ydx14jZ4M8kZWL9n/metadata.json new file mode 100644 index 0000000..05d193d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXvvbNKQo7GhWo6XxFhKcTTyG1uB9ydx14jZ4M8kZWL9n/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"nativeUsdw_","type":"address"},{"internalType":"address","name":"wrappedUsdw_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"InsufficientUnderlyingLiquidity","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NonCanonicalAmount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnderlyingTokenProtected","type":"error"},{"inputs":[{"internalType":"uint8","name":"nativeDecimals","type":"uint8"},{"internalType":"uint8","name":"wrappedDecimals","type":"uint8"}],"name":"UnsupportedDecimals","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"inputs":[],"name":"ZeroRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"nativeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wrappedEquivalent","type":"uint256"}],"name":"LiquiditySeeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NonUnderlyingTokenRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"wrappedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nativeAmount","type":"uint256"}],"name":"Unwrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"nativeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wrappedAmount","type":"uint256"}],"name":"Wrapped","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableUnderlyingLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableWrappedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityCoverageBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeUsdw","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"wrappedAmount","type":"uint256"}],"name":"previewUnwrap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nativeAmount","type":"uint256"}],"name":"previewWrap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverNonUnderlyingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nativeAmount","type":"uint256"}],"name":"seedLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wrappedAmount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"unwrap","outputs":[{"internalType":"uint256","name":"nativeAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nativeAmount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"wrap","outputs":[{"internalType":"uint256","name":"wrappedAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedUsdw","outputs":[{"internalType":"contract ICWMintBurnMetadata","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"The same cWUSDW supply can be minted by both this vault and the GRU bridge. This contract deliberately does not expose an admin path to withdraw the underlying USDW reserve because that requires a fuller liability model across wrap-originated and bridge-originated cWUSDW supply.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"USDWPublicWrapVault","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Locks native public-chain USDW and mints the shared cWUSDW mirror 1:1 after decimals normalization.","version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/USDWPublicWrapVault.sol":"USDWPublicWrapVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/USDWPublicWrapVault.sol":{"keccak256":"0xe4ed678e4abc2e67235f4f0f940c8b8deaa27134e15b425c388f0baf6f1cd438","license":"MIT","urls":["bzz-raw://5f35be2e84783b7ac34e60121edd067ea53902126c54097c55034c648973b63b","dweb:/ipfs/QmWZD5UPtFjAbrABvav3rvBBazSEtAMoCakrx6BzExRHXc"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmXyLtWU1FutPkhKUqnzqDwXA6Xe8vfKpvP9Y3cAeWuG2t/archive-info.json b/verification-sources/chain138-metadata-archive/QmXyLtWU1FutPkhKUqnzqDwXA6Xe8vfKpvP9Y3cAeWuG2t/archive-info.json new file mode 100644 index 0000000..5696659 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXyLtWU1FutPkhKUqnzqDwXA6Xe8vfKpvP9Y3cAeWuG2t/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmXyLtWU1FutPkhKUqnzqDwXA6Xe8vfKpvP9Y3cAeWuG2t", + "metadata_digest": "8f1f85bbddf959826180a11e6affb748fd852637dacfd9c807ee0f1c37846059", + "source_path": "contracts/vendor/uniswap-v2-core/UniswapV2ERC20.sol", + "contract_name": "UniswapV2ERC20", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmXyLtWU1FutPkhKUqnzqDwXA6Xe8vfKpvP9Y3cAeWuG2t/metadata.json b/verification-sources/chain138-metadata-archive/QmXyLtWU1FutPkhKUqnzqDwXA6Xe8vfKpvP9Y3cAeWuG2t/metadata.json new file mode 100644 index 0000000..eca37e4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmXyLtWU1FutPkhKUqnzqDwXA6Xe8vfKpvP9Y3cAeWuG2t/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/UniswapV2ERC20.sol":"UniswapV2ERC20"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/UniswapV2ERC20.sol":{"keccak256":"0x0599f3684aef3e5f1144e14df1ddd39be24948b7cff125af9c9beca4bc94e1a2","urls":["bzz-raw://962b5efd230c60ce591afed08be4f1def46222da230a527c98c92ee27cf64583","dweb:/ipfs/Qmf5wW4T7F9sNQ1eAgaj94KcFS3hrtU5tTZyPZr8QhgXr8"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2ERC20.sol":{"keccak256":"0x9e433765e9ef7b4ff5e406b260b222c47c2aa27d36df756db708064fcb239ae7","urls":["bzz-raw://5b67c24a5e1652b51ad2f37adad2905519f0e05e7c8b2b4d8b3e00b429bb9213","dweb:/ipfs/QmarJq43GabAGGSqtMUb87ACYQt73mSFbXKyFAPDXpbFNM"]},"contracts/vendor/uniswap-v2-core/libraries/SafeMath.sol":{"keccak256":"0x9c8465de751317860b623cd77f7f53f41a84b6624c0580ee526dcf7a2b7cb80c","urls":["bzz-raw://9b371b3eb0649b486f76cd628cc060354d1ac11fa8baed1170567271655f05d7","dweb:/ipfs/QmTUg31wK9UyX6o1Q1mxE4DQhuc1rWGBanNTu1uagNVQB6"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmY2DWAQCFHACNP5UymAQ6FnwkMNNyGAirL7hL1hkaG1Mm/archive-info.json b/verification-sources/chain138-metadata-archive/QmY2DWAQCFHACNP5UymAQ6FnwkMNNyGAirL7hL1hkaG1Mm/archive-info.json new file mode 100644 index 0000000..7c1cc2f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmY2DWAQCFHACNP5UymAQ6FnwkMNNyGAirL7hL1hkaG1Mm/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmY2DWAQCFHACNP5UymAQ6FnwkMNNyGAirL7hL1hkaG1Mm", + "metadata_digest": "8fdbea0d74ecf2a70902844f3a905fe856457b98fd257eb25d72f15b0ece3afc", + "source_path": "contracts/channels/GenericStateChannelManager.sol", + "contract_name": "GenericStateChannelManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmY2DWAQCFHACNP5UymAQ6FnwkMNNyGAirL7hL1hkaG1Mm/metadata.json b/verification-sources/chain138-metadata-archive/QmY2DWAQCFHACNP5UymAQ6FnwkMNNyGAirL7hL1hkaG1Mm/metadata.json new file mode 100644 index 0000000..1d1eda0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmY2DWAQCFHACNP5UymAQ6FnwkMNNyGAirL7hL1hkaG1Mm/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_challengeWindowSeconds","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"stateHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"balanceA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDeadline","type":"uint256"}],"name":"ChallengeSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldWindow","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWindow","type":"uint256"}],"name":"ChallengeWindowUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"stateHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"balanceA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceB","type":"uint256"},{"indexed":false,"internalType":"bool","name":"cooperative","type":"bool"}],"name":"ChannelClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":true,"internalType":"address","name":"participantA","type":"address"},{"indexed":true,"internalType":"address","name":"participantB","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositB","type":"uint256"}],"name":"ChannelOpened","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"bytes32","name":"stateHash","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"challengeClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"challengeWindowSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"bytes32","name":"stateHash","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"closeChannelCooperative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"finalizeClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"fundChannel","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"getChannel","outputs":[{"components":[{"internalType":"address","name":"participantA","type":"address"},{"internalType":"address","name":"participantB","type":"address"},{"internalType":"uint256","name":"depositA","type":"uint256"},{"internalType":"uint256","name":"depositB","type":"uint256"},{"internalType":"enum IGenericStateChannelManager.ChannelStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"disputeNonce","type":"uint256"},{"internalType":"bytes32","name":"disputeStateHash","type":"bytes32"},{"internalType":"uint256","name":"disputeBalanceA","type":"uint256"},{"internalType":"uint256","name":"disputeBalanceB","type":"uint256"},{"internalType":"uint256","name":"disputeDeadline","type":"uint256"}],"internalType":"struct IGenericStateChannelManager.Channel","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChannelCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"participantA","type":"address"},{"internalType":"address","name":"participantB","type":"address"}],"name":"getChannelId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getChannelIdByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"participantB","type":"address"}],"name":"openChannel","outputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWindow","type":"uint256"}],"name":"setChallengeWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"bytes32","name":"stateHash","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"submitClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Same lifecycle as PaymentChannelManager; close/submit/challenge include stateHash so settlement commits to agreed state.","errors":{"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{},"title":"GenericStateChannelManager","version":1},"userdoc":{"kind":"user","methods":{},"notice":"State channels with committed stateHash: open, fund, close with (stateHash, balanceA, balanceB, nonce). stateHash attests to arbitrary off-chain state (e.g. game, attestation).","version":1}},"settings":{"compilationTarget":{"contracts/channels/GenericStateChannelManager.sol":"GenericStateChannelManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"contracts/channels/GenericStateChannelManager.sol":{"keccak256":"0xd12115b1dbec0e191b673b99408186985b28bc82a8c25ac68e1b428dafc9b519","license":"MIT","urls":["bzz-raw://e9a817490fd019287ef737c38178517185fede597e56920bd6291bf5e0260cf5","dweb:/ipfs/QmXXKug3Xx5iw9ThF2d2fYdSX8vnTePsmhe6NA2uMNPVcK"]},"contracts/channels/IGenericStateChannelManager.sol":{"keccak256":"0xacfaf7210b4cd666cb0447499dfbfeaa8a391168b63aa3917bfaa4dead616c45","license":"MIT","urls":["bzz-raw://22ad5d4696ed7c10033fd00dbf2427bd702c996df09674e7795892ae236fc837","dweb:/ipfs/QmTAYD15mJTDC9eXd3m8hnWzcR8XsXNdw98cBALao81ioE"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYDMKoebkPk8naJwg1EJ3KPaB6nvrNMvfLVyzYGDSeKuM/archive-info.json b/verification-sources/chain138-metadata-archive/QmYDMKoebkPk8naJwg1EJ3KPaB6nvrNMvfLVyzYGDSeKuM/archive-info.json new file mode 100644 index 0000000..287210c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYDMKoebkPk8naJwg1EJ3KPaB6nvrNMvfLVyzYGDSeKuM/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYDMKoebkPk8naJwg1EJ3KPaB6nvrNMvfLVyzYGDSeKuM", + "metadata_digest": "92b625997116de4c1ea17dbf637b8fa6162da7429cc6735845c784300cecde7c", + "source_path": "contracts/tether/MainnetTether.sol", + "contract_name": "MainnetTether", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYDMKoebkPk8naJwg1EJ3KPaB6nvrNMvfLVyzYGDSeKuM/metadata.json b/verification-sources/chain138-metadata-archive/QmYDMKoebkPk8naJwg1EJ3KPaB6nvrNMvfLVyzYGDSeKuM/metadata.json new file mode 100644 index 0000000..d28572c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYDMKoebkPk8naJwg1EJ3KPaB6nvrNMvfLVyzYGDSeKuM/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"validatorCount","type":"uint256"}],"name":"StateProofAnchored","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CHAIN_138","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"internalType":"bytes32","name":"previousBlockHash","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"},{"internalType":"uint256","name":"validatorCount","type":"uint256"}],"name":"anchorStateProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"anchoredBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAnchoredBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAnchoredBlockCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getStateProof","outputs":[{"components":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"internalType":"bytes32","name":"previousBlockHash","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"},{"internalType":"uint256","name":"validatorCount","type":"uint256"},{"internalType":"bytes32","name":"proofHash","type":"bytes32"}],"internalType":"struct MainnetTether.StateProof","name":"proof","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"isAnchored","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateProofs","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"internalType":"bytes32","name":"previousBlockHash","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"},{"internalType":"uint256","name":"validatorCount","type":"uint256"},{"internalType":"bytes32","name":"proofHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Stores signed state proofs from Chain-138 validators, creating an immutable and verifiable record of Chain-138's state on Mainnet","kind":"dev","methods":{"anchorStateProof(uint256,bytes32,bytes32,bytes32,uint256,bytes,uint256)":{"params":{"blockHash":"Chain-138 block hash","blockNumber":"Chain-138 block number","previousBlockHash":"Previous block hash","signatures":"Collective signatures from validators","stateRoot":"Chain-138 state root","timestamp":"Block timestamp","validatorCount":"Number of validators that signed"}},"getAnchoredBlock(uint256)":{"params":{"index":"Index in anchoredBlocks array"},"returns":{"_0":"blockNumber Block number"}},"getAnchoredBlockCount()":{"returns":{"_0":"count Number of anchored blocks"}},"getStateProof(uint256)":{"params":{"blockNumber":"Chain-138 block number"},"returns":{"proof":"State proof structure"}},"isAnchored(uint256)":{"params":{"blockNumber":"Chain-138 block number"},"returns":{"_0":"true if anchored"}}},"title":"MainnetTether","version":1},"userdoc":{"kind":"user","methods":{"anchorStateProof(uint256,bytes32,bytes32,bytes32,uint256,bytes,uint256)":{"notice":"Anchor a state proof from Chain-138"},"getAnchoredBlock(uint256)":{"notice":"Get anchored block number at index"},"getAnchoredBlockCount()":{"notice":"Get total number of anchored blocks"},"getStateProof(uint256)":{"notice":"Get state proof for a specific block"},"isAnchored(uint256)":{"notice":"Check if a block is anchored"},"setAdmin(address)":{"notice":"Admin functions"}},"notice":"Anchors Chain-138 state proofs to Ethereum Mainnet (Kaleido-style)","version":1}},"settings":{"compilationTarget":{"contracts/tether/MainnetTether.sol":"MainnetTether"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/tether/MainnetTether.sol":{"keccak256":"0xf15bdbb764cf80285ff85afa8e023c088bbce1f3942dbec9c956ce6759344940","license":"MIT","urls":["bzz-raw://77bd9cccc1ad272a1abb3e11c3a5a7b73abfc6bce2ad638a47a510d09adb3dbf","dweb:/ipfs/QmfZ3YTT33eJXxDUnhaDTGvHbSQ428nj373JQBTLD22SuL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYKvMdgGqDPHvsToPM8BFdUYDJGnqz9pUume4VoUG56eE/archive-info.json b/verification-sources/chain138-metadata-archive/QmYKvMdgGqDPHvsToPM8BFdUYDJGnqz9pUume4VoUG56eE/archive-info.json new file mode 100644 index 0000000..9d83270 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYKvMdgGqDPHvsToPM8BFdUYDJGnqz9pUume4VoUG56eE/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYKvMdgGqDPHvsToPM8BFdUYDJGnqz9pUume4VoUG56eE", + "metadata_digest": "9464fb0792564dd9348fca31b9879540eeaebee4abafd751893735cfbd5de913", + "source_path": "contracts/vault/interfaces/ICollateralAdapter.sol", + "contract_name": "ICollateralAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYKvMdgGqDPHvsToPM8BFdUYDJGnqz9pUume4VoUG56eE/metadata.json b/verification-sources/chain138-metadata-archive/QmYKvMdgGqDPHvsToPM8BFdUYDJGnqz9pUume4VoUG56eE/metadata.json new file mode 100644 index 0000000..9c4ef3b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYKvMdgGqDPHvsToPM8BFdUYDJGnqz9pUume4VoUG56eE/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CollateralDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"liquidator","type":"address"}],"name":"CollateralSeized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CollateralWithdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"liquidator","type":"address"}],"name":"seize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Handles M0 collateral deposits and withdrawals","kind":"dev","methods":{"deposit(address,address,uint256)":{"params":{"amount":"Amount to deposit","asset":"Collateral asset address","vault":"Vault address"}},"seize(address,address,uint256,address)":{"params":{"amount":"Amount to seize","asset":"Collateral asset address","liquidator":"Liquidator address","vault":"Vault address"}},"withdraw(address,address,uint256)":{"params":{"amount":"Amount to withdraw","asset":"Collateral asset address","vault":"Vault address"}}},"title":"ICollateralAdapter","version":1},"userdoc":{"kind":"user","methods":{"deposit(address,address,uint256)":{"notice":"Deposit M0 collateral"},"seize(address,address,uint256,address)":{"notice":"Seize collateral during liquidation"},"withdraw(address,address,uint256)":{"notice":"Withdraw M0 collateral"}},"notice":"Interface for Collateral Adapter","version":1}},"settings":{"compilationTarget":{"contracts/vault/interfaces/ICollateralAdapter.sol":"ICollateralAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vault/interfaces/ICollateralAdapter.sol":{"keccak256":"0x45c2214f58500a3ad92ea1ea2c018bb0e71e1dd441e6c293cfbb88ffa5629efc","license":"MIT","urls":["bzz-raw://92e981007a82373da7f08bd7ec4de0b92126091b73356e641adaaf3d46531a1b","dweb:/ipfs/QmbcB6qSdN9imJEEdQQngBkokhtXNMK5eTUyjccpjyLSVd"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYMy5NMXQjhX6AJRfnqu6eL3u7ZhPPFMEj6AXBESvB9Qb/archive-info.json b/verification-sources/chain138-metadata-archive/QmYMy5NMXQjhX6AJRfnqu6eL3u7ZhPPFMEj6AXBESvB9Qb/archive-info.json new file mode 100644 index 0000000..2c95161 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYMy5NMXQjhX6AJRfnqu6eL3u7ZhPPFMEj6AXBESvB9Qb/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYMy5NMXQjhX6AJRfnqu6eL3u7ZhPPFMEj6AXBESvB9Qb", + "metadata_digest": "94eb379d573b42b9088abaa55921a8f3e16cb50516cc0ac8424464e7f8df9b38", + "source_path": "contracts/flash/interfaces/ICrossChainFlashBridge.sol", + "contract_name": "ICrossChainFlashBridge", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYMy5NMXQjhX6AJRfnqu6eL3u7ZhPPFMEj6AXBESvB9Qb/metadata.json b/verification-sources/chain138-metadata-archive/QmYMy5NMXQjhX6AJRfnqu6eL3u7ZhPPFMEj6AXBESvB9Qb/metadata.json new file mode 100644 index 0000000..cbff673 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYMy5NMXQjhX6AJRfnqu6eL3u7ZhPPFMEj6AXBESvB9Qb/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"address","name":"recipientOnDestination","type":"address"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"bridgeTokensFrom","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"Wire to `UniversalCCIPFlashBridgeAdapter` (\u2192 `UniversalCCIPBridge.bridge`), a dedicated adapter, or a mock in tests. Implementations MUST pull from `msg.sender` (e.g. `transferFrom`) up to `amount` after allowance. For `UniversalCCIPFlashBridgeAdapter`, optional `extraData` encodes `(bytes32 assetType, bool usePMM, bool useVault, bytes complianceProof, bytes vaultInstructions)`; empty uses zeros/false.","kind":"dev","methods":{},"title":"ICrossChainFlashBridge","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Minimal surface for \u201cpull `token` from msg.sender then initiate CCIP / bridge\u201d.","version":1}},"settings":{"compilationTarget":{"contracts/flash/interfaces/ICrossChainFlashBridge.sol":"ICrossChainFlashBridge"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/flash/interfaces/ICrossChainFlashBridge.sol":{"keccak256":"0xe27559ab0d9cb3fd2b733cbfabb857970baebd16e81a2ba0358e826050e9b3e8","license":"MIT","urls":["bzz-raw://da208d8e6dcc07c3fa09ee53bb679fc8213f476612335df1991700bce4e1404e","dweb:/ipfs/QmeT6KD6LwwgEEnQdLC1dyZP5iHHaysm3waWoNC3sxyj5P"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYTAAjkWZ1Jd4YNQACuUNopTNcuAFcDdrX2D38amwpVim/archive-info.json b/verification-sources/chain138-metadata-archive/QmYTAAjkWZ1Jd4YNQACuUNopTNcuAFcDdrX2D38amwpVim/archive-info.json new file mode 100644 index 0000000..1efb212 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYTAAjkWZ1Jd4YNQACuUNopTNcuAFcDdrX2D38amwpVim/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYTAAjkWZ1Jd4YNQACuUNopTNcuAFcDdrX2D38amwpVim", + "metadata_digest": "963fa9e7f7006300f3e590700f4e1c01486703bcaa66a2f7cfb658b03413155e", + "source_path": "contracts/flash/SwapFlashWorkflowBorrower.sol", + "contract_name": "SwapFlashWorkflowBorrower", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYTAAjkWZ1Jd4YNQACuUNopTNcuAFcDdrX2D38amwpVim/metadata.json b/verification-sources/chain138-metadata-archive/QmYTAAjkWZ1Jd4YNQACuUNopTNcuAFcDdrX2D38amwpVim/metadata.json new file mode 100644 index 0000000..4003319 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYTAAjkWZ1Jd4YNQACuUNopTNcuAFcDdrX2D38amwpVim/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"trustedLender_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadParams","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientToRepay","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UntrustedLender","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onFlashLoan","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedLender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"`data` must be `abi.encode(SwapFlashParams)`. The caller chooses `integration` \u2014 use only trusted DODO/PMM routers. `pool` is typically the same for both legs (e.g. cUSDT/USDT round-trip). Set mins from off-chain quotes.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"SwapFlashWorkflowBorrower","version":1},"userdoc":{"kind":"user","methods":{},"notice":"ERC-3156 borrower: flash `token` \u2192 swap to `midToken` \u2192 swap back to `token` \u2192 repay `amount + fee`.","version":1}},"settings":{"compilationTarget":{"contracts/flash/SwapFlashWorkflowBorrower.sol":"SwapFlashWorkflowBorrower"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":{"keccak256":"0x9f9e6dba43fe0775c400aa384375f1f503efaf733a40187169fdfc195f5ea6fa","license":"MIT","urls":["bzz-raw://ff5fe5fac5e4ecbf9fcd34c42b6d58d1af150263dfe07bc6785a59329dd1e475","dweb:/ipfs/QmX1EhNKKL6n6RFrLLAYh6Uf3itkozjSHyGFs9DqwW4Rzy"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/flash/SwapFlashWorkflowBorrower.sol":{"keccak256":"0xcde34e381206680f1410a990db32fff0de83b647dc6e1fa6e0c84dba9c722a39","license":"MIT","urls":["bzz-raw://a9ab86eb0c47cbd7c3786519e41716a4454ada259fa904b14ee1b69dce8ab0aa","dweb:/ipfs/QmNeSEBx6sMisoC1GwKBt6qjGjkzCpqeg1G1qBAfp3cUTJ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYThnRYfXUNbYunyAZU5eNG1orsXA3HK9ikw2WToG8iJN/archive-info.json b/verification-sources/chain138-metadata-archive/QmYThnRYfXUNbYunyAZU5eNG1orsXA3HK9ikw2WToG8iJN/archive-info.json new file mode 100644 index 0000000..717a74d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYThnRYfXUNbYunyAZU5eNG1orsXA3HK9ikw2WToG8iJN/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYThnRYfXUNbYunyAZU5eNG1orsXA3HK9ikw2WToG8iJN", + "metadata_digest": "96636944b6dba1ca20b6d4ccc4a6d7647e4bef3a5ce8ae662f84ed8526ea007b", + "source_path": "contracts/emoney/BridgeVault138.sol", + "contract_name": "BridgeVault138", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYThnRYfXUNbYunyAZU5eNG1orsXA3HK9ikw2WToG8iJN/metadata.json b/verification-sources/chain138-metadata-archive/QmYThnRYfXUNbYunyAZU5eNG1orsXA3HK9ikw2WToG8iJN/metadata.json new file mode 100644 index 0000000..f0bf00f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYThnRYfXUNbYunyAZU5eNG1orsXA3HK9ikw2WToG8iJN/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"BridgeVault138","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Stub for build; full implementation when emoney module is restored","version":1}},"settings":{"compilationTarget":{"contracts/emoney/BridgeVault138.sol":"BridgeVault138"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/BridgeVault138.sol":{"keccak256":"0x408e93475d462ae1778b920e10e2b4098dade444e0658b9d937c01e1459e6c80","license":"MIT","urls":["bzz-raw://b0ef109ac0c129eb70d0b42589cbb363ed24d9fa17696f9d77af6d9133d7f445","dweb:/ipfs/QmentaxiBNfS3sJgyoZJgXuPWo6CNH9uEf8AMNnEfLuZsq"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYVG3phjKR6jGmmug29wA39LyCAbi19VskuwQDWLiRdUY/archive-info.json b/verification-sources/chain138-metadata-archive/QmYVG3phjKR6jGmmug29wA39LyCAbi19VskuwQDWLiRdUY/archive-info.json new file mode 100644 index 0000000..013075e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYVG3phjKR6jGmmug29wA39LyCAbi19VskuwQDWLiRdUY/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmYVG3phjKR6jGmmug29wA39LyCAbi19VskuwQDWLiRdUY", + "metadata_digest": "96c9798848d7bcc107b1c48392d09a530fd028a2fe0205efe504be42afe133bd", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Callee.sol", + "contract_name": "IUniswapV2Callee", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYVG3phjKR6jGmmug29wA39LyCAbi19VskuwQDWLiRdUY/metadata.json b/verification-sources/chain138-metadata-archive/QmYVG3phjKR6jGmmug29wA39LyCAbi19VskuwQDWLiRdUY/metadata.json new file mode 100644 index 0000000..a7a3eac --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYVG3phjKR6jGmmug29wA39LyCAbi19VskuwQDWLiRdUY/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"uniswapV2Call","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Callee.sol":"IUniswapV2Callee"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Callee.sol":{"keccak256":"0x6bf2e1cd601f8df7a25606a03fb01532f33aa5d77278ef6e7fb72a3b95a2d8d8","license":"GPL-3.0","urls":["bzz-raw://aaaf7c44351d883b3830e484cc20fe1f91b832aaeb8c4631b1848b6bb08c7661","dweb:/ipfs/QmbxistLwfsuywWLHgBpDcQu4f5j6wV13Vs3JrSd1gjX9N"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYVhcbMd8BscucTSmvRVwnPVyvrpCuckDvWLq4nvHn33L/archive-info.json b/verification-sources/chain138-metadata-archive/QmYVhcbMd8BscucTSmvRVwnPVyvrpCuckDvWLq4nvHn33L/archive-info.json new file mode 100644 index 0000000..bbe3123 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYVhcbMd8BscucTSmvRVwnPVyvrpCuckDvWLq4nvHn33L/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYVhcbMd8BscucTSmvRVwnPVyvrpCuckDvWLq4nvHn33L", + "metadata_digest": "96e661946f91b8b1a3cdd748d4d3e56a7cfa38a79a3d4752498ed5d173c231b7", + "source_path": "contracts/bridge/integration/CWAssetReserveVerifier.sol", + "contract_name": "CWAssetReserveVerifier", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYVhcbMd8BscucTSmvRVwnPVyvrpCuckDvWLq4nvHn33L/metadata.json b/verification-sources/chain138-metadata-archive/QmYVhcbMd8BscucTSmvRVwnPVyvrpCuckDvWLq4nvHn33L/metadata.json new file mode 100644 index 0000000..e6a7216 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYVhcbMd8BscucTSmvRVwnPVyvrpCuckDvWLq4nvHn33L/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"bridge_","type":"address"},{"internalType":"address","name":"assetVault_","type":"address"},{"internalType":"address","name":"reserveSystem_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"BridgeTokenPaused","type":"error"},{"inputs":[],"name":"ChainOutstandingCapExceeded","type":"error"},{"inputs":[],"name":"EscrowInvariantViolation","type":"error"},{"inputs":[],"name":"ReserveAssetRequired","type":"error"},{"inputs":[],"name":"ReserveSystemBackingInsufficient","type":"error"},{"inputs":[],"name":"ReserveSystemRequired","type":"error"},{"inputs":[],"name":"TokenNotConfigured","type":"error"},{"inputs":[],"name":"TokenOwnerMismatch","type":"error"},{"inputs":[],"name":"UnsupportedCanonicalToken","type":"error"},{"inputs":[],"name":"VaultBackingInsufficient","type":"error"},{"inputs":[],"name":"VaultRequired","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newVault","type":"address"}],"name":"AssetVaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newBridge","type":"address"}],"name":"BridgeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newReserveSystem","type":"address"}],"name":"ReserveSystemUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"address","name":"reserveAsset","type":"address"},{"indexed":false,"internalType":"bool","name":"requireVaultBacking","type":"bool"},{"indexed":false,"internalType":"bool","name":"requireReserveSystemBalance","type":"bool"},{"indexed":false,"internalType":"bool","name":"requireTokenOwnerMatchVault","type":"bool"}],"name":"TokenConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"}],"name":"TokenDisabled","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HARD_THRESHOLD_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"contract ICWMultiTokenBridgeL1AccountingV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"address","name":"reserveAsset","type":"address"},{"internalType":"bool","name":"requireVaultBacking","type":"bool"},{"internalType":"bool","name":"requireReserveSystemBalance","type":"bool"},{"internalType":"bool","name":"requireTokenOwnerMatchVault","type":"bool"}],"name":"configureToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"}],"name":"disableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"}],"name":"getVerificationStatus","outputs":[{"components":[{"internalType":"bool","name":"supportedCanonicalToken","type":"bool"},{"internalType":"bool","name":"bridgePaused","type":"bool"},{"internalType":"bool","name":"escrowSufficient","type":"bool"},{"internalType":"bool","name":"chainCapSufficient","type":"bool"},{"internalType":"bool","name":"reserveSystemAdequate","type":"bool"},{"internalType":"bool","name":"vaultAdequate","type":"bool"},{"internalType":"bool","name":"tokenOwnerMatchesVault","type":"bool"},{"internalType":"bool","name":"passes","type":"bool"},{"internalType":"uint256","name":"lockedBalanceAmount","type":"uint256"},{"internalType":"uint256","name":"totalOutstandingAmount","type":"uint256"},{"internalType":"uint256","name":"chainOutstandingAmount","type":"uint256"},{"internalType":"uint256","name":"maxOutstandingAmount","type":"uint256"},{"internalType":"uint256","name":"canonicalTotalSupply","type":"uint256"},{"internalType":"uint256","name":"reserveSystemBalance","type":"uint256"},{"internalType":"uint256","name":"vaultReserveBalance","type":"uint256"},{"internalType":"uint256","name":"vaultBackingRatio","type":"uint256"}],"internalType":"struct CWAssetReserveVerifier.VerificationStatus","name":"status","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveSystem","outputs":[{"internalType":"contract IReserveSystem","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"assetVault_","type":"address"}],"name":"setAssetVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bridge_","type":"address"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reserveSystem_","type":"address"}],"name":"setReserveSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenConfigs","outputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address","name":"reserveAsset","type":"address"},{"internalType":"bool","name":"requireVaultBacking","type":"bool"},{"internalType":"bool","name":"requireReserveSystemBalance","type":"bool"},{"internalType":"bool","name":"requireTokenOwnerMatchVault","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"verifyLock","outputs":[{"internalType":"bool","name":"verified","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Uses bridge accounting plus optional vault and reserve-system checks so one verifier can cover stable, monetary-unit, and gas-native families behind a single L1 bridge.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"CWAssetReserveVerifier","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Generic reserve verifier for canonical c* -> mirrored cW* bridge lanes.","version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/CWAssetReserveVerifier.sol":"CWAssetReserveVerifier"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/CWAssetReserveVerifier.sol":{"keccak256":"0xcb55f1e9a1cf66ac3664c2b1aefe5fea606cb5cf49d6c1fe28d8a801a6304b26","license":"MIT","urls":["bzz-raw://cd2bdfc516e4e6ada08aea0e897acebdf9fbeca2fde3c4dc2141fcba100a31b3","dweb:/ipfs/QmQ7HiaLuE5x1tMZaMCiLrMMYwLx4ijeyBB9L9Cv7bci2y"]},"contracts/bridge/integration/ICWReserveVerifier.sol":{"keccak256":"0x4fc7b6b8f10d5ec64517fc31559a2b7ac52c7496a7effaac7d29fbfc64f44528","license":"MIT","urls":["bzz-raw://7ef5196aefc98a7d6b295118500062ec62c05d786e3f9ad1ae8414d48279605d","dweb:/ipfs/QmU6cE1rZA99DygbUECyCoQwc5t2g1aJrcs3BiZ4SPoksa"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYYEQ522bJSQtYWU48MA2pqQfmpTDp8RURRmafnssYYUr/archive-info.json b/verification-sources/chain138-metadata-archive/QmYYEQ522bJSQtYWU48MA2pqQfmpTDp8RURRmafnssYYUr/archive-info.json new file mode 100644 index 0000000..7f6f2da --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYYEQ522bJSQtYWU48MA2pqQfmpTDp8RURRmafnssYYUr/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYYEQ522bJSQtYWU48MA2pqQfmpTDp8RURRmafnssYYUr", + "metadata_digest": "978c59b818064d3b976dd68987fb8fbca33d7a88679d8e909ac9910127300023", + "source_path": "contracts/vendor/uniswap-v2-periphery/interfaces/IERC20.sol", + "contract_name": "IERC20", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYYEQ522bJSQtYWU48MA2pqQfmpTDp8RURRmafnssYYUr/metadata.json b/verification-sources/chain138-metadata-archive/QmYYEQ522bJSQtYWU48MA2pqQfmpTDp8RURRmafnssYYUr/metadata.json new file mode 100644 index 0000000..edc210c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYYEQ522bJSQtYWU48MA2pqQfmpTDp8RURRmafnssYYUr/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/interfaces/IERC20.sol":"IERC20"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/uniswap-v2-periphery/interfaces/IERC20.sol":{"keccak256":"0x61db17aebc5d812c7002d15c1da954065e56abe49d64b14c034abe5604d70eb3","urls":["bzz-raw://b006685e753f9120469f10b09c159f222d4cb8b507a6c1f0c14ed50c883ebe66","dweb:/ipfs/QmSyY7iTugbczPwfGK67etiyPULenYGzzRYbt8aabwwkUb"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYZq27qDFbHADcaPPk9QvEMNxNCj2Pz1FZmWsbRB1QwTz/archive-info.json b/verification-sources/chain138-metadata-archive/QmYZq27qDFbHADcaPPk9QvEMNxNCj2Pz1FZmWsbRB1QwTz/archive-info.json new file mode 100644 index 0000000..b44cef2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYZq27qDFbHADcaPPk9QvEMNxNCj2Pz1FZmWsbRB1QwTz/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYZq27qDFbHADcaPPk9QvEMNxNCj2Pz1FZmWsbRB1QwTz", + "metadata_digest": "97f513f518f4a5d06cc073762fe6f552a8896f109b5b6686246deccdb4bf2c8d", + "source_path": "contracts/flash/UniswapV3ExternalUnwinder.sol", + "contract_name": "UniswapV3ExternalUnwinder", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYZq27qDFbHADcaPPk9QvEMNxNCj2Pz1FZmWsbRB1QwTz/metadata.json b/verification-sources/chain138-metadata-archive/QmYZq27qDFbHADcaPPk9QvEMNxNCj2Pz1FZmWsbRB1QwTz/metadata.json new file mode 100644 index 0000000..221b8ac --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYZq27qDFbHADcaPPk9QvEMNxNCj2Pz1FZmWsbRB1QwTz/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"router_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadParams","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unwind","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"`data` is optional: - `abi.encode(uint24 fee)` for exactInputSingle - `abi.encode(bytes path)` for exactInput multi-hop path","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"UniswapV3ExternalUnwinder","version":1},"userdoc":{"kind":"user","methods":{},"notice":"External unwind adapter for quote-push workflows using the Uniswap V3 SwapRouter.","version":1}},"settings":{"compilationTarget":{"contracts/flash/UniswapV3ExternalUnwinder.sol":"UniswapV3ExternalUnwinder"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/flash/UniswapV3ExternalUnwinder.sol":{"keccak256":"0xfa9a6fab6674bc4dbe7a1986c962e4040f5f6a4e1731505ec8aa3f068b897d4b","license":"MIT","urls":["bzz-raw://2c8a190df84cd4d0b07cce2ffd182328ba9f509c8c81b9d3fb859d7f81402d84","dweb:/ipfs/Qmb6kCE1XTjdU4htgaRq7BMVArHrRvYp2pSzWuvs6Nogpx"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYZy5gosmrHvkSChg8Ma2PjPdAYDAPs43f82QeY7huP77/archive-info.json b/verification-sources/chain138-metadata-archive/QmYZy5gosmrHvkSChg8Ma2PjPdAYDAPs43f82QeY7huP77/archive-info.json new file mode 100644 index 0000000..7f5daf3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYZy5gosmrHvkSChg8Ma2PjPdAYDAPs43f82QeY7huP77/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYZy5gosmrHvkSChg8Ma2PjPdAYDAPs43f82QeY7huP77", + "metadata_digest": "97fe3172b169ceede070b1dbcbe47ebcc4a6f72903ccefda8b6d377b0d03621a", + "source_path": "contracts/dbis/DBIS_GRU_MintController.sol", + "contract_name": "IERC20Mintable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYZy5gosmrHvkSChg8Ma2PjPdAYDAPs43f82QeY7huP77/metadata.json b/verification-sources/chain138-metadata-archive/QmYZy5gosmrHvkSChg8Ma2PjPdAYDAPs43f82QeY7huP77/metadata.json new file mode 100644 index 0000000..5757ee8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYZy5gosmrHvkSChg8Ma2PjPdAYDAPs43f82QeY7huP77/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/DBIS_GRU_MintController.sol":"IERC20Mintable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dbis/DBIS_GRU_MintController.sol":{"keccak256":"0xaf4335354ffcd7dbd347dfdee11844b30c3c41f0146ea364fefee5c423859d2a","license":"MIT","urls":["bzz-raw://973464f81ca10982aa6e88c5e51f649418d69329ce3cc14978fe2a261d346557","dweb:/ipfs/QmXgBMbsCx5J24j1Hsma7QrVdpXYWLmTmUy3Rqup1vDNaz"]},"contracts/dbis/IDBISTypes.sol":{"keccak256":"0x1bb363bec4bd479a62db2e2e52b9420b0544be3c7e09dcc88b1b4061c23b7731","license":"MIT","urls":["bzz-raw://f6160b4aa259c5b5a716194b884b4612e6f9627ab8283657ab2476fd3188dc1d","dweb:/ipfs/QmX8xSb3kMuWr7WZdWFJUrAFVZQQKs6vedJYZPNF43DjgX"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYbxtPuxExJQzT54GXmVdneUDGsCsEBUJomTGUJUs5sj8/archive-info.json b/verification-sources/chain138-metadata-archive/QmYbxtPuxExJQzT54GXmVdneUDGsCsEBUJomTGUJUs5sj8/archive-info.json new file mode 100644 index 0000000..c0fe486 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYbxtPuxExJQzT54GXmVdneUDGsCsEBUJomTGUJUs5sj8/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYbxtPuxExJQzT54GXmVdneUDGsCsEBUJomTGUJUs5sj8", + "metadata_digest": "988122788bccedad4f6ae6fcb26ba8bdf0287b66c343b2979c1d0c38c169a0f3", + "source_path": "contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router02.sol", + "contract_name": "IUniswapV2Router02", + "compiler": "0.6.6", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/fafa493132a3d2f65cdfc44051edfddd.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYbxtPuxExJQzT54GXmVdneUDGsCsEBUJomTGUJUs5sj8/metadata.json b/verification-sources/chain138-metadata-archive/QmYbxtPuxExJQzT54GXmVdneUDGsCsEBUJomTGUJUs5sj8/metadata.json new file mode 100644 index 0000000..2a9cc91 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYbxtPuxExJQzT54GXmVdneUDGsCsEBUJomTGUJUs5sj8/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.6+commit.6c089d02"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router02.sol":"IUniswapV2Router02"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router01.sol":{"keccak256":"0x8a3c5c449d4b7cd76513ed6995f4b86e4a86f222c770f8442f5fc128ce29b4d2","urls":["bzz-raw://1df63ca373dafae3bd0ee7fe70f890a1dc7c45ed869c01de68413e0e97ff9deb","dweb:/ipfs/QmefJgEYGUL8KX7kQKYTrDweF8GB7yjy3nw5Bmqzryg7PG"]},"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router02.sol":{"keccak256":"0x744e30c133bd0f7ca9e7163433cf6d72f45c6bb1508c2c9c02f1a6db796ae59d","urls":["bzz-raw://9bf2f4454ad63d4cff03a0630e787d9e8a9deed80aec89682cd8ad6379d9ef8c","dweb:/ipfs/Qme51hQNR2wpax7ooUadhtqLtXm8ffeVVYyubLkTT4wMCG"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYc8uARrExBHJaSJJVNH4KiuZXqQvnT6EtihsmbdmJGkT/archive-info.json b/verification-sources/chain138-metadata-archive/QmYc8uARrExBHJaSJJVNH4KiuZXqQvnT6EtihsmbdmJGkT/archive-info.json new file mode 100644 index 0000000..973e529 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYc8uARrExBHJaSJJVNH4KiuZXqQvnT6EtihsmbdmJGkT/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYc8uARrExBHJaSJJVNH4KiuZXqQvnT6EtihsmbdmJGkT", + "metadata_digest": "988c74e70aad0995f4e3e48262a8f18de2962698f111df0cc35729bbe599c55c", + "source_path": "contracts/ccip/CCIPMessageValidator.sol", + "contract_name": "CCIPMessageValidator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYc8uARrExBHJaSJJVNH4KiuZXqQvnT6EtihsmbdmJGkT/metadata.json b/verification-sources/chain138-metadata-archive/QmYc8uARrExBHJaSJJVNH4KiuZXqQvnT6EtihsmbdmJGkT/metadata.json new file mode 100644 index 0000000..36ac986 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYc8uARrExBHJaSJJVNH4KiuZXqQvnT6EtihsmbdmJGkT/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"details":"Provides message validation utilities","kind":"dev","methods":{},"title":"CCIP Message Validator","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Validates CCIP messages for replay protection and format","version":1}},"settings":{"compilationTarget":{"contracts/ccip/CCIPMessageValidator.sol":"CCIPMessageValidator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/ccip/CCIPMessageValidator.sol":{"keccak256":"0x22ed516aef5e109a9efa23f7f2286a8d8baa1aebff73548de1a237793cd94479","license":"MIT","urls":["bzz-raw://60b1df3a9e8a293805e1fa07ea30e64aaf9d49fa7583f7315c7388cdbe67827f","dweb:/ipfs/QmWTiR7gftFsD7zuXS4UuhDefS2McTwpjXgJENAEpdFssD"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYcwT1zcNEZyRU1c5XoBaa8PmtY6gWcLNr8ocMWbkwRo5/archive-info.json b/verification-sources/chain138-metadata-archive/QmYcwT1zcNEZyRU1c5XoBaa8PmtY6gWcLNr8ocMWbkwRo5/archive-info.json new file mode 100644 index 0000000..4519587 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYcwT1zcNEZyRU1c5XoBaa8PmtY6gWcLNr8ocMWbkwRo5/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYcwT1zcNEZyRU1c5XoBaa8PmtY6gWcLNr8ocMWbkwRo5", + "metadata_digest": "98c1170b62e3adb2a6d4ebd2ae638637269a5c9c1c8ba5fc18a5773a64516570", + "source_path": "contracts/flash/SwapFlashWorkflowBorrower.sol", + "contract_name": "IDODOStyleSwapExactIn", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYcwT1zcNEZyRU1c5XoBaa8PmtY6gWcLNr8ocMWbkwRo5/metadata.json b/verification-sources/chain138-metadata-archive/QmYcwT1zcNEZyRU1c5XoBaa8PmtY6gWcLNr8ocMWbkwRo5/metadata.json new file mode 100644 index 0000000..196ebe3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYcwT1zcNEZyRU1c5XoBaa8PmtY6gWcLNr8ocMWbkwRo5/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapExactIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Matches `DODOPMMIntegration.swapExactIn` surface (any registered pool).","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/SwapFlashWorkflowBorrower.sol":"IDODOStyleSwapExactIn"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":{"keccak256":"0x9f9e6dba43fe0775c400aa384375f1f503efaf733a40187169fdfc195f5ea6fa","license":"MIT","urls":["bzz-raw://ff5fe5fac5e4ecbf9fcd34c42b6d58d1af150263dfe07bc6785a59329dd1e475","dweb:/ipfs/QmX1EhNKKL6n6RFrLLAYh6Uf3itkozjSHyGFs9DqwW4Rzy"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/flash/SwapFlashWorkflowBorrower.sol":{"keccak256":"0xcde34e381206680f1410a990db32fff0de83b647dc6e1fa6e0c84dba9c722a39","license":"MIT","urls":["bzz-raw://a9ab86eb0c47cbd7c3786519e41716a4454ada259fa904b14ee1b69dce8ab0aa","dweb:/ipfs/QmNeSEBx6sMisoC1GwKBt6qjGjkzCpqeg1G1qBAfp3cUTJ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYdD4oQkpA6nmyT5VB4DoxQkQLSWos4eFscmrgG8oQSQe/archive-info.json b/verification-sources/chain138-metadata-archive/QmYdD4oQkpA6nmyT5VB4DoxQkQLSWos4eFscmrgG8oQSQe/archive-info.json new file mode 100644 index 0000000..b71cd2b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYdD4oQkpA6nmyT5VB4DoxQkQLSWos4eFscmrgG8oQSQe/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYdD4oQkpA6nmyT5VB4DoxQkQLSWos4eFscmrgG8oQSQe", + "metadata_digest": "98d2bf8747f7138b63cff68504cfe116ca664690ad0f968ba198ee7ff3a753f7", + "source_path": "contracts/vault/XAUOracle.sol", + "contract_name": "XAUOracle", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYdD4oQkpA6nmyT5VB4DoxQkQLSWos4eFscmrgG8oQSQe/metadata.json b/verification-sources/chain138-metadata-archive/QmYdD4oQkpA6nmyT5VB4DoxQkQLSWos4eFscmrgG8oQSQe/metadata.json new file mode 100644 index 0000000..4fa37c1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYdD4oQkpA6nmyT5VB4DoxQkQLSWos4eFscmrgG8oQSQe/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feed","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWeight","type":"uint256"}],"name":"FeedWeightUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OracleFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OracleUnfrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feed","type":"address"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"PriceFeedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feed","type":"address"}],"name":"PriceFeedRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEED_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAFETY_MARGIN_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feed","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"addPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getETHPriceInXAU","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"getLiquidationPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceFeeds","outputs":[{"components":[{"internalType":"address","name":"feed","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct XAUOracle.PriceFeed[]","name":"feeds","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feed","type":"address"}],"name":"removePriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unfreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feed","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"updateFeedWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Aggregates prices from multiple Aggregator feeds COMPLIANCE NOTES: - XAU (Gold) is the ISO 4217 commodity code used as universal unit of account - All currency conversions in the system MUST triangulate through XAU - XAU is NOT legal tender, but serves as the normalization standard","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"addPriceFeed(address,uint256)":{"params":{"feed":"Price feed address (must implement Aggregator interface)","weight":"Weight for this feed (in basis points)"}},"getETHPriceInXAU()":{"returns":{"price":"ETH price in XAU (18 decimals)","timestamp":"Last update timestamp"}},"getLiquidationPrice(address)":{"params":{"vault":"Vault address (not used in current implementation, reserved for future use)"},"returns":{"price":"Liquidation threshold price in XAU"}},"getPriceFeeds()":{"returns":{"feeds":"Array of price feed structs"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isFrozen()":{"returns":{"_0":"frozen True if frozen"}},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"removePriceFeed(address)":{"params":{"feed":"Price feed address to remove"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"updateFeedWeight(address,uint256)":{"params":{"feed":"Price feed address","weight":"New weight"}},"updatePrice()":{"details":"Can be called by anyone, but typically called by keeper"}},"title":"XAUOracle","version":1},"userdoc":{"kind":"user","methods":{"addPriceFeed(address,uint256)":{"notice":"Add a price feed source"},"freeze()":{"notice":"Freeze oracle (emergency)"},"getETHPriceInXAU()":{"notice":"Get ETH price in XAU"},"getLiquidationPrice(address)":{"notice":"Get liquidation price for a vault (with safety margin)"},"getPriceFeeds()":{"notice":"Get all price feeds"},"isFrozen()":{"notice":"Check if oracle is frozen"},"removePriceFeed(address)":{"notice":"Remove a price feed source"},"unfreeze()":{"notice":"Unfreeze oracle"},"updateFeedWeight(address,uint256)":{"notice":"Update feed weight"},"updatePrice()":{"notice":"Update price from aggregated feeds"}},"notice":"Multi-source oracle aggregator for ETH/XAU pricing with safety margins","version":1}},"settings":{"compilationTarget":{"contracts/vault/XAUOracle.sol":"XAUOracle"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/oracle/IAggregator.sol":{"keccak256":"0xcdbf107184805058e5725282eb6ade5778fe5ac5ac4cacc3d12438d2292e2951","license":"MIT","urls":["bzz-raw://552f85c4185c0c6273b28a9b5f5473154c0d490885e597dae305882d64377809","dweb:/ipfs/QmXMp3tKq42tUr1RoxhC81vfwQ7aYPFsGkpq5SHTpUmsnu"]},"contracts/vault/XAUOracle.sol":{"keccak256":"0x42795c4d7ee863ff31770b3efdee0c0fc3c382c8a226f8d5ed4f1f6646877315","license":"MIT","urls":["bzz-raw://97abff6e60d4d311ca6abdb549073099e360f480c6df6175ea062af9a343f449","dweb:/ipfs/QmUh9ZSwcQBijJ6Kdqcn6U39PkjEYZjQoNn1z5E2cxGtq1"]},"contracts/vault/interfaces/IXAUOracle.sol":{"keccak256":"0x9528a73e4bd18924061930989c3998a5be210e4f99a6faeeec2406b28dadc3d5","license":"MIT","urls":["bzz-raw://e678ef9becfd63bf5fcfb60176b4995263b2dc3ac01032af89e90378c4c6355a","dweb:/ipfs/QmRoFpA94eqZp5CvCysCFMRfjRuHdCzucYZcVYNnyfgrQS"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYdYdXxL4XdVVq55r9gdZLj1ZHRv53uDqrR9ESu4hsyU2/archive-info.json b/verification-sources/chain138-metadata-archive/QmYdYdXxL4XdVVq55r9gdZLj1ZHRv53uDqrR9ESu4hsyU2/archive-info.json new file mode 100644 index 0000000..ecb0752 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYdYdXxL4XdVVq55r9gdZLj1ZHRv53uDqrR9ESu4hsyU2/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYdYdXxL4XdVVq55r9gdZLj1ZHRv53uDqrR9ESu4hsyU2", + "metadata_digest": "98e8dea23a4b814a93b6916349b6f3e9e4e0f842b734dfbd812057673d575daf", + "source_path": "contracts/bridge/TwoWayTokenBridgeL1.sol", + "contract_name": "TwoWayTokenBridgeL1", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYdYdXxL4XdVVq55r9gdZLj1ZHRv53uDqrR9ESu4hsyU2/metadata.json b/verification-sources/chain138-metadata-archive/QmYdYdXxL4XdVVq55r9gdZLj1ZHRv53uDqrR9ESu4hsyU2/metadata.json new file mode 100644 index 0000000..6188c39 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYdYdXxL4XdVVq55r9gdZLj1ZHRv53uDqrR9ESu4hsyU2/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_feeToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"destChain","type":"uint64"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CcipSend","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"l2Bridge","type":"address"}],"name":"DestinationAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"DestinationRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"l2Bridge","type":"address"}],"name":"DestinationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Released","type":"event"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"l2Bridge","type":"address"}],"name":"addDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canonicalToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ccipRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"destinationChains","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destinations","outputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"l2Bridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDestinationChains","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destSelector","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockAndSend","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"removeDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"l2Bridge","type":"address"}],"name":"updateDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFee","type":"address"}],"name":"updateFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Uses escrow for locked tokens; release on inbound messages","kind":"dev","methods":{},"title":"TwoWayTokenBridgeL1","version":1},"userdoc":{"kind":"user","methods":{},"notice":"L1/LMain chain side: locks canonical tokens and triggers CCIP message to mint on L2","version":1}},"settings":{"compilationTarget":{"contracts/bridge/TwoWayTokenBridgeL1.sol":"TwoWayTokenBridgeL1"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/TwoWayTokenBridgeL1.sol":{"keccak256":"0x55a68a90791e1784c76012a83aa9cc113d0512f368bb25747664f85facc7d40b","license":"MIT","urls":["bzz-raw://c06c64a1df9993b3588bd748c0edb4d9c22d28ee3dc82d837a6a1126a07891c3","dweb:/ipfs/QmaHnptsbVfzm41QhFxBcHpJ94GpS9ckDDetimqFdey67P"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYevQ2zW6cALUDHmGT4KXi5gVvCspBFnQc5st38oqoQvZ/archive-info.json b/verification-sources/chain138-metadata-archive/QmYevQ2zW6cALUDHmGT4KXi5gVvCspBFnQc5st38oqoQvZ/archive-info.json new file mode 100644 index 0000000..d3be78d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYevQ2zW6cALUDHmGT4KXi5gVvCspBFnQc5st38oqoQvZ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYevQ2zW6cALUDHmGT4KXi5gVvCspBFnQc5st38oqoQvZ", + "metadata_digest": "9943101289980e5b4b289236d21ab098ac127beb4b67cb47fa6867a76de8a30e", + "source_path": "contracts/bridge/atomic/interfaces/IAtomicLiquidityVault.sol", + "contract_name": "IAtomicLiquidityVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYevQ2zW6cALUDHmGT4KXi5gVvCspBFnQc5st38oqoQvZ/metadata.json b/verification-sources/chain138-metadata-archive/QmYevQ2zW6cALUDHmGT4KXi5gVvCspBFnQc5st38oqoQvZ/metadata.json new file mode 100644 index 0000000..8be3445 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYevQ2zW6cALUDHmGT4KXi5gVvCspBFnQc5st38oqoQvZ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"}],"name":"freeLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"recipient","type":"address"}],"name":"fulfillReservedLiquidity","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fundCorridor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"}],"name":"getCorridorLiquidityState","outputs":[{"components":[{"internalType":"uint256","name":"totalLiquidity","type":"uint256"},{"internalType":"uint256","name":"reservedLiquidity","type":"uint256"},{"internalType":"uint256","name":"freeLiquidity","type":"uint256"},{"internalType":"uint256","name":"targetBuffer","type":"uint256"},{"internalType":"uint256","name":"settlementBacklog","type":"uint256"}],"internalType":"struct AtomicTypes.CorridorLiquidityState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"from","type":"address"}],"name":"reconcileSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"releaseReservation","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/interfaces/IAtomicLiquidityVault.sol":"IAtomicLiquidityVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/atomic/AtomicTypes.sol":{"keccak256":"0x85a1bdb93368582a1dea40790269ee2eda65047cd8812b88efdee02eebd343c1","license":"MIT","urls":["bzz-raw://ace009c17e8b2d13ef3be8d1116d772fd5e2c4cc3483e17c63915e8d9fa00fba","dweb:/ipfs/Qmayj5VSpYsqftkgYnmTQahKXaBK9tiAivjjMHvyYwZoRM"]},"contracts/bridge/atomic/interfaces/IAtomicLiquidityVault.sol":{"keccak256":"0x9925c6204834dd91ba469fde05c36b0506f9b62ea0d27c4ce1b43cc131cf0de2","license":"MIT","urls":["bzz-raw://28dc9ad6da6abf6db5850ef2528f81b679fdf0df40400a752cb84f6fdcce3df4","dweb:/ipfs/QmY5wVrfriGcXsRHw2HRcUNsFQoGY8AFHiVTYxuCWWD5nX"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYhEMqwHwbqYehBTKgTA9A4paUidU6xEeg3NhSZkcziZe/archive-info.json b/verification-sources/chain138-metadata-archive/QmYhEMqwHwbqYehBTKgTA9A4paUidU6xEeg3NhSZkcziZe/archive-info.json new file mode 100644 index 0000000..9b4f0e0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYhEMqwHwbqYehBTKgTA9A4paUidU6xEeg3NhSZkcziZe/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYhEMqwHwbqYehBTKgTA9A4paUidU6xEeg3NhSZkcziZe", + "metadata_digest": "99da88cbd4a4f2190915d5d89a2a0fd24cfadd8e32101f07a0b50c8ec05228a1", + "source_path": "contracts/tokens/MockLinkToken.sol", + "contract_name": "MockLinkToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYhEMqwHwbqYehBTKgTA9A4paUidU6xEeg3NhSZkcziZe/metadata.json b/verification-sources/chain138-metadata-archive/QmYhEMqwHwbqYehBTKgTA9A4paUidU6xEeg3NhSZkcziZe/metadata.json new file mode 100644 index 0000000..3ba7366 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYhEMqwHwbqYehBTKgTA9A4paUidU6xEeg3NhSZkcziZe/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Minimal ERC20 implementation for CCIP fee payments","kind":"dev","methods":{"approve(address,uint256)":{"params":{"amount":"Amount of tokens to approve","spender":"Address to approve"},"returns":{"success":"True if approval was successful"}},"mint(address,uint256)":{"params":{"amount":"Amount of tokens to mint","to":"Address to mint tokens to"}},"transfer(address,uint256)":{"params":{"amount":"Amount of tokens to transfer","to":"Address to transfer to"},"returns":{"success":"True if transfer was successful"}},"transferFrom(address,address,uint256)":{"params":{"amount":"Amount of tokens to transfer","from":"Address to transfer from","to":"Address to transfer to"},"returns":{"success":"True if transfer was successful"}}},"title":"Mock LINK Token","version":1},"userdoc":{"kind":"user","methods":{"approve(address,uint256)":{"notice":"Approve spender to spend tokens"},"mint(address,uint256)":{"notice":"Mint tokens to an address"},"transfer(address,uint256)":{"notice":"Transfer tokens"},"transferFrom(address,address,uint256)":{"notice":"Transfer tokens from one address to another"}},"notice":"Simple ERC20 token for testing and development","version":1}},"settings":{"compilationTarget":{"contracts/tokens/MockLinkToken.sol":"MockLinkToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/tokens/MockLinkToken.sol":{"keccak256":"0xbe13638a28260bd8cdeb773a68158f3bcf8059449dae23c3728314d347684433","license":"MIT","urls":["bzz-raw://19edf017fb86f65697cd09a379b7616c63acecb195a09088c4e740827315d96c","dweb:/ipfs/Qmcs4FTuDAPuZeow7FCQELYFrwvqLsEkdCy1nGeRds9u7Q"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYie3cntDAxE7Bp6bYSdnQ8uPSXTTw1tvH67qRdBNAUT7/archive-info.json b/verification-sources/chain138-metadata-archive/QmYie3cntDAxE7Bp6bYSdnQ8uPSXTTw1tvH67qRdBNAUT7/archive-info.json new file mode 100644 index 0000000..37cb90e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYie3cntDAxE7Bp6bYSdnQ8uPSXTTw1tvH67qRdBNAUT7/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYie3cntDAxE7Bp6bYSdnQ8uPSXTTw1tvH67qRdBNAUT7", + "metadata_digest": "9a36e590109c6edab75b8a594f74b51aa187d7e38c55c4377d39162323efcbae", + "source_path": "contracts/iso4217w/ComplianceGuard.sol", + "contract_name": "ComplianceGuard", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYie3cntDAxE7Bp6bYSdnQ8uPSXTTw1tvH67qRdBNAUT7/metadata.json b/verification-sources/chain138-metadata-archive/QmYie3cntDAxE7Bp6bYSdnQ8uPSXTTw1tvH67qRdBNAUT7/metadata.json new file mode 100644 index 0000000..d6d501f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYie3cntDAxE7Bp6bYSdnQ8uPSXTTw1tvH67qRdBNAUT7/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"bytes32","name":"checkType","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"name":"ComplianceCheckFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"bytes32","name":"checkType","type":"bytes32"}],"name":"ComplianceCheckPassed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"isISO4217Compliant","outputs":[{"internalType":"bool","name":"isISO4217","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserve","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"isReserveSufficient","outputs":[{"internalType":"bool","name":"isSufficient","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"currentSupply","type":"uint256"},{"internalType":"uint256","name":"verifiedReserve","type":"uint256"}],"name":"validateMint","outputs":[{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserve","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"validateMoneyMultiplier","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"violatesGRUIsolation","outputs":[{"internalType":"bool","name":"violatesIsolation","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"Hard constraints: m=1.0, GRU isolation, reserve constraints","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isISO4217Compliant(string)":{"params":{"currencyCode":"Currency code to validate"},"returns":{"isISO4217":"True if ISO-4217 compliant"}},"isReserveSufficient(uint256,uint256)":{"params":{"reserve":"Reserve balance","supply":"Token supply"},"returns":{"isSufficient":"True if reserve >= supply"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"validateMint(string,uint256,uint256,uint256)":{"params":{"amount":"Amount to mint","currencyCode":"ISO-4217 currency code","currentSupply":"Current token supply","verifiedReserve":"Verified reserve balance"},"returns":{"isValid":"True if mint is compliant","reasonCode":"Reason if not compliant"}},"validateMoneyMultiplier(uint256,uint256)":{"details":"Hard constraint: m = 1.0 (no fractional reserve)","params":{"reserve":"Reserve balance","supply":"Token supply"},"returns":{"isValid":"True if multiplier = 1.0"}},"violatesGRUIsolation(string)":{"params":{"currencyCode":"Currency code"},"returns":{"violatesIsolation":"True if GRU linkage detected"}}},"title":"ComplianceGuard","version":1},"userdoc":{"kind":"user","methods":{"isISO4217Compliant(string)":{"notice":"Check if currency is ISO-4217 compliant"},"isReserveSufficient(uint256,uint256)":{"notice":"Validate reserve sufficiency"},"validateMint(string,uint256,uint256,uint256)":{"notice":"Validate mint operation"},"validateMoneyMultiplier(uint256,uint256)":{"notice":"Validate that money multiplier = 1.0"},"violatesGRUIsolation(string)":{"notice":"Check if operation violates GRU isolation"}},"notice":"Enforces compliance rules for ISO-4217 W tokens","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/ComplianceGuard.sol":"ComplianceGuard"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/iso4217w/ComplianceGuard.sol":{"keccak256":"0x9d81d88d06c317a64b6d3de7b7d6df332c87dd2ad29d4f980157fbb1cf64808e","license":"MIT","urls":["bzz-raw://418c04b27cb494e52b7f39ad726d9b0302caf867600118ddb889366bb37dc18c","dweb:/ipfs/QmQuQRfkhseQexQHBHSucVKp2bvJnqPwRm4DEQYrgVXNTP"]},"contracts/iso4217w/interfaces/IComplianceGuard.sol":{"keccak256":"0x2f812514f56778c271667c97288de5d8c8b4c3745491a4e787abf4ff02dc74a6","license":"MIT","urls":["bzz-raw://97e6607a8262c270d90c9497df31259e7bb616e2e4d934a1c26c556b5e7e0f9e","dweb:/ipfs/Qmcsy2CjBZVh88yktxpRKawK1xrjMCQMqosPr78HxQWFzZ"]},"contracts/iso4217w/libraries/ISO4217WCompliance.sol":{"keccak256":"0xdfef8ded2a1d1fd8303a05b6846270a0bb882386c2da513260cc19a20c7a8b68","license":"MIT","urls":["bzz-raw://e1107bd7d443a2ef6995fbaceab0e4d06b6c36e72cf5f1b08e9fc64f8a4dc256","dweb:/ipfs/QmNter36BUWZnPHsLZWbQTeDdMiVKQNxWoBHLDoQ74B8JA"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYinGMqxnVU3h6xUM6fK15TkRU8jthDRzTKuYtE6jAqag/archive-info.json b/verification-sources/chain138-metadata-archive/QmYinGMqxnVU3h6xUM6fK15TkRU8jthDRzTKuYtE6jAqag/archive-info.json new file mode 100644 index 0000000..03edfc0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYinGMqxnVU3h6xUM6fK15TkRU8jthDRzTKuYtE6jAqag/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYinGMqxnVU3h6xUM6fK15TkRU8jthDRzTKuYtE6jAqag", + "metadata_digest": "9a4030d62b7443c844eff08543396218c19b470d15863ce383fcfb8ce8651249", + "source_path": "@openzeppelin/contracts/utils/Nonces.sol", + "contract_name": "Nonces", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYinGMqxnVU3h6xUM6fK15TkRU8jthDRzTKuYtE6jAqag/metadata.json b/verification-sources/chain138-metadata-archive/QmYinGMqxnVU3h6xUM6fK15TkRU8jthDRzTKuYtE6jAqag/metadata.json new file mode 100644 index 0000000..bce5f5f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYinGMqxnVU3h6xUM6fK15TkRU8jthDRzTKuYtE6jAqag/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidAccountNonce","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Provides tracking nonces for addresses. Nonces will only increment.","errors":{"InvalidAccountNonce(address,uint256)":[{"details":"The nonce used for an `account` is not the expected current nonce."}]},"kind":"dev","methods":{"nonces(address)":{"details":"Returns the next unused nonce for an address."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/Nonces.sol":"Nonces"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/Nonces.sol":{"keccak256":"0x0082767004fca261c332e9ad100868327a863a88ef724e844857128845ab350f","license":"MIT","urls":["bzz-raw://132dce9686a54e025eb5ba5d2e48208f847a1ec3e60a3e527766d7bf53fb7f9e","dweb:/ipfs/QmXn1a2nUZMpu2z6S88UoTfMVtY2YNh86iGrzJDYmMkKeZ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYjJZVmcT1wzJPVDxhoMwnT9So1EXz9VwB97549CHXYER/archive-info.json b/verification-sources/chain138-metadata-archive/QmYjJZVmcT1wzJPVDxhoMwnT9So1EXz9VwB97549CHXYER/archive-info.json new file mode 100644 index 0000000..3f089df --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYjJZVmcT1wzJPVDxhoMwnT9So1EXz9VwB97549CHXYER/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYjJZVmcT1wzJPVDxhoMwnT9So1EXz9VwB97549CHXYER", + "metadata_digest": "9a627229f969d0d7b8b251b625fb1b90d1438282dca561d307588f36d6b1ab76", + "source_path": "contracts/wrapped-lp-public/WLPReceiptToken.sol", + "contract_name": "WLPReceiptToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYjJZVmcT1wzJPVDxhoMwnT9So1EXz9VwB97549CHXYER/metadata.json b/verification-sources/chain138-metadata-archive/QmYjJZVmcT1wzJPVDxhoMwnT9So1EXz9VwB97549CHXYER/metadata.json new file mode 100644 index 0000000..9416336 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYjJZVmcT1wzJPVDxhoMwnT9So1EXz9VwB97549CHXYER/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Only addresses with MINTER_ROLE may mint; BURNER_ROLE for redemption gateway / bridge burn paths. Not a cW* token; separate from CompliantWrappedToken governance surface.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"name()":{"details":"Returns the name of the token."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"title":"WLPReceiptToken","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Fungible receipt token for Chain 138 LP exposure minted on a public chain (Option A).","version":1}},"settings":{"compilationTarget":{"contracts/wrapped-lp-public/WLPReceiptToken.sol":"WLPReceiptToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/wrapped-lp-public/WLPReceiptToken.sol":{"keccak256":"0x9d1879a7675e4ae33c7372f3a58209a27b407f2baf1bcf835c5228c084a2886f","license":"MIT","urls":["bzz-raw://15e061ae708ce3ac36b7fffb3f2816c75ea269ea221d931b123bd12758aa9875","dweb:/ipfs/QmUcs3JbYkq6C2pTKrqoWmCLF3KMkqyGeoMEuTFhKyy5XX"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYo15byrdfxLk9Wr418xbzVfY2HL7ppXavQu8JZ8yEgj9/archive-info.json b/verification-sources/chain138-metadata-archive/QmYo15byrdfxLk9Wr418xbzVfY2HL7ppXavQu8JZ8yEgj9/archive-info.json new file mode 100644 index 0000000..1e3eae8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYo15byrdfxLk9Wr418xbzVfY2HL7ppXavQu8JZ8yEgj9/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYo15byrdfxLk9Wr418xbzVfY2HL7ppXavQu8JZ8yEgj9", + "metadata_digest": "9b5500e2ac48724b75ae653a217a1be8bd5e1538add469deec86c80eee286e70", + "source_path": "@openzeppelin/contracts/utils/introspection/ERC165.sol", + "contract_name": "ERC165", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYo15byrdfxLk9Wr418xbzVfY2HL7ppXavQu8JZ8yEgj9/metadata.json b/verification-sources/chain138-metadata-archive/QmYo15byrdfxLk9Wr418xbzVfY2HL7ppXavQu8JZ8yEgj9/metadata.json new file mode 100644 index 0000000..9a21eb1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYo15byrdfxLk9Wr418xbzVfY2HL7ppXavQu8JZ8yEgj9/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Implementation of the {IERC165} interface. Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check for the additional interface id that will be supported. For example: ```solidity function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); } ```","kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/introspection/ERC165.sol":"ERC165"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYq1mT8vRMjpLfC5ok21WUaUWnJEg8RneXqEA1R9xJNvL/archive-info.json b/verification-sources/chain138-metadata-archive/QmYq1mT8vRMjpLfC5ok21WUaUWnJEg8RneXqEA1R9xJNvL/archive-info.json new file mode 100644 index 0000000..0e29a18 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYq1mT8vRMjpLfC5ok21WUaUWnJEg8RneXqEA1R9xJNvL/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYq1mT8vRMjpLfC5ok21WUaUWnJEg8RneXqEA1R9xJNvL", + "metadata_digest": "9bd8f1205b1655ab6252a7953f3a7ab22a0e29bae9530d21e51cb12b8fec6921", + "source_path": "contracts/tokens/CompliantFiatToken.sol", + "contract_name": "CompliantFiatToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYq1mT8vRMjpLfC5ok21WUaUWnJEg8RneXqEA1R9xJNvL/metadata.json b/verification-sources/chain138-metadata-archive/QmYq1mT8vRMjpLfC5ok21WUaUWnJEg8RneXqEA1R9xJNvL/metadata.json new file mode 100644 index 0000000..fb274be --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYq1mT8vRMjpLfC5ok21WUaUWnJEg8RneXqEA1R9xJNvL/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"string","name":"currencyCode_","type":"string"},{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"initialSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mechanism","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisputeResolutionMechanismSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"JurisdictionDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LegalNotice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"ValueTransferDeclared","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISPUTE_RESOLUTION_MECHANISM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_ARBITRATION_SUPPORT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_TRADE_TERMS_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_UNIFORM_RULES_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTRUMENT_CLASSIFICATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_20022_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_27001_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_3166_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_4217_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_8601_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_ENFORCEABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_FRAMEWORK_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_JURISDICTION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATORY_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_OF_PROCESS_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFERABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAVEL_RULE_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currencyCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"recordLegalNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Use for cEURC, cGBPC, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT, etc. Full ERC-20 for DEX liquidity pools; inherits LegallyCompliantBase. XAU (gold) invariant \u2014 enforced by policy and integrators, not by ERC-20 math: When `currencyCode()` is `\"XAU\"` (e.g. cXAUC, cXAUT), **one full token** means **exactly one troy ounce** of fine gold: balances and `mint`/`transfer` amounts use `10 ** decimals()` base units per troy ounce (with 6 decimals, `1_000_000` base = 1 oz). Fiat codes (USD, EUR, \u2026) use one full token as one unit of that currency at `decimals`.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"constructor":{"params":{"admin":"Compliance admin (DEFAULT_ADMIN_ROLE)","currencyCode_":"ISO-4217 code (e.g. \"EUR\")","decimals_":"Token decimals (e.g. 6)","initialOwner":"Owner address","initialSupply":"Initial supply to mint to deployer","name_":"Token name (e.g. \"Euro Coin (Compliant)\")","symbol_":"Token symbol (e.g. \"cEURC\")"}},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"name()":{"details":"Returns the name of the token."},"owner()":{"details":"Returns the address of the current owner."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"recordLegalNotice(string)":{"params":{"message":"The legal notice message"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"CompliantFiatToken","version":1},"userdoc":{"kind":"user","methods":{"constructor":{"notice":"Constructor"},"mint(address,uint256)":{"notice":"Mint (DBIS Rail: grant MINTER_ROLE only to DBIS_GRU_MintController; revoke from others)"},"recordLegalNotice(string)":{"notice":"Record a legal notice"}},"notice":"Generic ISO-4217 compliant fiat/commodity token (ERC-20, DEX-ready)","version":1}},"settings":{"compilationTarget":{"contracts/tokens/CompliantFiatToken.sol":"CompliantFiatToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/compliance/LegallyCompliantBase.sol":{"keccak256":"0x60b62492c7ad1f613a6070f38b3e6849d7a52d63dd68254bd95f96e733f74bb1","license":"MIT","urls":["bzz-raw://abcea0d6b1835eaccbd2b9eceaa1f04e3665fbdf3f2a61bcc52709e783a8ba51","dweb:/ipfs/Qmc8M9VQ2k2QP4UBXcjGfWQAojbmxNYUBVwNBfHSLFRorw"]},"contracts/tokens/CompliantFiatToken.sol":{"keccak256":"0x995bd80e0818370d2f16567eeede5edc1cc99b2a0b9b141e053567086869118f","license":"MIT","urls":["bzz-raw://f0cf3edd61318394f8432a06ae36969228345e8a841fc958ac84e806f962a60b","dweb:/ipfs/QmctzoSmfyusLX217FxWUbRytNLYqGjtYvLSGL58JY2s6K"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYr9V6GSQugD1zL7zW4rLiHTAmG4xzsgER4fSkpAAQcKt/archive-info.json b/verification-sources/chain138-metadata-archive/QmYr9V6GSQugD1zL7zW4rLiHTAmG4xzsgER4fSkpAAQcKt/archive-info.json new file mode 100644 index 0000000..2a39069 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYr9V6GSQugD1zL7zW4rLiHTAmG4xzsgER4fSkpAAQcKt/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYr9V6GSQugD1zL7zW4rLiHTAmG4xzsgER4fSkpAAQcKt", + "metadata_digest": "9c233fd8fc9f3764fab4329ef573597700d68b8b30b764b9cd26f951db789c3b", + "source_path": "contracts/liquidity/LiquidityManager.sol", + "contract_name": "LiquidityManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYr9V6GSQugD1zL7zW4rLiHTAmG4xzsgER4fSkpAAQcKt/metadata.json b/verification-sources/chain138-metadata-archive/QmYr9V6GSQugD1zL7zW4rLiHTAmG4xzsgER4fSkpAAQcKt/metadata.json new file mode 100644 index 0000000..bdbb879 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYr9V6GSQugD1zL7zW4rLiHTAmG4xzsgER4fSkpAAQcKt/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"uint256","name":"minAmountForPMM","type":"uint256"},{"internalType":"uint256","name":"maxSlippageBps","type":"uint256"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"bool","name":"autoCreate","type":"bool"},{"internalType":"bool","name":"enabled","type":"bool"}],"indexed":false,"internalType":"struct LiquidityManager.LiquidityConfig","name":"config","type":"tuple"}],"name":"AssetConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"provider","type":"address"}],"name":"LiquidityProvided","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"LiquidityReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityReserved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"priority","type":"uint256"}],"name":"ProviderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"}],"name":"ProviderRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"priority","type":"uint256"}],"name":"addProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assetConfigs","outputs":[{"internalType":"uint256","name":"minAmountForPMM","type":"uint256"},{"internalType":"uint256","name":"maxSlippageBps","type":"uint256"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"bool","name":"autoCreate","type":"bool"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"minAmountForPMM","type":"uint256"},{"internalType":"uint256","name":"maxSlippageBps","type":"uint256"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"bool","name":"autoCreate","type":"bool"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"configureAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getAssetConfig","outputs":[{"components":[{"internalType":"uint256","name":"minAmountForPMM","type":"uint256"},{"internalType":"uint256","name":"maxSlippageBps","type":"uint256"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"bool","name":"autoCreate","type":"bool"},{"internalType":"bool","name":"enabled","type":"bool"}],"internalType":"struct LiquidityManager.LiquidityConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getBestQuote","outputs":[{"internalType":"address","name":"bestProvider","type":"address"},{"internalType":"uint256","name":"bestAmountOut","type":"uint256"},{"internalType":"uint256","name":"bestSlippageBps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProviderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"getReservation","outputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"reservedAt","type":"uint256"},{"internalType":"bool","name":"released","type":"bool"}],"internalType":"struct LiquidityManager.LiquidityReservation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"strategyParams","type":"bytes"}],"name":"provideLiquidity","outputs":[{"internalType":"uint256","name":"liquidityProvided","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"providerInfo","outputs":[{"internalType":"address","name":"providerContract","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"priority","type":"uint256"},{"internalType":"uint256","name":"totalVolume","type":"uint256"},{"internalType":"uint256","name":"successfulSwaps","type":"uint256"},{"internalType":"uint256","name":"failedSwaps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"providers","outputs":[{"internalType":"contract ILiquidityProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"releaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"}],"name":"removeProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"reservations","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"reservedAt","type":"uint256"},{"internalType":"bool","name":"released","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"Implements per-asset configuration for PMM usage","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"title":"LiquidityManager","version":1},"userdoc":{"kind":"user","methods":{"addProvider(address,uint256)":{"notice":"Add liquidity provider"},"configureAsset(address,uint256,uint256,uint256,bool,bool)":{"notice":"Configure asset liquidity settings"},"getBestQuote(address,address,uint256)":{"notice":"Get best liquidity quote across all providers"},"provideLiquidity(address,uint256,bytes)":{"notice":"Provide liquidity for bridge operation"},"releaseLiquidity(bytes32)":{"notice":"Release reserved liquidity"},"removeProvider(address)":{"notice":"Remove liquidity provider"},"reserveLiquidity(bytes32,address,uint256)":{"notice":"Reserve liquidity for pending bridge"}},"notice":"Orchestrates liquidity across multiple sources (DODO, Uniswap, Curve)","version":1}},"settings":{"compilationTarget":{"contracts/liquidity/LiquidityManager.sol":"LiquidityManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/liquidity/LiquidityManager.sol":{"keccak256":"0x5f11e9edbf616b151de393ffe5f0a8e4e73f4ca80281c78a7dbb7bde56f94e0a","license":"MIT","urls":["bzz-raw://b2235d25aadfd4443e9506d64d7f940975979067f6d680b271d25c336515cdde","dweb:/ipfs/QmYPadU6rRfVgXfPrfDRPqsX8F4oxBwR3MyxSkhctgruXL"]},"contracts/liquidity/interfaces/ILiquidityProvider.sol":{"keccak256":"0xa10b0aef06554835dc192851d0b487bc32d822f73d95558a82f9d37a29071248","license":"MIT","urls":["bzz-raw://5d579daa420f9219b117b44969f43058fbf81979f08a85403dbac621d64955b2","dweb:/ipfs/QmeDFsbuqfnFoVVZQ1S5LMriqLfB8H7qgkCS51yzCydwot"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmYzbdiHXLYUQkkFWzBS9vmRDG6xRSbS4kmJqw6A3bdXKB/archive-info.json b/verification-sources/chain138-metadata-archive/QmYzbdiHXLYUQkkFWzBS9vmRDG6xRSbS4kmJqw6A3bdXKB/archive-info.json new file mode 100644 index 0000000..1dbcbfd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYzbdiHXLYUQkkFWzBS9vmRDG6xRSbS4kmJqw6A3bdXKB/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmYzbdiHXLYUQkkFWzBS9vmRDG6xRSbS4kmJqw6A3bdXKB", + "metadata_digest": "9e4d76552524be6ef2efacda740b6f8d548245b3866eeaa10b7c43c8c96d3a16", + "source_path": "contracts/flash/AaveQuotePushFlashReceiver.sol", + "contract_name": "AaveQuotePushFlashReceiver", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmYzbdiHXLYUQkkFWzBS9vmRDG6xRSbS4kmJqw6A3bdXKB/metadata.json b/verification-sources/chain138-metadata-archive/QmYzbdiHXLYUQkkFWzBS9vmRDG6xRSbS4kmJqw6A3bdXKB/metadata.json new file mode 100644 index 0000000..92557e3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmYzbdiHXLYUQkkFWzBS9vmRDG6xRSbS4kmJqw6A3bdXKB/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"pool_","type":"address"},{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadParams","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientToRepay","type":"error"},{"inputs":[],"name":"InvalidAtomicBridge","type":"error"},{"inputs":[],"name":"NothingToSweep","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UntrustedInitiator","type":"error"},{"inputs":[],"name":"UntrustedPool","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"coordinator","type":"address"},{"indexed":true,"internalType":"address","name":"destinationRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minDestinationAmount","type":"uint256"}],"name":"AtomicBridgeTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"borrowedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unwindOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"surplus","type":"uint256"}],"name":"QuotePushExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveRetained","type":"uint256"}],"name":"SurplusSwept","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenSwept","type":"event"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"premiums","type":"uint256[]"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"address","name":"integration","type":"address"},{"internalType":"address","name":"pmmPool","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"externalUnwinder","type":"address"},{"internalType":"uint256","name":"minOutPmm","type":"uint256"},{"internalType":"uint256","name":"minOutUnwind","type":"uint256"},{"internalType":"bytes","name":"unwindData","type":"bytes"},{"components":[{"internalType":"address","name":"coordinator","type":"address"},{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"destinationAsset","type":"address"},{"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"internalType":"uint256","name":"minDestinationAmount","type":"uint256"},{"internalType":"address","name":"destinationRecipient","type":"address"},{"internalType":"uint256","name":"destinationDeadline","type":"uint256"},{"internalType":"bytes32","name":"routeId","type":"bytes32"},{"internalType":"bytes32","name":"settlementMode","type":"bytes32"},{"internalType":"bool","name":"submitCommitment","type":"bool"}],"internalType":"struct AaveQuotePushFlashReceiver.AtomicBridgeParams","name":"atomicBridge","type":"tuple"}],"internalType":"struct AaveQuotePushFlashReceiver.QuotePushParams","name":"params","type":"tuple"}],"name":"flashQuotePush","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"reserveRetained","type":"uint256"}],"name":"quoteSurplusBalance","outputs":[{"internalType":"uint256","name":"surplus","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"reserveRetained","type":"uint256"}],"name":"sweepQuoteSurplus","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sweepToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"AaveQuotePushFlashReceiver","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Aave V3 flash-loan receiver for the quote-push workflow: flash borrow quote (`flashLoan` single-asset) -> buy PMM base -> unwind base externally -> repay lender, retaining any surplus.","version":1}},"settings":{"compilationTarget":{"contracts/flash/AaveQuotePushFlashReceiver.sol":"AaveQuotePushFlashReceiver"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/flash/AaveQuotePushFlashReceiver.sol":{"keccak256":"0x9648a35f371bb79c4782933d66237ee759ab4d546950bf79489c87091ff5d7e5","license":"MIT","urls":["bzz-raw://e4360e49daf3f2ac0a7f0299d0083479909f5ae30de80ad647b37421f4d871c8","dweb:/ipfs/QmVAkMWwMEJwFQ5ELSLJhhoxM6oSPUpkrjTzEZkMH5cdh7"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZ1RVDfXnVz4fRorhRLFQ9JBHFCKT8jzbFSmRUqv8v4yw/archive-info.json b/verification-sources/chain138-metadata-archive/QmZ1RVDfXnVz4fRorhRLFQ9JBHFCKT8jzbFSmRUqv8v4yw/archive-info.json new file mode 100644 index 0000000..ffb9f7b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZ1RVDfXnVz4fRorhRLFQ9JBHFCKT8jzbFSmRUqv8v4yw/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZ1RVDfXnVz4fRorhRLFQ9JBHFCKT8jzbFSmRUqv8v4yw", + "metadata_digest": "9e839207bf4cd92d91ed81f4e398c900a72be057e6fe410b145e7563ee6bffaa", + "source_path": "@openzeppelin/contracts/utils/Address.sol", + "contract_name": "Address", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZ1RVDfXnVz4fRorhRLFQ9JBHFCKT8jzbFSmRUqv8v4yw/metadata.json b/verification-sources/chain138-metadata-archive/QmZ1RVDfXnVz4fRorhRLFQ9JBHFCKT8jzbFSmRUqv8v4yw/metadata.json new file mode 100644 index 0000000..cb7585a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZ1RVDfXnVz4fRorhRLFQ9JBHFCKT8jzbFSmRUqv8v4yw/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"}],"devdoc":{"details":"Collection of functions related to the address type","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/Address.sol":"Address"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZ4Xhf3qAD514k9eNNx2csZTya6NXbRN2uqHzK7CezAPN/archive-info.json b/verification-sources/chain138-metadata-archive/QmZ4Xhf3qAD514k9eNNx2csZTya6NXbRN2uqHzK7CezAPN/archive-info.json new file mode 100644 index 0000000..21f33e0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZ4Xhf3qAD514k9eNNx2csZTya6NXbRN2uqHzK7CezAPN/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZ4Xhf3qAD514k9eNNx2csZTya6NXbRN2uqHzK7CezAPN", + "metadata_digest": "9f4f56ecc72182d172741effc1aecbbd06723fad1e0f3600797dca8868bbeaed", + "source_path": "contracts/ccip/CCIPSender.sol", + "contract_name": "CCIPSender", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZ4Xhf3qAD514k9eNNx2csZTya6NXbRN2uqHzK7CezAPN/metadata.json b/verification-sources/chain138-metadata-archive/QmZ4Xhf3qAD514k9eNNx2csZTya6NXbRN2uqHzK7CezAPN/metadata.json new file mode 100644 index 0000000..c66cf4b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZ4Xhf3qAD514k9eNNx2csZTya6NXbRN2uqHzK7CezAPN/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_ccipRouter","type":"address"},{"internalType":"address","name":"_oracleAggregator","type":"address"},{"internalType":"address","name":"_feeToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"DestinationAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"DestinationRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"DestinationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"MessageSent","type":"event"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiver","type":"address"}],"name":"addDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ccipRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"destinationChains","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destinations","outputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDestinationChains","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleAggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"removeDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"uint256","name":"answer","type":"uint256"},{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"sendOracleUpdate","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiver","type":"address"}],"name":"updateDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeToken","type":"address"}],"name":"updateFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAggregator","type":"address"}],"name":"updateOracleAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Sends oracle updates to other chains via CCIP","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"sendOracleUpdate(uint64,uint256,uint256,uint256)":{"details":"Implements full CCIP interface with fee payment"},"updateFeeToken(address)":{"details":"Allows zero address for native token fees (ETH)"}},"title":"CCIP Sender","version":1},"userdoc":{"kind":"user","methods":{"addDestination(uint64,address)":{"notice":"Add destination chain"},"calculateFee(uint64,bytes)":{"notice":"Calculate fee for sending oracle update"},"changeAdmin(address)":{"notice":"Change admin"},"getDestinationChains()":{"notice":"Get destination chains"},"removeDestination(uint64)":{"notice":"Remove destination chain"},"sendOracleUpdate(uint64,uint256,uint256,uint256)":{"notice":"Send oracle update to destination chain"},"updateDestination(uint64,address)":{"notice":"Update destination receiver"},"updateFeeToken(address)":{"notice":"Update fee token"},"updateOracleAggregator(address)":{"notice":"Update oracle aggregator"}},"notice":"Chainlink CCIP sender for cross-chain oracle data transmission","version":1}},"settings":{"compilationTarget":{"contracts/ccip/CCIPSender.sol":"CCIPSender"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/ccip/CCIPSender.sol":{"keccak256":"0xb12261f714ccb5361ca4ae3e4eb7b60ae0add3f6bb200803929014d7d17248f3","license":"MIT","urls":["bzz-raw://8689c0f3c575440e1cd9f3a0d3ee93438801cf9a2c97b8c378ff335024847361","dweb:/ipfs/QmcFEFHN6ypJN6zL6PySsjXAyLVxwmLamw1TcTTLqZ1wrF"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZ8tUof8BjkAE3qBAfcZeCjUgZQjDZjmo7ZgDXsquy6mp/archive-info.json b/verification-sources/chain138-metadata-archive/QmZ8tUof8BjkAE3qBAfcZeCjUgZQjDZjmo7ZgDXsquy6mp/archive-info.json new file mode 100644 index 0000000..4f78eae --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZ8tUof8BjkAE3qBAfcZeCjUgZQjDZjmo7ZgDXsquy6mp/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZ8tUof8BjkAE3qBAfcZeCjUgZQjDZjmo7ZgDXsquy6mp", + "metadata_digest": "a06d28329e05cd12dc769c694926399023829220bcb75fec4d442084b7641f5b", + "source_path": "@openzeppelin/contracts/interfaces/IERC4626.sol", + "contract_name": "IERC4626", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZ8tUof8BjkAE3qBAfcZeCjUgZQjDZjmo7ZgDXsquy6mp/metadata.json b/verification-sources/chain138-metadata-archive/QmZ8tUof8BjkAE3qBAfcZeCjUgZQjDZjmo7ZgDXsquy6mp/metadata.json new file mode 100644 index 0000000..7c30f99 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZ8tUof8BjkAE3qBAfcZeCjUgZQjDZjmo7ZgDXsquy6mp/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"assetTokenAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"maxAssets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"maxShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"maxShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"maxAssets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"totalManagedAssets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface of the ERC4626 \"Tokenized Vault Standard\", as defined in https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].","events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"asset()":{"details":"Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. - MUST be an ERC-20 token contract. - MUST NOT revert."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"convertToAssets(uint256)":{"details":"Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal scenario where all the conditions are met. - MUST NOT be inclusive of any fees that are charged against assets in the Vault. - MUST NOT show any variations depending on the caller. - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. - MUST NOT revert. NOTE: This calculation MAY NOT reflect the \u201cper-user\u201d price-per-share, and instead should reflect the \u201caverage-user\u2019s\u201d price-per-share, meaning what the average user should expect to see when exchanging to and from."},"convertToShares(uint256)":{"details":"Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal scenario where all the conditions are met. - MUST NOT be inclusive of any fees that are charged against assets in the Vault. - MUST NOT show any variations depending on the caller. - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. - MUST NOT revert. NOTE: This calculation MAY NOT reflect the \u201cper-user\u201d price-per-share, and instead should reflect the \u201caverage-user\u2019s\u201d price-per-share, meaning what the average user should expect to see when exchanging to and from."},"decimals()":{"details":"Returns the decimals places of the token."},"deposit(uint256,address)":{"details":"Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. - MUST emit the Deposit event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the deposit execution, and are accounted for during deposit. - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not approving enough underlying tokens to the Vault contract, etc). NOTE: most implementations will require pre-approval of the Vault with the Vault\u2019s underlying asset token."},"maxDeposit(address)":{"details":"Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, through a deposit call. - MUST return a limited value if receiver is subject to some deposit limit. - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. - MUST NOT revert."},"maxMint(address)":{"details":"Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. - MUST return a limited value if receiver is subject to some mint limit. - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. - MUST NOT revert."},"maxRedeem(address)":{"details":"Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, through a redeem call. - MUST return a limited value if owner is subject to some withdrawal limit or timelock. - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. - MUST NOT revert."},"maxWithdraw(address)":{"details":"Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the Vault, through a withdraw call. - MUST return a limited value if owner is subject to some withdrawal limit or timelock. - MUST NOT revert."},"mint(uint256,address)":{"details":"Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. - MUST emit the Deposit event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint execution, and are accounted for during mint. - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not approving enough underlying tokens to the Vault contract, etc). NOTE: most implementations will require pre-approval of the Vault with the Vault\u2019s underlying asset token."},"name()":{"details":"Returns the name of the token."},"previewDeposit(uint256)":{"details":"Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given current on-chain conditions. - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called in the same transaction. - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the deposit would be accepted, regardless if the user has enough tokens approved, etc. - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. - MUST NOT revert. NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in share price or some other type of condition, meaning the depositor will lose assets by depositing."},"previewMint(uint256)":{"details":"Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given current on-chain conditions. - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the same transaction. - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint would be accepted, regardless if the user has enough tokens approved, etc. - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. - MUST NOT revert. NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in share price or some other type of condition, meaning the depositor will lose assets by minting."},"previewRedeem(uint256)":{"details":"Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, given current on-chain conditions. - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the same transaction. - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the redemption would be accepted, regardless if the user has enough shares, etc. - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. - MUST NOT revert. NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in share price or some other type of condition, meaning the depositor will lose assets by redeeming."},"previewWithdraw(uint256)":{"details":"Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, given current on-chain conditions. - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if called in the same transaction. - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though the withdrawal would be accepted, regardless if the user has enough shares, etc. - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. - MUST NOT revert. NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in share price or some other type of condition, meaning the depositor will lose assets by depositing."},"redeem(uint256,address,address)":{"details":"Burns exactly shares from owner and sends assets of underlying tokens to receiver. - MUST emit the Withdraw event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the redeem execution, and are accounted for during redeem. - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner not having enough shares, etc). NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. Those methods should be performed separately."},"symbol()":{"details":"Returns the symbol of the token."},"totalAssets()":{"details":"Returns the total amount of the underlying asset that is \u201cmanaged\u201d by Vault. - SHOULD include any compounding that occurs from yield. - MUST be inclusive of any fees that are charged against assets in the Vault. - MUST NOT revert."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"withdraw(uint256,address,address)":{"details":"Burns shares from owner and sends exactly assets of underlying tokens to receiver. - MUST emit the Withdraw event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the withdraw execution, and are accounted for during withdraw. - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner not having enough shares, etc). Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. Those methods should be performed separately."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/interfaces/IERC4626.sol":"IERC4626"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC4626.sol":{"keccak256":"0x207f64371bc0fcc5be86713aa5da109a870cc3a6da50e93b64ee881e369b593d","license":"MIT","urls":["bzz-raw://548667cfa76683767c2c610b577f6c2f0675d0ce28f53c3f37b969c84a56b205","dweb:/ipfs/QmUzA1CKC6bDdULuS44wGd7PWBNLiHb6bh7oHwJBDZSLAx"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZAkpjYQpidzW57dmGyXi3wHJXqCpDgzJXBY6hNqdWGM6/archive-info.json b/verification-sources/chain138-metadata-archive/QmZAkpjYQpidzW57dmGyXi3wHJXqCpDgzJXBY6hNqdWGM6/archive-info.json new file mode 100644 index 0000000..03b5677 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZAkpjYQpidzW57dmGyXi3wHJXqCpDgzJXBY6hNqdWGM6/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZAkpjYQpidzW57dmGyXi3wHJXqCpDgzJXBY6hNqdWGM6", + "metadata_digest": "a0e7a959c60a6f91bd0a092321301f5f0978de67dd0e6816328d5d3f3d0fbeb1", + "source_path": "contracts/compliance/LegallyCompliantBase.sol", + "contract_name": "LegallyCompliantBase", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZAkpjYQpidzW57dmGyXi3wHJXqCpDgzJXBY6hNqdWGM6/metadata.json b/verification-sources/chain138-metadata-archive/QmZAkpjYQpidzW57dmGyXi3wHJXqCpDgzJXBY6hNqdWGM6/metadata.json new file mode 100644 index 0000000..40b1ebd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZAkpjYQpidzW57dmGyXi3wHJXqCpDgzJXBY6hNqdWGM6/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mechanism","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisputeResolutionMechanismSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"JurisdictionDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LegalNotice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"ValueTransferDeclared","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISPUTE_RESOLUTION_MECHANISM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_ARBITRATION_SUPPORT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_TRADE_TERMS_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_UNIFORM_RULES_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTRUMENT_CLASSIFICATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_20022_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_27001_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_3166_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_4217_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_8601_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_ENFORCEABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_FRAMEWORK_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_JURISDICTION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATORY_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_OF_PROCESS_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFERABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAVEL_RULE_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"recordLegalNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Provides legal framework declarations, ISO standards compliance, ICC compliance, and exemption declarations for Travel Rules and regulatory compliance","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"constructor":{"params":{"admin":"Address that will receive DEFAULT_ADMIN_ROLE"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"recordLegalNotice(string)":{"params":{"message":"The legal notice message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"LegallyCompliantBase","version":1},"userdoc":{"kind":"user","methods":{"constructor":{"notice":"Constructor"},"recordLegalNotice(string)":{"notice":"Record a legal notice"}},"notice":"Base contract for all legally compliant value transfer instruments","version":1}},"settings":{"compilationTarget":{"contracts/compliance/LegallyCompliantBase.sol":"LegallyCompliantBase"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/compliance/LegallyCompliantBase.sol":{"keccak256":"0x60b62492c7ad1f613a6070f38b3e6849d7a52d63dd68254bd95f96e733f74bb1","license":"MIT","urls":["bzz-raw://abcea0d6b1835eaccbd2b9eceaa1f04e3665fbdf3f2a61bcc52709e783a8ba51","dweb:/ipfs/Qmc8M9VQ2k2QP4UBXcjGfWQAojbmxNYUBVwNBfHSLFRorw"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZEAEV955u1tTMcZ6qLwcLqFFwmrYkZkkHcEH7eSMRFux/archive-info.json b/verification-sources/chain138-metadata-archive/QmZEAEV955u1tTMcZ6qLwcLqFFwmrYkZkkHcEH7eSMRFux/archive-info.json new file mode 100644 index 0000000..5b9ecdd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZEAEV955u1tTMcZ6qLwcLqFFwmrYkZkkHcEH7eSMRFux/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZEAEV955u1tTMcZ6qLwcLqFFwmrYkZkkHcEH7eSMRFux", + "metadata_digest": "a1c6df883e29de556a33dd0720b3557370d2cfed6a474d0c32ef896b0b99bdd7", + "source_path": "contracts/flash/MinimalERC3156FlashBorrower.sol", + "contract_name": "MinimalERC3156FlashBorrower", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZEAEV955u1tTMcZ6qLwcLqFFwmrYkZkkHcEH7eSMRFux/metadata.json b/verification-sources/chain138-metadata-archive/QmZEAEV955u1tTMcZ6qLwcLqFFwmrYkZkkHcEH7eSMRFux/metadata.json new file mode 100644 index 0000000..f131773 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZEAEV955u1tTMcZ6qLwcLqFFwmrYkZkkHcEH7eSMRFux/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"trustedLender_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"UntrustedLender","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onFlashLoan","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedLender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"MinimalERC3156FlashBorrower","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Repays vault via ERC-20 transfer in `onFlashLoan`. Pre-fund this contract with at least `flashFee` of the loan token before calling `flashLoan` (vault sends `amount` only before the callback).","version":1}},"settings":{"compilationTarget":{"contracts/flash/MinimalERC3156FlashBorrower.sol":"MinimalERC3156FlashBorrower"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":{"keccak256":"0x9f9e6dba43fe0775c400aa384375f1f503efaf733a40187169fdfc195f5ea6fa","license":"MIT","urls":["bzz-raw://ff5fe5fac5e4ecbf9fcd34c42b6d58d1af150263dfe07bc6785a59329dd1e475","dweb:/ipfs/QmX1EhNKKL6n6RFrLLAYh6Uf3itkozjSHyGFs9DqwW4Rzy"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"contracts/flash/MinimalERC3156FlashBorrower.sol":{"keccak256":"0x747d4b2ed5562d1b3199eef63699c0318cc81c2c0cec2ec03e754da713815865","license":"MIT","urls":["bzz-raw://55b924bfac5463968086db6ef5277c9d9f9be590925a77137cbd3cc090fb3763","dweb:/ipfs/QmR2PdUhRJ4aDeK4ZNvMxwAQrxpb8wNmgq31rQf86BpHBf"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZFqR9qaneuLCkuXzp5kiX5r1LRAHrZjbimAQEcWu5Wy3/archive-info.json b/verification-sources/chain138-metadata-archive/QmZFqR9qaneuLCkuXzp5kiX5r1LRAHrZjbimAQEcWu5Wy3/archive-info.json new file mode 100644 index 0000000..73b7c86 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZFqR9qaneuLCkuXzp5kiX5r1LRAHrZjbimAQEcWu5Wy3/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZFqR9qaneuLCkuXzp5kiX5r1LRAHrZjbimAQEcWu5Wy3", + "metadata_digest": "a234c266a10c60c8463c1dd5334fbf4f6e05ed33de6b9881b34df34015c0c906", + "source_path": "contracts/channels/IPaymentChannelManager.sol", + "contract_name": "IPaymentChannelManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZFqR9qaneuLCkuXzp5kiX5r1LRAHrZjbimAQEcWu5Wy3/metadata.json b/verification-sources/chain138-metadata-archive/QmZFqR9qaneuLCkuXzp5kiX5r1LRAHrZjbimAQEcWu5Wy3/metadata.json new file mode 100644 index 0000000..085fcc6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZFqR9qaneuLCkuXzp5kiX5r1LRAHrZjbimAQEcWu5Wy3/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDeadline","type":"uint256"}],"name":"ChallengeSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldWindow","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWindow","type":"uint256"}],"name":"ChallengeWindowUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceB","type":"uint256"},{"indexed":false,"internalType":"bool","name":"cooperative","type":"bool"}],"name":"ChannelClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":true,"internalType":"address","name":"participantA","type":"address"},{"indexed":true,"internalType":"address","name":"participantB","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositB","type":"uint256"}],"name":"ChannelOpened","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"challengeClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"closeChannelCooperative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"finalizeClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"fundChannel","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"getChannel","outputs":[{"components":[{"internalType":"address","name":"participantA","type":"address"},{"internalType":"address","name":"participantB","type":"address"},{"internalType":"uint256","name":"depositA","type":"uint256"},{"internalType":"uint256","name":"depositB","type":"uint256"},{"internalType":"enum IPaymentChannelManager.ChannelStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"disputeNonce","type":"uint256"},{"internalType":"uint256","name":"disputeBalanceA","type":"uint256"},{"internalType":"uint256","name":"disputeBalanceB","type":"uint256"},{"internalType":"uint256","name":"disputeDeadline","type":"uint256"}],"internalType":"struct IPaymentChannelManager.Channel","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChannelCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"participantA","type":"address"},{"internalType":"address","name":"participantB","type":"address"}],"name":"getChannelId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"participantB","type":"address"}],"name":"openChannel","outputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"submitClose","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"IPaymentChannelManager","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Interface for payment channel manager (open, update state, cooperative/unilateral close, challenge)","version":1}},"settings":{"compilationTarget":{"contracts/channels/IPaymentChannelManager.sol":"IPaymentChannelManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/channels/IPaymentChannelManager.sol":{"keccak256":"0x0f7b6d6682bac5b4f941060adc87afa223533a6b3b633894fb069c75c04ea1d3","license":"MIT","urls":["bzz-raw://40741c5dc4c05d1685bd5d9709f072e5f10f999a2d3ed7343d06761c845e9dd3","dweb:/ipfs/QmbrDfHCyrXUzAM9oKbWCymQEyHCbooqxikiwjw8T8QhAz"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZG5APNNuokRKGtZr6uXVSahc8RAPiWwkDhSz8L9cnoj6/archive-info.json b/verification-sources/chain138-metadata-archive/QmZG5APNNuokRKGtZr6uXVSahc8RAPiWwkDhSz8L9cnoj6/archive-info.json new file mode 100644 index 0000000..5def6b4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZG5APNNuokRKGtZr6uXVSahc8RAPiWwkDhSz8L9cnoj6/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZG5APNNuokRKGtZr6uXVSahc8RAPiWwkDhSz8L9cnoj6", + "metadata_digest": "a2444d2582d4b3eb2808df699e681528a963d9143379fa2660f66c65118fa879", + "source_path": "contracts/flash/SimpleERC3156FlashVault.sol", + "contract_name": "SimpleERC3156FlashVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZG5APNNuokRKGtZr6uXVSahc8RAPiWwkDhSz8L9cnoj6/metadata.json b/verification-sources/chain138-metadata-archive/QmZG5APNNuokRKGtZr6uXVSahc8RAPiWwkDhSz8L9cnoj6/metadata.json new file mode 100644 index 0000000..d8b4c50 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZG5APNNuokRKGtZr6uXVSahc8RAPiWwkDhSz8L9cnoj6/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"uint256","name":"initialFeeBps","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BorrowerNotApproved","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"FeeTooHigh","type":"error"},{"inputs":[],"name":"InvalidCallback","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"RepaymentFailed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnsupportedToken","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"inputs":[],"name":"ZeroRecipient","type":"error"},{"inputs":[],"name":"ZeroRescue","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BorrowerAllowlistEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"BorrowerApprovalUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeBps","type":"uint256"}],"name":"FeeBpsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"contract IERC3156FlashBorrower","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"FlashLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"supported","type":"bool"}],"name":"TokenSupportUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensRescued","type":"event"},{"inputs":[],"name":"MAX_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"}],"name":"approvedBorrower","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowerAllowlistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC3156FlashBorrower","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"maxFlashLoan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"previewFlashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBorrowerAllowlistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setBorrowerApproved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeeBps","type":"uint256"}],"name":"setFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"supported","type":"bool"}],"name":"setTokenSupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"supportedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"totalFeesCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Intended for Chain 138 / internal atomic workflows when no external flash source exists.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"flashFee(address,uint256)":{"details":"The fee to be charged for a given loan.","params":{"amount":"The amount of tokens lent.","token":"The loan currency."},"returns":{"_0":"The amount of `token` to be charged for the loan, on top of the returned principal."}},"flashLoan(address,address,uint256,bytes)":{"details":"Initiate a flash loan.","params":{"amount":"The amount of tokens lent.","data":"Arbitrary data structure, intended to contain user-defined parameters.","receiver":"The receiver of the tokens in the loan, and the receiver of the callback.","token":"The loan currency."}},"maxFlashLoan(address)":{"details":"The amount of currency available to be lended.","params":{"token":"The loan currency."},"returns":{"_0":"The amount of `token` that can be borrowed."}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"SimpleERC3156FlashVault","version":1},"userdoc":{"events":{"FlashLoan(address,address,address,uint256,uint256)":{"notice":"initiator = flashLoan caller; receiver = IERC3156FlashBorrower callback target."}},"kind":"user","methods":{"MAX_FEE_BPS()":{"notice":"Maximum owner-configurable fee (10%). Prevents griefing at 100% fee."},"borrowerAllowlistEnabled()":{"notice":"When true, only `approvedBorrower[receiver]` may be used as the flash callback contract."},"feeBps()":{"notice":"Fee on borrowed amount, basis points (10_000 = 100%)."},"previewFlashFee(address,uint256)":{"notice":"Operator alias for `flashFee` (same revert rules)."},"rescueTokens(address,uint256,address)":{"notice":"Owner-only recovery (mis-seeded asset, deprecated token, migration). Does not bypass flash invariants on active loans in the same tx."},"totalFeesCollected(address)":{"notice":"Cumulative fees retained by the vault per token (for ops / accounting)."}},"notice":"Minimal ERC-3156 flash lender: whitelist per token, flat bps fee, same-block repayment invariant.","version":1}},"settings":{"compilationTarget":{"contracts/flash/SimpleERC3156FlashVault.sol":"SimpleERC3156FlashVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":{"keccak256":"0x9f9e6dba43fe0775c400aa384375f1f503efaf733a40187169fdfc195f5ea6fa","license":"MIT","urls":["bzz-raw://ff5fe5fac5e4ecbf9fcd34c42b6d58d1af150263dfe07bc6785a59329dd1e475","dweb:/ipfs/QmX1EhNKKL6n6RFrLLAYh6Uf3itkozjSHyGFs9DqwW4Rzy"]},"@openzeppelin/contracts/interfaces/IERC3156FlashLender.sol":{"keccak256":"0x95d9eb59f21e885406d0e28b0510f9e1a0e7b4abe6636b5c966682927c65cfdd","license":"MIT","urls":["bzz-raw://a1cbff4d620ab51abe0c4ede9e4395bae53bcc3a7edd74e0eb08d7bdef155306","dweb:/ipfs/QmQcnBK28GDH4S5uXWqAcdRY1KcusXH4CxAqp87rYLir6n"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/flash/SimpleERC3156FlashVault.sol":{"keccak256":"0x463db8a7d3192f1032840783ef5bc16d9692ab64f6fa49c345d73db3ec93639e","license":"MIT","urls":["bzz-raw://67a3f30242d9a6dd07c417456b7bf86de3402ee2d775e71895f788979c1ffa7a","dweb:/ipfs/QmS8wQUWZtTMvRkeNu4i3GDo83yHjUMjvNQPUwZyYUbwEg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZHfsZWDHSRQi4UPq5amyKVTuHXgoiJAphKh6sDXVqKkc/archive-info.json b/verification-sources/chain138-metadata-archive/QmZHfsZWDHSRQi4UPq5amyKVTuHXgoiJAphKh6sDXVqKkc/archive-info.json new file mode 100644 index 0000000..5fbadd0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZHfsZWDHSRQi4UPq5amyKVTuHXgoiJAphKh6sDXVqKkc/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZHfsZWDHSRQi4UPq5amyKVTuHXgoiJAphKh6sDXVqKkc", + "metadata_digest": "a2ad20f7e0e682916e6a2ddcf04654152e79e5f2b932de104359283a10b97969", + "source_path": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol", + "contract_name": "AccessControlUpgradeable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZHfsZWDHSRQi4UPq5amyKVTuHXgoiJAphKh6sDXVqKkc/metadata.json b/verification-sources/chain138-metadata-archive/QmZHfsZWDHSRQi4UPq5amyKVTuHXgoiJAphKh6sDXVqKkc/metadata.json new file mode 100644 index 0000000..7966cae --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZHfsZWDHSRQi4UPq5amyKVTuHXgoiJAphKh6sDXVqKkc/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Contract module that allows children to implement role-based access control mechanisms. This is a lightweight version that doesn't allow enumerating role members except through off-chain means by accessing the contract event logs. Some applications may benefit from on-chain enumerability, for those cases see {AccessControlEnumerable}. Roles are referred to by their `bytes32` identifier. These should be exposed in the external API and be unique. The best way to achieve this is by using `public constant` hash digests: ```solidity bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\"); ``` Roles can be used to represent a set of permissions. To restrict access to a function call, use {hasRole}: ```solidity function foo() public { require(hasRole(MY_ROLE, msg.sender)); ... } ``` Roles can be granted and revoked dynamically via the {grantRole} and {revokeRole} functions. Each role has an associated admin role, and only accounts that have a role's admin role can call {grantRole} and {revokeRole}. By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means that only accounts with this role will be able to grant or revoke other roles. More complex role relationships can be created by using {_setRoleAdmin}. WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to grant and revoke this role. Extra precautions should be taken to secure accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} to enforce additional security measures for this role.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":"AccessControlUpgradeable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZJ9HLrNjhPghwFVN6pvwCsj1KnQQjG5yQfRdPUYzM1MF/archive-info.json b/verification-sources/chain138-metadata-archive/QmZJ9HLrNjhPghwFVN6pvwCsj1KnQQjG5yQfRdPUYzM1MF/archive-info.json new file mode 100644 index 0000000..67e7e76 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZJ9HLrNjhPghwFVN6pvwCsj1KnQQjG5yQfRdPUYzM1MF/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZJ9HLrNjhPghwFVN6pvwCsj1KnQQjG5yQfRdPUYzM1MF", + "metadata_digest": "a2cc1f145a594eda0e5a45847a2a447447ec42f6ab85870779e721c9a1a50a66", + "source_path": "@openzeppelin/contracts/utils/Context.sol", + "contract_name": "Context", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZJ9HLrNjhPghwFVN6pvwCsj1KnQQjG5yQfRdPUYzM1MF/metadata.json b/verification-sources/chain138-metadata-archive/QmZJ9HLrNjhPghwFVN6pvwCsj1KnQQjG5yQfRdPUYzM1MF/metadata.json new file mode 100644 index 0000000..f80ffa6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZJ9HLrNjhPghwFVN6pvwCsj1KnQQjG5yQfRdPUYzM1MF/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"details":"Provides information about the current execution context, including the sender of the transaction and its data. While these are generally available via msg.sender and msg.data, they should not be accessed in such a direct manner, since when dealing with meta-transactions the account sending and paying for execution may not be the actual sender (as far as an application is concerned). This contract is only required for intermediate, library-like contracts.","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/Context.sol":"Context"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZWnP4ittVcRcyQetiJ6NeexYu2CGXVA2ok5VXAgHEwQ4/archive-info.json b/verification-sources/chain138-metadata-archive/QmZWnP4ittVcRcyQetiJ6NeexYu2CGXVA2ok5VXAgHEwQ4/archive-info.json new file mode 100644 index 0000000..1ba9cf6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZWnP4ittVcRcyQetiJ6NeexYu2CGXVA2ok5VXAgHEwQ4/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZWnP4ittVcRcyQetiJ6NeexYu2CGXVA2ok5VXAgHEwQ4", + "metadata_digest": "a60909e7e4f0b97c710e6531335b03c0b51cab27862f3703505f3b1498aebe79", + "source_path": "contracts/iso4217w/controllers/BurnController.sol", + "contract_name": "BurnController", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZWnP4ittVcRcyQetiJ6NeexYu2CGXVA2ok5VXAgHEwQ4/metadata.json b/verification-sources/chain138-metadata-archive/QmZWnP4ittVcRcyQetiJ6NeexYu2CGXVA2ok5VXAgHEwQ4/metadata.json new file mode 100644 index 0000000..d535649 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZWnP4ittVcRcyQetiJ6NeexYu2CGXVA2ok5VXAgHEwQ4/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"redemptionId","type":"bytes32"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REDEEMER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"approveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"canRedeem","outputs":[{"internalType":"bool","name":"redeemable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redemptionId","type":"bytes32"}],"name":"getRedemption","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"redeemer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"processed","type":"bool"}],"internalType":"struct BurnController.Redemption","name":"redemption","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isApprovedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"bytes32","name":"redemptionId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"redemptions","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"redeemer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"processed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"revokeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Burn-before-release sequence for on-demand redemption at par","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"approveToken(address)":{"params":{"token":"Token address"}},"burn(address,address,uint256)":{"params":{"amount":"Amount to burn","from":"Source address","token":"Token address"}},"canRedeem(address,uint256)":{"params":{"amount":"Amount to redeem","token":"Token address"},"returns":{"redeemable":"True if redemption is allowed"}},"getRedemption(bytes32)":{"params":{"redemptionId":"Redemption ID"},"returns":{"redemption":"Redemption struct"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"redeem(address,address,uint256)":{"params":{"amount":"Amount to redeem (in token decimals)","from":"Redeemer address","token":"Token address"},"returns":{"redemptionId":"Redemption ID for tracking"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"revokeToken(address)":{"params":{"token":"Token address"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"BurnController","version":1},"userdoc":{"kind":"user","methods":{"approveToken(address)":{"notice":"Approve a token for burning/redemption"},"burn(address,address,uint256)":{"notice":"Burn tokens without redemption (emergency/transfer)"},"canRedeem(address,uint256)":{"notice":"Check if redemption is allowed"},"getRedemption(bytes32)":{"notice":"Get redemption information"},"redeem(address,address,uint256)":{"notice":"Redeem tokens (burn and release fiat)"},"revokeToken(address)":{"notice":"Revoke token approval"}},"notice":"Controls burning of ISO-4217 W tokens on redemption","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/controllers/BurnController.sol":"BurnController"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/iso4217w/controllers/BurnController.sol":{"keccak256":"0xb3b0e281dd7aa786244ccc9743850e0f2d435dc969830b65e26eff84691b12a7","license":"MIT","urls":["bzz-raw://4ff0a8b776e796197b7e9d245a60152947feed4cf271742182a300960807671f","dweb:/ipfs/QmW2uznXL5QbHDqZrUqhen9YMnwaSTVXBSYE7eYCEtgzqD"]},"contracts/iso4217w/interfaces/IBurnController.sol":{"keccak256":"0x7c6f7b3e0ff3c98e810f99158e599ca024906696ff5c0859054cd387d3dd2ce5","license":"MIT","urls":["bzz-raw://c3b9554ee7a2c2b8c30ddb263ccffe3d2eabebbbdf370643bb34831f6f53abd8","dweb:/ipfs/QmSnALVSFPn8wviNbNquY7HciW9etseM5A6QKsYu13N9rM"]},"contracts/iso4217w/interfaces/IISO4217WToken.sol":{"keccak256":"0xd583b83e8598f54e2f3cc5e8bf954441fa73e959a0b816522eb66528b248d412","license":"MIT","urls":["bzz-raw://103a3010d1805dc5e1bbda03ce9338e03aa0ca36a914677cd45ece3ec8868ae3","dweb:/ipfs/QmQDnC1kxKbtedmyjMN4W8oonbGQ4y6LARWWqn7jK4V8W9"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZXHoqNAH46jiV49EnZyaXg5cy9ML1Mn3ApqCzqjGDsxS/archive-info.json b/verification-sources/chain138-metadata-archive/QmZXHoqNAH46jiV49EnZyaXg5cy9ML1Mn3ApqCzqjGDsxS/archive-info.json new file mode 100644 index 0000000..f6c7ec4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZXHoqNAH46jiV49EnZyaXg5cy9ML1Mn3ApqCzqjGDsxS/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZXHoqNAH46jiV49EnZyaXg5cy9ML1Mn3ApqCzqjGDsxS", + "metadata_digest": "a62a4fde093f151c28afe1bd55e4dfaf1466a80eb5c7085e595163ed669af927", + "source_path": "contracts/vault/Ledger.sol", + "contract_name": "Ledger", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZXHoqNAH46jiV49EnZyaXg5cy9ML1Mn3ApqCzqjGDsxS/metadata.json b/verification-sources/chain138-metadata-archive/QmZXHoqNAH46jiV49EnZyaXg5cy9ML1Mn3ApqCzqjGDsxS/metadata.json new file mode 100644 index 0000000..9751e52 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZXHoqNAH46jiV49EnZyaXg5cy9ML1Mn3ApqCzqjGDsxS/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"xauOracle_","type":"address"},{"internalType":"address","name":"rateAccrual_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"int256","name":"delta","type":"int256"}],"name":"CollateralModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"int256","name":"delta","type":"int256"}],"name":"DebtModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"debtCeiling","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidationRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creditMultiplier","type":"uint256"}],"name":"RiskParametersSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARAM_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"canBorrow","outputs":[{"internalType":"bool","name":"borrowable","type":"bool"},{"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"creditMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"debt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"getVaultHealth","outputs":[{"internalType":"uint256","name":"healthRatio","type":"uint256"},{"internalType":"uint256","name":"collateralValue","type":"uint256"},{"internalType":"uint256","name":"debtValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"grantVaultRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRegisteredAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"liquidationRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"int256","name":"delta","type":"int256"}],"name":"modifyCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"int256","name":"delta","type":"int256"}],"name":"modifyDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rateAccrual","outputs":[{"internalType":"contract IRateAccrual","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rateAccumulator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rateAccrual_","type":"address"}],"name":"setRateAccrual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"debtCeiling_","type":"uint256"},{"internalType":"uint256","name":"liquidationRatio_","type":"uint256"},{"internalType":"uint256","name":"creditMultiplier_","type":"uint256"}],"name":"setRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"xauOracle_","type":"address"}],"name":"setXAUOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xauOracle","outputs":[{"internalType":"contract IXAUOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Single source of truth for all vault accounting COMPLIANCE NOTES: - All valuations are normalized to XAU (gold) as the universal unit of account - eMoney tokens are XAU-denominated (1 eMoney = 1 XAU equivalent) - GRU (Global Reserve Unit) is a NON-ISO 4217 synthetic unit of account, NOT legal tender - All currency conversions MUST go through XAU triangulation - ISO 4217 currency codes are validated where applicable","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"canBorrow(address,address,uint256)":{"params":{"amount":"Amount to borrow (in currency units)","currency":"Debt currency address","vault":"Vault address"},"returns":{"borrowable":"True if borrow is allowed","reasonCode":"Reason code if borrow is not allowed"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getVaultHealth(address)":{"params":{"vault":"Vault address"},"returns":{"collateralValue":"Total collateral value in XAU (18 decimals)","debtValue":"Total debt value in XAU (18 decimals)","healthRatio":"Collateralization ratio in basis points (10000 = 100%)"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"grantVaultRole(address)":{"params":{"account":"Address to grant role to"}},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"modifyCollateral(address,address,int256)":{"params":{"asset":"Collateral asset address","delta":"Amount to add (positive) or subtract (negative)","vault":"Vault address"}},"modifyDebt(address,address,int256)":{"params":{"currency":"Debt currency address (eMoney token)","delta":"Amount to add (positive) or subtract (negative)","vault":"Vault address"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setRateAccrual(address)":{"params":{"rateAccrual_":"New rate accrual address"}},"setRiskParameters(address,uint256,uint256,uint256)":{"params":{"asset":"Asset address","creditMultiplier_":"Credit multiplier in basis points","debtCeiling_":"Debt ceiling","liquidationRatio_":"Liquidation ratio in basis points"}},"setXAUOracle(address)":{"params":{"xauOracle_":"New oracle address"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"stateVariables":{"collateral":{"params":{"asset":"Collateral asset address","vault":"Vault address"},"return":"balance Collateral balance","returns":{"_0":"balance Collateral balance"}},"creditMultiplier":{"params":{"asset":"Asset address"},"return":"multiplier Credit multiplier in basis points (50000 = 5x)","returns":{"_0":"multiplier Credit multiplier in basis points (50000 = 5x)"}},"debt":{"params":{"currency":"Debt currency address","vault":"Vault address"},"return":"balance Debt balance","returns":{"_0":"balance Debt balance"}},"debtCeiling":{"params":{"asset":"Asset address"},"return":"ceiling Debt ceiling","returns":{"_0":"ceiling Debt ceiling"}},"liquidationRatio":{"params":{"asset":"Asset address"},"return":"ratio Liquidation ratio in basis points","returns":{"_0":"ratio Liquidation ratio in basis points"}},"rateAccumulator":{"params":{"asset":"Asset address"},"return":"accumulator Rate accumulator","returns":{"_0":"accumulator Rate accumulator"}}},"title":"Ledger","version":1},"userdoc":{"kind":"user","methods":{"canBorrow(address,address,uint256)":{"notice":"Check if a vault can borrow a specific amount"},"collateral(address,address)":{"notice":"Get collateral balance for a vault"},"creditMultiplier(address)":{"notice":"Get credit multiplier for an asset"},"debt(address,address)":{"notice":"Get debt balance for a vault"},"debtCeiling(address)":{"notice":"Get debt ceiling for an asset"},"getVaultHealth(address)":{"notice":"Get vault health (collateralization ratio in XAU)"},"grantVaultRole(address)":{"notice":"Grant VAULT_ROLE to an address (for factory use)"},"liquidationRatio(address)":{"notice":"Get liquidation ratio for an asset"},"modifyCollateral(address,address,int256)":{"notice":"Modify collateral balance for a vault"},"modifyDebt(address,address,int256)":{"notice":"Modify debt balance for a vault"},"rateAccumulator(address)":{"notice":"Get rate accumulator for an asset"},"setRateAccrual(address)":{"notice":"Set Rate Accrual address"},"setRiskParameters(address,uint256,uint256,uint256)":{"notice":"Set risk parameters for an asset"},"setXAUOracle(address)":{"notice":"Set XAU Oracle address"}},"notice":"Core ledger for tracking collateral and debt balances","version":1}},"settings":{"compilationTarget":{"contracts/vault/Ledger.sol":"Ledger"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/vault/Ledger.sol":{"keccak256":"0x514d5638dcda482aeeb5ee96341ea1468e638d52488d593b90a33681ce146fb7","license":"MIT","urls":["bzz-raw://39994a06af33b5be0a83e1607fb33be39e8d5d43ee886d2b219c357424204301","dweb:/ipfs/QmUPgDoShviAf8LTWX4H5M9jzaa5fxNMoy1F4piosgbym7"]},"contracts/vault/interfaces/ILedger.sol":{"keccak256":"0x3a8e8a2d48458202fffe065e691c1abeae50ccb8fc2af8971af7e94ae23d9273","license":"MIT","urls":["bzz-raw://6214e1b92f519cb100b315b2eb64b61e21479f75ebecd3a2e74524806347a5d4","dweb:/ipfs/QmRzswWJmFPa5BAy2npMN2WwrdmNd8pymySMHo1EdSZXED"]},"contracts/vault/interfaces/IRateAccrual.sol":{"keccak256":"0xbfb2212c538e553dafae6b942af93e4e8098bb43030d4af46d6d63b2882cc92b","license":"MIT","urls":["bzz-raw://078f67847c1c1d1abceae555aebf6403500eee2a366054cd32fd67da147c1b21","dweb:/ipfs/QmdxDLhAmpSyzxy7iVGGNfc2oHWkoo2WVjjBUtNBNtr18g"]},"contracts/vault/interfaces/IXAUOracle.sol":{"keccak256":"0x9528a73e4bd18924061930989c3998a5be210e4f99a6faeeec2406b28dadc3d5","license":"MIT","urls":["bzz-raw://e678ef9becfd63bf5fcfb60176b4995263b2dc3ac01032af89e90378c4c6355a","dweb:/ipfs/QmRoFpA94eqZp5CvCysCFMRfjRuHdCzucYZcVYNnyfgrQS"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZht3xa1sHURYBTRkCifUqDC4YkMS21YgZhhWbF3jtw4y/archive-info.json b/verification-sources/chain138-metadata-archive/QmZht3xa1sHURYBTRkCifUqDC4YkMS21YgZhhWbF3jtw4y/archive-info.json new file mode 100644 index 0000000..2149127 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZht3xa1sHURYBTRkCifUqDC4YkMS21YgZhhWbF3jtw4y/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZht3xa1sHURYBTRkCifUqDC4YkMS21YgZhhWbF3jtw4y", + "metadata_digest": "a8e0d6df51420fd312b46833c07f9ce433f2db5109a3c5d8f8461257b14965d6", + "source_path": "contracts/governance/MultiSig.sol", + "contract_name": "MultiSig", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZht3xa1sHURYBTRkCifUqDC4YkMS21YgZhhWbF3jtw4y/metadata.json b/verification-sources/chain138-metadata-archive/QmZht3xa1sHURYBTRkCifUqDC4YkMS21YgZhhWbF3jtw4y/metadata.json new file mode 100644 index 0000000..9b100de --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZht3xa1sHURYBTRkCifUqDC4YkMS21YgZhhWbF3jtw4y/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256","name":"_required","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Execution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"ExecutionFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"required","type":"uint256"}],"name":"RequirementChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Revocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Submission","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"addOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_required","type":"uint256"}],"name":"changeRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"confirmTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"confirmations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"executeTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getTransaction","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"requiredConfirmations","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"isConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"removeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"required","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"revokeConfirmation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"submitTransaction","outputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"confirmations","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"For production, consider using Gnosis Safe or similar battle-tested solution","errors":{"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"Multi-Signature Wallet","version":1},"userdoc":{"kind":"user","methods":{"addOwner(address)":{"notice":"Add a new owner"},"changeRequirement(uint256)":{"notice":"Change the number of required confirmations"},"confirmTransaction(uint256)":{"notice":"Confirm a transaction"},"constructor":{"notice":"Constructor sets initial owners and required confirmations"},"executeTransaction(uint256)":{"notice":"Execute a confirmed transaction"},"getOwners()":{"notice":"Get owners"},"getTransaction(uint256)":{"notice":"Get transaction details"},"getTransactionCount()":{"notice":"Get transaction count"},"isConfirmed(uint256)":{"notice":"Check if transaction is confirmed"},"removeOwner(address)":{"notice":"Remove an owner"},"revokeConfirmation(uint256)":{"notice":"Revoke a confirmation"},"submitTransaction(address,uint256,bytes)":{"notice":"Submit a transaction"}},"notice":"Simple multi-sig implementation for admin operations","version":1}},"settings":{"compilationTarget":{"contracts/governance/MultiSig.sol":"MultiSig"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/governance/MultiSig.sol":{"keccak256":"0xca473d640a2173d5e0f89206d0c8628020bc27ea8e822c9e831e54ff6c51fd15","license":"MIT","urls":["bzz-raw://1013b4a8eab4bcf5f58cd7c5982328190b0a7bd66864027b5ea6dd132d84bad4","dweb:/ipfs/QmNgSbwVxLwbExqSWkkoJd543nFGJekMEHbE17ZzzucFmZ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZiJo51P9PyKNZr5r2q14taqrmqRdfg7BQ2uiTkKJRCZc/archive-info.json b/verification-sources/chain138-metadata-archive/QmZiJo51P9PyKNZr5r2q14taqrmqRdfg7BQ2uiTkKJRCZc/archive-info.json new file mode 100644 index 0000000..d8df62c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZiJo51P9PyKNZr5r2q14taqrmqRdfg7BQ2uiTkKJRCZc/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZiJo51P9PyKNZr5r2q14taqrmqRdfg7BQ2uiTkKJRCZc", + "metadata_digest": "a8fcd111a5fe1313e7b48667c23ce794dee766cfa108b7a54646171180aaf9bf", + "source_path": "contracts/bridge/adapters/evm/XDCAdapter.sol", + "contract_name": "XDCAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZiJo51P9PyKNZr5r2q14taqrmqRdfg7BQ2uiTkKJRCZc/metadata.json b/verification-sources/chain138-metadata-archive/QmZiJo51P9PyKNZr5r2q14taqrmqRdfg7BQ2uiTkKJRCZc/metadata.json new file mode 100644 index 0000000..83225d3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZiJo51P9PyKNZr5r2q14taqrmqRdfg7BQ2uiTkKJRCZc/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"_bridge","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"xdcTxHash","type":"bytes32"}],"name":"XDCBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"xdcDestination","type":"string"}],"name":"XDCBridgeInitiated","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"XDC_APOTHEM_TESTNET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"XDC_MAINNET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"bytes32","name":"xdcTxHash","type":"bytes32"}],"name":"confirmBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ethAddr","type":"address"}],"name":"convertEthToXdc","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"xdcAddr","type":"string"}],"name":"convertXdcToEth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"universalBridge","outputs":[{"internalType":"contract UniversalCCIPBridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"XDC uses xdc prefix instead of 0x for addresses","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"XDCAdapter","version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"estimateFee(address,uint256,bytes)":{"notice":"Estimate bridge fee"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"}},"notice":"Bridge adapter for XDC Network (EVM-compatible with xdc address prefix)","version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/evm/XDCAdapter.sol":"XDCAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/UniversalCCIPBridge.sol":{"keccak256":"0xcdbe2bad1997db39d23990cc77a7e304ff228d4de878b0a897285e9eaf1f39ca","license":"MIT","urls":["bzz-raw://fe0c40c17b7869587ecacd0fe72f880a3e1e8a836d7f93650d52123bbc9efce2","dweb:/ipfs/QmXqoeHhNAJqJqA7NHw4WjpqWW8SXwVJ7TosQkTp74NiDY"]},"contracts/bridge/adapters/evm/XDCAdapter.sol":{"keccak256":"0xd265541536542c02ed70095165bd636b3b3ea7bc8c6603cf5fddd352086fe49f","license":"MIT","urls":["bzz-raw://fb19412de4218761b44903be6ad44b984b40e380c64bed526511eda3a5e3bbf7","dweb:/ipfs/Qmd15EU128d2ywQQQY9JNpsQorBxo7CB2z7TjZxAEQznVy"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZkDVdsebWqhWnkGNTjtQt3HkDdYfokWWH1Js9d7Zpvf8/archive-info.json b/verification-sources/chain138-metadata-archive/QmZkDVdsebWqhWnkGNTjtQt3HkDdYfokWWH1Js9d7Zpvf8/archive-info.json new file mode 100644 index 0000000..df40bad --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZkDVdsebWqhWnkGNTjtQt3HkDdYfokWWH1Js9d7Zpvf8/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZkDVdsebWqhWnkGNTjtQt3HkDdYfokWWH1Js9d7Zpvf8", + "metadata_digest": "a979fc235f9ea3543d35daac846ed0454e282c768dca7c9f0218f90925b0032f", + "source_path": "contracts/bridge/trustless/LiquidityPoolETH.sol", + "contract_name": "LiquidityPoolETH", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZkDVdsebWqhWnkGNTjtQt3HkDdYfokWWH1Js9d7Zpvf8/metadata.json b/verification-sources/chain138-metadata-archive/QmZkDVdsebWqhWnkGNTjtQt3HkDdYfokWWH1Js9d7Zpvf8/metadata.json new file mode 100644 index 0000000..64a5b9a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZkDVdsebWqhWnkGNTjtQt3HkDdYfokWWH1Js9d7Zpvf8/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"uint256","name":"_lpFeeBps","type":"uint256"},{"internalType":"uint256","name":"_minLiquidityRatioBps","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientLiquidity","type":"error"},{"inputs":[],"name":"InvalidAssetType","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnauthorizedRelease","type":"error"},{"inputs":[],"name":"WithdrawalBlockedByLiquidityRatio","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"FundsReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityProvided","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PendingClaimAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PendingClaimRemoved","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"}],"name":"addPendingClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"releaser","type":"address"}],"name":"authorizeRelease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedRelease","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"}],"name":"getAvailableLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"}],"name":"getLpShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"}],"name":"getPoolStats","outputs":[{"internalType":"uint256","name":"totalLiquidity","type":"uint256"},{"internalType":"uint256","name":"pendingClaims","type":"uint256"},{"internalType":"uint256","name":"availableLiquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWeth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLiquidityRatioBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum LiquidityPoolETH.AssetType","name":"","type":"uint8"}],"name":"pools","outputs":[{"internalType":"uint256","name":"totalLiquidity","type":"uint256"},{"internalType":"uint256","name":"pendingClaims","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"}],"name":"provideLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"}],"name":"releaseToRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"}],"name":"removePendingClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum LiquidityPoolETH.AssetType","name":"assetType","type":"uint8"}],"name":"withdrawLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Supports separate pools for native ETH and WETH (ERC-20)","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"addPendingClaim(uint256,uint8)":{"params":{"amount":"Amount of pending claim","assetType":"Type of asset"}},"authorizeRelease(address)":{"params":{"releaser":"Address authorized to release funds"}},"constructor":{"params":{"_lpFeeBps":"LP fee in basis points (5 = 0.05%)","_minLiquidityRatioBps":"Minimum liquidity ratio in basis points (11000 = 110%)","_weth":"WETH token address"}},"depositWETH(uint256)":{"params":{"amount":"Amount of WETH to deposit"}},"getAvailableLiquidity(uint8)":{"params":{"assetType":"Type of asset"},"returns":{"_0":"Available liquidity (total - pending claims)"}},"getLpShare(address,uint8)":{"params":{"assetType":"Type of asset","provider":"LP provider address"},"returns":{"_0":"LP share amount"}},"getPoolStats(uint8)":{"params":{"assetType":"Type of asset"},"returns":{"availableLiquidity":"Available liquidity (total - pending)","pendingClaims":"Total pending claims","totalLiquidity":"Total liquidity in pool"}},"provideLiquidity(uint8)":{"params":{"assetType":"Type of asset (ETH or WETH)"}},"releaseToRecipient(uint256,address,uint256,uint8)":{"params":{"amount":"Amount to release (before fees)","assetType":"Type of asset (ETH or WETH)","depositId":"Deposit ID (for event tracking)","recipient":"Recipient address"}},"removePendingClaim(uint256,uint8)":{"params":{"amount":"Amount of pending claim to remove","assetType":"Type of asset"}},"withdrawLiquidity(uint256,uint8)":{"params":{"amount":"Amount to withdraw","assetType":"Type of asset (ETH or WETH)"}}},"title":"LiquidityPoolETH","version":1},"userdoc":{"kind":"user","methods":{"addPendingClaim(uint256,uint8)":{"notice":"Add pending claim (called when claim is submitted)"},"authorizeRelease(address)":{"notice":"Authorize a contract to release funds (called during deployment)"},"constructor":{"notice":"Constructor"},"depositWETH(uint256)":{"notice":"Provide WETH liquidity to the pool"},"getAvailableLiquidity(uint8)":{"notice":"Get available liquidity for an asset type"},"getLpShare(address,uint8)":{"notice":"Get LP share for a provider"},"getPoolStats(uint8)":{"notice":"Get pool statistics"},"provideLiquidity(uint8)":{"notice":"Provide liquidity to the pool"},"releaseToRecipient(uint256,address,uint256,uint8)":{"notice":"Release funds to recipient (only authorized contracts)"},"removePendingClaim(uint256,uint8)":{"notice":"Remove pending claim (called when claim is challenged/slashed)"},"withdrawLiquidity(uint256,uint8)":{"notice":"Withdraw liquidity from the pool"}},"notice":"Liquidity pool for ETH and WETH with fee model and minimum liquidity ratio enforcement","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/LiquidityPoolETH.sol":"LiquidityPoolETH"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZm3L21FAiMtjrwC3rUgYRdzLUYXKHCCzWenrKoH9cMMD/archive-info.json b/verification-sources/chain138-metadata-archive/QmZm3L21FAiMtjrwC3rUgYRdzLUYXKHCCzWenrKoH9cMMD/archive-info.json new file mode 100644 index 0000000..926336f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZm3L21FAiMtjrwC3rUgYRdzLUYXKHCCzWenrKoH9cMMD/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZm3L21FAiMtjrwC3rUgYRdzLUYXKHCCzWenrKoH9cMMD", + "metadata_digest": "a9b01238b0a4eb3d6cf8181ecea1a5eceeff76a9a3e3041ff99df74c28888cdc", + "source_path": "contracts/bridge/atomic/AtomicLiquidityVault.sol", + "contract_name": "AtomicLiquidityVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZm3L21FAiMtjrwC3rUgYRdzLUYXKHCCzWenrKoH9cMMD/metadata.json b/verification-sources/chain138-metadata-archive/QmZm3L21FAiMtjrwC3rUgYRdzLUYXKHCCzWenrKoH9cMMD/metadata.json new file mode 100644 index 0000000..e879294 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZm3L21FAiMtjrwC3rUgYRdzLUYXKHCCzWenrKoH9cMMD/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientFreeLiquidity","type":"error"},{"inputs":[],"name":"ReservationAlreadyFulfilled","type":"error"},{"inputs":[],"name":"ReservationExists","type":"error"},{"inputs":[],"name":"ReservationMissing","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CorridorFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityReserved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReservationReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReservedLiquidityFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SettlementReconciled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"targetBuffer","type":"uint256"}],"name":"TargetBufferSet","type":"event"},{"inputs":[],"name":"BUFFER_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COORDINATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RECONCILER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"}],"name":"freeLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"recipient","type":"address"}],"name":"fulfillReservedLiquidity","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fundCorridor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"}],"name":"getCorridorLiquidityState","outputs":[{"components":[{"internalType":"uint256","name":"totalLiquidity","type":"uint256"},{"internalType":"uint256","name":"reservedLiquidity","type":"uint256"},{"internalType":"uint256","name":"freeLiquidity","type":"uint256"},{"internalType":"uint256","name":"targetBuffer","type":"uint256"},{"internalType":"uint256","name":"settlementBacklog","type":"uint256"}],"internalType":"struct AtomicTypes.CorridorLiquidityState","name":"state","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"from","type":"address"}],"name":"reconcileSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"releaseReservation","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"reservations","outputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"bool","name":"fulfilled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"targetBuffer","type":"uint256"}],"name":"setTargetBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/AtomicLiquidityVault.sol":"AtomicLiquidityVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/atomic/AtomicLiquidityVault.sol":{"keccak256":"0x62e687be604669a6a3341f929635f3cea60a8babc4d7f5224c3b15350e8fe49a","license":"MIT","urls":["bzz-raw://b7f13d7ab07c0b86499b51fc8209ad7618ce3a17038dd6d16031a5585d5be76b","dweb:/ipfs/QmRPgqLyydFL2TggoDae1zyxq622SyvQ7yTm7ne53VpCtR"]},"contracts/bridge/atomic/AtomicTypes.sol":{"keccak256":"0x85a1bdb93368582a1dea40790269ee2eda65047cd8812b88efdee02eebd343c1","license":"MIT","urls":["bzz-raw://ace009c17e8b2d13ef3be8d1116d772fd5e2c4cc3483e17c63915e8d9fa00fba","dweb:/ipfs/Qmayj5VSpYsqftkgYnmTQahKXaBK9tiAivjjMHvyYwZoRM"]},"contracts/bridge/atomic/interfaces/IAtomicLiquidityVault.sol":{"keccak256":"0x9925c6204834dd91ba469fde05c36b0506f9b62ea0d27c4ce1b43cc131cf0de2","license":"MIT","urls":["bzz-raw://28dc9ad6da6abf6db5850ef2528f81b679fdf0df40400a752cb84f6fdcce3df4","dweb:/ipfs/QmY5wVrfriGcXsRHw2HRcUNsFQoGY8AFHiVTYxuCWWD5nX"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZrz4rdng5zwn7WChRvxqTWkpzrNwkWBdJJYNecp4xzWm/archive-info.json b/verification-sources/chain138-metadata-archive/QmZrz4rdng5zwn7WChRvxqTWkpzrNwkWBdJJYNecp4xzWm/archive-info.json new file mode 100644 index 0000000..82b071b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZrz4rdng5zwn7WChRvxqTWkpzrNwkWBdJJYNecp4xzWm/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZrz4rdng5zwn7WChRvxqTWkpzrNwkWBdJJYNecp4xzWm", + "metadata_digest": "ab35de4c149cb4995761fd10a8079b545bc7d6c8f67d0d161ebb3f59dbf8382a", + "source_path": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol", + "contract_name": "ECDSA", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZrz4rdng5zwn7WChRvxqTWkpzrNwkWBdJJYNecp4xzWm/metadata.json b/verification-sources/chain138-metadata-archive/QmZrz4rdng5zwn7WChRvxqTWkpzrNwkWBdJJYNecp4xzWm/metadata.json new file mode 100644 index 0000000..2c16180 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZrz4rdng5zwn7WChRvxqTWkpzrNwkWBdJJYNecp4xzWm/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"}],"devdoc":{"details":"Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.","errors":{"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":"ECDSA"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZsRr2mc5dJrmqP5MJz18wSWLGEc81UsoXcbEu2LduJmr/archive-info.json b/verification-sources/chain138-metadata-archive/QmZsRr2mc5dJrmqP5MJz18wSWLGEc81UsoXcbEu2LduJmr/archive-info.json new file mode 100644 index 0000000..f40e758 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZsRr2mc5dJrmqP5MJz18wSWLGEc81UsoXcbEu2LduJmr/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZsRr2mc5dJrmqP5MJz18wSWLGEc81UsoXcbEu2LduJmr", + "metadata_digest": "ab530440e22de026d224ab32a39f59ef4291ccbffafa41eaf4897c31db56300d", + "source_path": "contracts/bridge/atomic/AtomicQuoteEngine.sol", + "contract_name": "AtomicQuoteEngine", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZsRr2mc5dJrmqP5MJz18wSWLGEc81UsoXcbEu2LduJmr/metadata.json b/verification-sources/chain138-metadata-archive/QmZsRr2mc5dJrmqP5MJz18wSWLGEc81UsoXcbEu2LduJmr/metadata.json new file mode 100644 index 0000000..f2b83ea --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZsRr2mc5dJrmqP5MJz18wSWLGEc81UsoXcbEu2LduJmr/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"coordinator_","type":"address"},{"internalType":"address","name":"vault_","type":"address"},{"internalType":"address","name":"fulfillerRegistry_","type":"address"},{"internalType":"address","name":"feePolicy_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"coordinator","outputs":[{"internalType":"contract IAtomicBridgeCoordinator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePolicy","outputs":[{"internalType":"contract AtomicFeePolicy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fulfillerRegistry","outputs":[{"internalType":"contract IAtomicFulfillerRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"fulfiller","type":"address"}],"name":"quote","outputs":[{"components":[{"internalType":"enum AtomicTypes.RouteClass","name":"routeClass","type":"uint8"},{"internalType":"uint256","name":"availableLiquidity","type":"uint256"},{"internalType":"uint256","name":"freeLiquidity","type":"uint256"},{"internalType":"uint256","name":"fulfillerFee","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"uint256","name":"requiredBond","type":"uint256"},{"internalType":"uint256","name":"settlementBacklog","type":"uint256"},{"internalType":"uint256","name":"deadlineWindow","type":"uint256"},{"internalType":"bool","name":"corridorEnabled","type":"bool"},{"internalType":"bool","name":"corridorDegraded","type":"bool"},{"internalType":"bool","name":"fulfillerAuthorized","type":"bool"},{"internalType":"bool","name":"fulfillerBondSufficient","type":"bool"}],"internalType":"struct AtomicTypes.AtomicQuote","name":"q","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IAtomicLiquidityVault","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/AtomicQuoteEngine.sol":"AtomicQuoteEngine"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/atomic/AtomicFeePolicy.sol":{"keccak256":"0xfe8256cd10ae6129f7cd0919a85f81055a129a974052ea5e9015534bc3c23069","license":"MIT","urls":["bzz-raw://f3f08ef8182b2ac2b9ebf6c5f1289214da84a918c79911f65c3bb43448c7a958","dweb:/ipfs/QmesykVxZqsK3E952iVLhhA6zHvfLchcJtftZ7dcstJYA5"]},"contracts/bridge/atomic/AtomicQuoteEngine.sol":{"keccak256":"0x9f7a700631d9f9121836317e850b029548fbe26eab646cb1fcb44388f3d2a74f","license":"MIT","urls":["bzz-raw://f2f74490d5187b5cac8605b87cbcafec9c80869d1c8b5712f15d53b1d96e6922","dweb:/ipfs/QmNkMjbdwb9B9DTAokVUr3J98YsXQsUhjVmc5vPEY2RZMs"]},"contracts/bridge/atomic/AtomicTypes.sol":{"keccak256":"0x85a1bdb93368582a1dea40790269ee2eda65047cd8812b88efdee02eebd343c1","license":"MIT","urls":["bzz-raw://ace009c17e8b2d13ef3be8d1116d772fd5e2c4cc3483e17c63915e8d9fa00fba","dweb:/ipfs/Qmayj5VSpYsqftkgYnmTQahKXaBK9tiAivjjMHvyYwZoRM"]},"contracts/bridge/atomic/interfaces/IAtomicBridgeCoordinator.sol":{"keccak256":"0xc46f27fc9863b9cc75578f9e73ad83fff40b072af5113ecb791173c71f0dd52b","license":"MIT","urls":["bzz-raw://a7ab01dc396a4f37fc9feb172b849ba54a27ff84aa3d8a821e440f732be72aee","dweb:/ipfs/Qmcppu22yE9EMUJzH9hfXbpyjZRzTyHEs7RaWpahF4mnbB"]},"contracts/bridge/atomic/interfaces/IAtomicFulfillerRegistry.sol":{"keccak256":"0xdd5c9766af720fb2b40a8e5232b818004999ab640e0420fd4cfd6198fdc9bf56","license":"MIT","urls":["bzz-raw://20a172cfc8b4a54f94bd889d464a84530467ab11085748437158368d931d828d","dweb:/ipfs/QmUKBHadjvVmiSc3cxBcMCg8496hpqFS1gEi4vhQJvj7R7"]},"contracts/bridge/atomic/interfaces/IAtomicLiquidityVault.sol":{"keccak256":"0x9925c6204834dd91ba469fde05c36b0506f9b62ea0d27c4ce1b43cc131cf0de2","license":"MIT","urls":["bzz-raw://28dc9ad6da6abf6db5850ef2528f81b679fdf0df40400a752cb84f6fdcce3df4","dweb:/ipfs/QmY5wVrfriGcXsRHw2HRcUNsFQoGY8AFHiVTYxuCWWD5nX"]},"contracts/bridge/atomic/interfaces/IAtomicQuoteEngine.sol":{"keccak256":"0x60b57a6dfe09f280080ed21df346777a6de582cc9cac10a5bf67fe37318cca40","license":"MIT","urls":["bzz-raw://d2977c2294a2ba99120803456ea31347915b5295bbec445dd6b482979436bfd0","dweb:/ipfs/QmTxP19wPEF2RqhECU7TFCjzHt27gGXqkK4WY5zHwMRMFi"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmZtVCcUoMP2TbTAW3w8RWYaonNqR165vZLTD5yEfV6Yqv/archive-info.json b/verification-sources/chain138-metadata-archive/QmZtVCcUoMP2TbTAW3w8RWYaonNqR165vZLTD5yEfV6Yqv/archive-info.json new file mode 100644 index 0000000..5f109dd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZtVCcUoMP2TbTAW3w8RWYaonNqR165vZLTD5yEfV6Yqv/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmZtVCcUoMP2TbTAW3w8RWYaonNqR165vZLTD5yEfV6Yqv", + "metadata_digest": "ab986409118d5a132231b2414c6536a3eac4ca327f7cba6108706964920721f9", + "source_path": "contracts/bridge/integration/CWReserveVerifier.sol", + "contract_name": "ICWMultiTokenBridgeL1Accounting", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmZtVCcUoMP2TbTAW3w8RWYaonNqR165vZLTD5yEfV6Yqv/metadata.json b/verification-sources/chain138-metadata-archive/QmZtVCcUoMP2TbTAW3w8RWYaonNqR165vZLTD5yEfV6Yqv/metadata.json new file mode 100644 index 0000000..bb10889 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmZtVCcUoMP2TbTAW3w8RWYaonNqR165vZLTD5yEfV6Yqv/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"lockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"}],"name":"maxOutstanding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"}],"name":"outstandingMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"supportedCanonicalToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"totalOutstanding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/CWReserveVerifier.sol":"ICWMultiTokenBridgeL1Accounting"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/CWReserveVerifier.sol":{"keccak256":"0xb0fb3977b950390981f5b4e884042a1817f777f09ae626eaa9cbbc617e190dd1","license":"MIT","urls":["bzz-raw://0512dbc999a0683944d1b9a51b2e96a490fc4e7f6d6abca35050717aa979829c","dweb:/ipfs/QmR1WwkrRRBzFuHq4hWVzHZgBkjs3usumrBjg9BYnMwskR"]},"contracts/bridge/integration/ICWReserveVerifier.sol":{"keccak256":"0x4fc7b6b8f10d5ec64517fc31559a2b7ac52c7496a7effaac7d29fbfc64f44528","license":"MIT","urls":["bzz-raw://7ef5196aefc98a7d6b295118500062ec62c05d786e3f9ad1ae8414d48279605d","dweb:/ipfs/QmU6cE1rZA99DygbUECyCoQwc5t2g1aJrcs3BiZ4SPoksa"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qma16Rt2tseAvHLsia2YdfTHK1it1yAzycGexrsWpTg7hr/archive-info.json b/verification-sources/chain138-metadata-archive/Qma16Rt2tseAvHLsia2YdfTHK1it1yAzycGexrsWpTg7hr/archive-info.json new file mode 100644 index 0000000..187d2dd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma16Rt2tseAvHLsia2YdfTHK1it1yAzycGexrsWpTg7hr/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qma16Rt2tseAvHLsia2YdfTHK1it1yAzycGexrsWpTg7hr", + "metadata_digest": "ad49b57ad1f424eb9a6d92a4fa0673bf9d7f37df99b30eb14c2559ba667e8571", + "source_path": "contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol", + "contract_name": "Chain138PilotOneInchAggregationRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qma16Rt2tseAvHLsia2YdfTHK1it1yAzycGexrsWpTg7hr/metadata.json b/verification-sources/chain138-metadata-archive/Qma16Rt2tseAvHLsia2YdfTHK1it1yAzycGexrsWpTg7hr/metadata.json new file mode 100644 index 0000000..41f67b0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma16Rt2tseAvHLsia2YdfTHK1it1yAzycGexrsWpTg7hr/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"RouteFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeBps","type":"uint256"}],"name":"RouteSeeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"Swapped","type":"event"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"name":"fundRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getRouteReserves","outputs":[{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"feeBps","type":"uint256"}],"name":"seedRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct IAggregationRouter.SwapDescription","name":"desc","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"spentAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":"Chain138PilotOneInchAggregationRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":{"keccak256":"0x679c5ae8c6afb2de2dd20a67ea44b52fc119eff657a797f66b3c9822dded9dcf","license":"MIT","urls":["bzz-raw://927fc1104662d51150305ce34d60ff0856f22de1dc508eff188106970342f2f6","dweb:/ipfs/QmQZCZ5vF91AyGEToPuKvvdzLfkxWgrMQ3P2BAA4FzanoF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qma1hLDSJxjAFHWbuarSVj5nbZyeYNTS2jvGYsuqU3Ty3h/archive-info.json b/verification-sources/chain138-metadata-archive/Qma1hLDSJxjAFHWbuarSVj5nbZyeYNTS2jvGYsuqU3Ty3h/archive-info.json new file mode 100644 index 0000000..476b7ed --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma1hLDSJxjAFHWbuarSVj5nbZyeYNTS2jvGYsuqU3Ty3h/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qma1hLDSJxjAFHWbuarSVj5nbZyeYNTS2jvGYsuqU3Ty3h", + "metadata_digest": "ad712c4f3d9ac6121aab472ed9ec6a94f809db289242a14c87b6f3ce0054b48c", + "source_path": "contracts/bridge/adapters/hyperledger/CactiAdapter.sol", + "contract_name": "CactiAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qma1hLDSJxjAFHWbuarSVj5nbZyeYNTS2jvGYsuqU3Ty3h/metadata.json b/verification-sources/chain138-metadata-archive/Qma1hLDSJxjAFHWbuarSVj5nbZyeYNTS2jvGYsuqU3Ty3h/metadata.json new file mode 100644 index 0000000..c0a5460 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma1hLDSJxjAFHWbuarSVj5nbZyeYNTS2jvGYsuqU3Ty3h/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"string","name":"_cactiApiUrl","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"string","name":"cactiTxId","type":"string"},{"indexed":false,"internalType":"string","name":"sourceLedger","type":"string"},{"indexed":false,"internalType":"string","name":"destLedger","type":"string"}],"name":"CactiBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"sourceLedger","type":"string"},{"indexed":false,"internalType":"string","name":"destLedger","type":"string"},{"indexed":false,"internalType":"string","name":"cactiTxId","type":"string"}],"name":"CactiBridgeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CACTI_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cactiApiUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cactiTxIds","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"string","name":"cactiTxId","type":"string"},{"internalType":"string","name":"sourceLedger","type":"string"},{"internalType":"string","name":"destLedger","type":"string"}],"name":"confirmCactiOperation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"estimateFee(address,uint256,bytes)":{"notice":"Estimate bridge fee"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"}},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/hyperledger/CactiAdapter.sol":"CactiAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/adapters/hyperledger/CactiAdapter.sol":{"keccak256":"0x5d62ce902f595b083c5d0fa11dc5676e9dee55df3e795770ea46175f510330db","license":"MIT","urls":["bzz-raw://37a14007a8717a0cd26940101f227b2f8c717b54b35ec4dba5a0cd73cc0315a4","dweb:/ipfs/QmXxr4EnB66gdRPSHFdrj7WoQWFuVvuBozeoh8WVGVsFtH"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qma5egPmxQbD11ngGLsnpWYf5odwPZbnZZ4TRw4hgXpb4c/archive-info.json b/verification-sources/chain138-metadata-archive/Qma5egPmxQbD11ngGLsnpWYf5odwPZbnZZ4TRw4hgXpb4c/archive-info.json new file mode 100644 index 0000000..ce328d5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma5egPmxQbD11ngGLsnpWYf5odwPZbnZZ4TRw4hgXpb4c/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qma5egPmxQbD11ngGLsnpWYf5odwPZbnZZ4TRw4hgXpb4c", + "metadata_digest": "ae747f618ff9c4eb85c64a62cea8caca5ac556a3f53fe62e2edfa0f82220dfb1", + "source_path": "contracts/emoney/TokenFactory138.sol", + "contract_name": "TokenFactory138", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qma5egPmxQbD11ngGLsnpWYf5odwPZbnZZ4TRw4hgXpb4c/metadata.json b/verification-sources/chain138-metadata-archive/Qma5egPmxQbD11ngGLsnpWYf5odwPZbnZZ4TRw4hgXpb4c/metadata.json new file mode 100644 index 0000000..3e7c8fc --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma5egPmxQbD11ngGLsnpWYf5odwPZbnZZ4TRw4hgXpb4c/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"TokenFactory138","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Stub for build; full implementation when emoney module is restored","version":1}},"settings":{"compilationTarget":{"contracts/emoney/TokenFactory138.sol":"TokenFactory138"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/TokenFactory138.sol":{"keccak256":"0xa4ae210bf5c4f221c9617bbb1433a6ba3909c55bd7990207532dad79be318170","license":"MIT","urls":["bzz-raw://892291dddc72a9d7c90f8873b6d56307b3d7a5ea13681583b80b1ece3fbb3c54","dweb:/ipfs/QmTeoXruNhva5vbfY4PWHocGKS547qm3P9f6YhUcGXEEcr"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qma5m6eDZbM1RJqpQRcRPqsiszLPZwpGusHRDV55C5soFZ/archive-info.json b/verification-sources/chain138-metadata-archive/Qma5m6eDZbM1RJqpQRcRPqsiszLPZwpGusHRDV55C5soFZ/archive-info.json new file mode 100644 index 0000000..19708d7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma5m6eDZbM1RJqpQRcRPqsiszLPZwpGusHRDV55C5soFZ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qma5m6eDZbM1RJqpQRcRPqsiszLPZwpGusHRDV55C5soFZ", + "metadata_digest": "ae7bc1293c9f538f55648ff7c955b6698e54c6d5fd27ccc78234ca9f44e494b4", + "source_path": "contracts/bridge/integration/CWReserveVerifier.sol", + "contract_name": "IOwnableLike", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qma5m6eDZbM1RJqpQRcRPqsiszLPZwpGusHRDV55C5soFZ/metadata.json b/verification-sources/chain138-metadata-archive/Qma5m6eDZbM1RJqpQRcRPqsiszLPZwpGusHRDV55C5soFZ/metadata.json new file mode 100644 index 0000000..14a83ff --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma5m6eDZbM1RJqpQRcRPqsiszLPZwpGusHRDV55C5soFZ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/CWReserveVerifier.sol":"IOwnableLike"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/CWReserveVerifier.sol":{"keccak256":"0xb0fb3977b950390981f5b4e884042a1817f777f09ae626eaa9cbbc617e190dd1","license":"MIT","urls":["bzz-raw://0512dbc999a0683944d1b9a51b2e96a490fc4e7f6d6abca35050717aa979829c","dweb:/ipfs/QmR1WwkrRRBzFuHq4hWVzHZgBkjs3usumrBjg9BYnMwskR"]},"contracts/bridge/integration/ICWReserveVerifier.sol":{"keccak256":"0x4fc7b6b8f10d5ec64517fc31559a2b7ac52c7496a7effaac7d29fbfc64f44528","license":"MIT","urls":["bzz-raw://7ef5196aefc98a7d6b295118500062ec62c05d786e3f9ad1ae8414d48279605d","dweb:/ipfs/QmU6cE1rZA99DygbUECyCoQwc5t2g1aJrcs3BiZ4SPoksa"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qma76fqfSMqHj1wwZvo9twNeJUX6t8o6QXkfgvhiotddzM/archive-info.json b/verification-sources/chain138-metadata-archive/Qma76fqfSMqHj1wwZvo9twNeJUX6t8o6QXkfgvhiotddzM/archive-info.json new file mode 100644 index 0000000..9c95dec --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma76fqfSMqHj1wwZvo9twNeJUX6t8o6QXkfgvhiotddzM/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qma76fqfSMqHj1wwZvo9twNeJUX6t8o6QXkfgvhiotddzM", + "metadata_digest": "aed37744acfb0c8689580c7400329d02c2446b327997348b285fa239cdc26fde", + "source_path": "contracts/dbis/DBIS_ConversionRouter.sol", + "contract_name": "DBIS_ConversionRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qma76fqfSMqHj1wwZvo9twNeJUX6t8o6QXkfgvhiotddzM/metadata.json b/verification-sources/chain138-metadata-archive/Qma76fqfSMqHj1wwZvo9twNeJUX6t8o6QXkfgvhiotddzM/metadata.json new file mode 100644 index 0000000..4059b4b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma76fqfSMqHj1wwZvo9twNeJUX6t8o6QXkfgvhiotddzM/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"_rootRegistry","type":"address"},{"internalType":"address","name":"_eip712Helper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"quoteHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"venue","type":"bytes32"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"quoteIssuer","type":"address"}],"name":"ConversionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CHAIN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNER_REGISTRY_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STABLECOIN_REGISTRY_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"issuer","type":"address"}],"name":"addQuoteIssuer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"venue","type":"bytes32"}],"name":"addVenue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blocklistContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Helper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"bytes32","name":"lpaId","type":"bytes32"},{"internalType":"bytes32","name":"venue","type":"bytes32"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"quoteHash","type":"bytes32"},{"internalType":"address","name":"quoteIssuer","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"}],"internalType":"struct SwapAuth","name":"auth","type":"tuple"}],"name":"getSwapAuthDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"quoteIssuerAllowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"issuer","type":"address"}],"name":"removeQuoteIssuer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"venue","type":"bytes32"}],"name":"removeVenue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootRegistry","outputs":[{"internalType":"contract DBIS_RootRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_blocklist","type":"address"}],"name":"setBlocklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"bytes32","name":"lpaId","type":"bytes32"},{"internalType":"bytes32","name":"venue","type":"bytes32"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"quoteHash","type":"bytes32"},{"internalType":"address","name":"quoteIssuer","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"}],"internalType":"struct SwapAuth","name":"auth","type":"tuple"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"},{"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"submitSwapAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedSwapMessageIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"venueAllowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/DBIS_ConversionRouter.sol":"DBIS_ConversionRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dbis/DBIS_ConversionRouter.sol":{"keccak256":"0x111773d8c9434f3452ec7e0270f5cee440904c4b24e2b9a6255d6e7b24160b66","license":"MIT","urls":["bzz-raw://77c778de66a0b278cff0c48286274a0b6d8a0b51c627357e2099088971f5f32a","dweb:/ipfs/QmZMMwmcFpV8dh4KdDDYosrCT3e2HqnDcWAjwAnyRqBKRo"]},"contracts/dbis/DBIS_RootRegistry.sol":{"keccak256":"0x8363d9754d5d068b8551d61ad589496faae637714bf383ba5463e1b321b42a4b","license":"MIT","urls":["bzz-raw://407f94c0fb1229bff4d5cbf4c3728757d4bb970dd731bfddf5cbb1bfa1924505","dweb:/ipfs/QmPVzxWWUmkZpS6RLn5VXjSQbr5gwP6uXUobWGTbcw2Pvg"]},"contracts/dbis/DBIS_SignerRegistry.sol":{"keccak256":"0xc75d67d4d75d78ab582560b19b6a93f7ea2dc0e958678aed6bc41e25d763fa6e","license":"MIT","urls":["bzz-raw://4edfce11bd6cfe501e7d7662b39f910076aa064277af47ded14927fe3634c5ae","dweb:/ipfs/QmbjMn6pDzYx5CHvLxXePQNEVtxLeDXxG9GZ5GKDtgoojr"]},"contracts/dbis/IDBIS_EIP712Helper.sol":{"keccak256":"0xbf68a20c4148ff149ea88a24855664287126597c95ddf6523f6747045a85ecae","license":"MIT","urls":["bzz-raw://38c3425f4a22875b835659f5928d39a308aec5017b0e44576aa882cdeaa9a2fa","dweb:/ipfs/QmSfFwR5GZ3kad4SYMda2akmvVGHPzNxei2fLcNDUjpbWd"]},"contracts/dbis/StablecoinReferenceRegistry.sol":{"keccak256":"0x95ce52d9176dbbe35741b96aa1ae5b9d0ceece648522c3611c7a35a0e86c2040","license":"MIT","urls":["bzz-raw://d948677c50fdfc63dd96f9d49932a45b4d838b7fc9b24dacffb0a71946fdc4e0","dweb:/ipfs/QmVTfa59rTTmktV4wh1iMPqrBb2n3d8mUADdBLKkqh3wej"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qma9CJz5sQXHKycZZXwBwcNonSdp4AQVyS3LnTrweuHq5d/archive-info.json b/verification-sources/chain138-metadata-archive/Qma9CJz5sQXHKycZZXwBwcNonSdp4AQVyS3LnTrweuHq5d/archive-info.json new file mode 100644 index 0000000..f02b4e1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma9CJz5sQXHKycZZXwBwcNonSdp4AQVyS3LnTrweuHq5d/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qma9CJz5sQXHKycZZXwBwcNonSdp4AQVyS3LnTrweuHq5d", + "metadata_digest": "af5d0152c645b6ef4e54078bc5706855ef80d93747df6024b2118743b15d0dac", + "source_path": "contracts/reserve/StablecoinReserveVault.sol", + "contract_name": "StablecoinReserveVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qma9CJz5sQXHKycZZXwBwcNonSdp4AQVyS3LnTrweuHq5d/metadata.json b/verification-sources/chain138-metadata-archive/Qma9CJz5sQXHKycZZXwBwcNonSdp4AQVyS3LnTrweuHq5d/metadata.json new file mode 100644 index 0000000..1bb182b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qma9CJz5sQXHKycZZXwBwcNonSdp4AQVyS3LnTrweuHq5d/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"officialUSDT_","type":"address"},{"internalType":"address","name":"officialUSDC_","type":"address"},{"internalType":"address","name":"compliantUSDT_","type":"address"},{"internalType":"address","name":"compliantUSDC_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"CompliantTokenOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"CompliantTokenPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"CompliantTokenUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"redeemer","type":"address"}],"name":"CompliantTokensBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"CompliantTokensMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"}],"name":"ReserveDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"ReserveWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REDEMPTION_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkReserveAdequacy","outputs":[{"internalType":"bool","name":"usdtAdequate","type":"bool"},{"internalType":"bool","name":"usdcAdequate","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compliantUSDC","outputs":[{"internalType":"contract ICompliantTokenOwnerControl","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compliantUSDT","outputs":[{"internalType":"contract ICompliantTokenOwnerControl","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBackingRatio","outputs":[{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint256","name":"tokenSupply","type":"uint256"},{"internalType":"uint256","name":"backingRatio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"officialUSDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"officialUSDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"pauseCompliantToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeemUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeemUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"seedUSDCReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"seedUSDTReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCUSDCMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCUSDTMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferCompliantTokenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unpauseCompliantToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdcReserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdtReserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Locks official USDT/USDC, mints cUSDT/cUSDC 1:1. Can be deployed on Ethereum Mainnet or connected via cross-chain bridge to Chain 138 for minting. IMPORTANT: This contract should be deployed on Ethereum Mainnet where official USDT/USDC exist. For Chain 138 deployment, tokens would be bridged/locked via cross-chain infrastructure.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"checkReserveAdequacy()":{"returns":{"usdcAdequate":"True if USDC reserves are adequate","usdtAdequate":"True if USDT reserves are adequate"}},"constructor":{"params":{"admin":"Admin address (will receive DEFAULT_ADMIN_ROLE)","compliantUSDC_":"CompliantUSDC contract address","compliantUSDT_":"CompliantUSDT contract address","officialUSDC_":"Official USDC token address (on Ethereum Mainnet: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)","officialUSDT_":"Official USDT token address (on Ethereum Mainnet: 0xdAC17F958D2ee523a2206206994597C13D831ec7)"}},"depositUSDC(uint256)":{"details":"Transfers USDC from caller, mints cUSDC to caller","params":{"amount":"Amount of USDC to deposit (6 decimals)"}},"depositUSDT(uint256)":{"details":"Transfers USDT from caller, mints cUSDT to caller","params":{"amount":"Amount of USDT to deposit (6 decimals)"}},"emergencyWithdraw(address,uint256,address)":{"details":"Can be used to recover funds in emergency situations"},"getBackingRatio(address)":{"params":{"token":"Address of compliant token (cUSDT or cUSDC)"},"returns":{"backingRatio":"Backing ratio (10000 = 100%)","reserveBalance":"Current reserve balance","tokenSupply":"Current token supply"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"redeemUSDC(uint256)":{"details":"Burns cUSDC from caller, transfers USDC to caller","params":{"amount":"Amount of cUSDC to redeem (6 decimals)"}},"redeemUSDT(uint256)":{"details":"Burns cUSDT from caller, transfers USDT to caller","params":{"amount":"Amount of cUSDT to redeem (6 decimals)"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"seedUSDCReserve(uint256)":{"details":"Used to retrofit backing for pre-existing canonical supply"},"seedUSDTReserve(uint256)":{"details":"Used to retrofit backing for pre-existing canonical supply"},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"StablecoinReserveVault","version":1},"userdoc":{"kind":"user","methods":{"checkReserveAdequacy()":{"notice":"Check if reserves are adequate"},"constructor":{"notice":"Constructor"},"depositUSDC(uint256)":{"notice":"Deposit official USDC and mint cUSDC 1:1"},"depositUSDT(uint256)":{"notice":"Deposit official USDT and mint cUSDT 1:1"},"emergencyWithdraw(address,uint256,address)":{"notice":"Emergency withdrawal (admin only, after pause)"},"getBackingRatio(address)":{"notice":"Get reserve backing ratio"},"pause()":{"notice":"Pause all operations"},"pauseCompliantToken(address)":{"notice":"Pause one of the compliant tokens currently owned by the vault"},"redeemUSDC(uint256)":{"notice":"Redeem cUSDC for official USDC 1:1"},"redeemUSDT(uint256)":{"notice":"Redeem cUSDT for official USDT 1:1"},"seedUSDCReserve(uint256)":{"notice":"Seed official USDC reserves without minting new cUSDC"},"seedUSDTReserve(uint256)":{"notice":"Seed official USDT reserves without minting new cUSDT"},"transferCompliantTokenOwnership(address,address)":{"notice":"Move compliant token ownership away from the vault if governance needs to recover control"},"unpause()":{"notice":"Unpause all operations"},"unpauseCompliantToken(address)":{"notice":"Unpause one of the compliant tokens currently owned by the vault"}},"notice":"1:1 backing mechanism for CompliantUSDT and CompliantUSDC with official tokens","version":1}},"settings":{"compilationTarget":{"contracts/reserve/StablecoinReserveVault.sol":"StablecoinReserveVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/reserve/StablecoinReserveVault.sol":{"keccak256":"0xf902dc091df3fce8100193f51a2c52e8f33036f825e69c74a301ab0fac9e4100","license":"MIT","urls":["bzz-raw://5538e2055cf488a0430a147e7fe1588f0ef3a80640e6892452c6d42fc4068282","dweb:/ipfs/QmZY81ZtSvmE2yw6eN5Sufyxjbm2Nfd4kCUCNvhKMbePqx"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaABd6xDZUkMhKEZiayxPiGzP3Hbg3kvCzo6ot1NSsPrt/archive-info.json b/verification-sources/chain138-metadata-archive/QmaABd6xDZUkMhKEZiayxPiGzP3Hbg3kvCzo6ot1NSsPrt/archive-info.json new file mode 100644 index 0000000..4940905 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaABd6xDZUkMhKEZiayxPiGzP3Hbg3kvCzo6ot1NSsPrt/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmaABd6xDZUkMhKEZiayxPiGzP3Hbg3kvCzo6ot1NSsPrt", + "metadata_digest": "af9dcef948796d6f6a7550c7dd5409b8eff8bcca94a27533dcec5a5387a78c65", + "source_path": "contracts/vendor/sushiswap-v2/UniswapV2Router02.sol", + "contract_name": "UniswapV2Router02", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaABd6xDZUkMhKEZiayxPiGzP3Hbg3kvCzo6ot1NSsPrt/metadata.json b/verification-sources/chain138-metadata-archive/QmaABd6xDZUkMhKEZiayxPiGzP3Hbg3kvCzo6ot1NSsPrt/metadata.json new file mode 100644 index 0000000..b63203b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaABd6xDZUkMhKEZiayxPiGzP3Hbg3kvCzo6ot1NSsPrt/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/UniswapV2Router02.sol":"UniswapV2Router02"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/UniswapV2Router02.sol":{"keccak256":"0x1b9251a3a6a44dd5c28a6198115420a4e345472a4939447bae2feced5990efef","license":"GPL-3.0","urls":["bzz-raw://460857235f211eabb0ceee83411d1023ab2883f794b6cae8d93451ca1d9b122e","dweb:/ipfs/QmerUzmVcPUBdQKTkizQnSMhz455wgAAmid9fe1jntrUTt"]},"contracts/vendor/sushiswap-v2/interfaces/IERC20.sol":{"keccak256":"0x76866491759a6f069ddc030d52df08d4105a8bcef0e3330dee261cf7ee049b1a","license":"GPL-3.0","urls":["bzz-raw://0b3b2a687415260c33e491cc2d03577729802b5ff8227cc9fd7b45b28cbd24e4","dweb:/ipfs/QmNtBCKh68KLnNj8M2rQDPnbBfKhntzaZ1JReQx4Axtx5w"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xcaec675e6250bf4cd3364459a0cbf789262af2aaa377d61d4d463f657aea7b50","license":"GPL-3.0","urls":["bzz-raw://2c09e004aa8654e1ad2a1e9d8500883f618d754e5a77c840e2c9064c7a80b5cb","dweb:/ipfs/QmamoA2xnZpLsu4gjNaWkfdYcL5VjRpFmR5shpoJ8wYjZw"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x08f9a63b34855eec941be8d36a04424f1a1725a2c030373fcef3afeb480ca385","license":"GPL-3.0","urls":["bzz-raw://174219f9a6c90b4d0133475da5333403aea21ba49d303f3ba28cb4e9a2a0141e","dweb:/ipfs/QmdDy25xsAfWxaKnRbGJys7d9BaPhpbGorMQCY4Au2auZL"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router01.sol":{"keccak256":"0x12091adc186fe351c639dc62aa0b691f78c7bea054c27bbb4b58acd02e1b2ce7","license":"GPL-3.0","urls":["bzz-raw://e7a3f1b86be061741f5483f0f153389aa9e89a24a1556c8784df44ce288b5183","dweb:/ipfs/QmejsqRXse45aoyDjccfKEnZ1uZzdqUtjsYbAS3ThAMesu"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router02.sol":{"keccak256":"0x7e588378c1076243506b8164132e0dcccd468f31edb933a88ddb8d6c4063ab30","license":"GPL-3.0","urls":["bzz-raw://da8233b51c721065562eca1bf774963b4d881f8df26de34c9e608233cd5fd557","dweb:/ipfs/QmRVgpFroy1ofrMdsXU3eiyhmsot3haCLtevUsRt3uPCpu"]},"contracts/vendor/sushiswap-v2/interfaces/IWETH.sol":{"keccak256":"0x680172744962444cd2f8470d50991336b431fe4e29dd835018ac2f36e53344be","license":"GPL-3.0","urls":["bzz-raw://4eaabf44a03be36934e7102e102434350a866ba6f129cfa49ff842c8de73bf40","dweb:/ipfs/QmVXsCsEUeMXk4cJGYJ9toqw4V5T2XDuwaHWERdHA1SeDP"]},"contracts/vendor/sushiswap-v2/libraries/SafeMath.sol":{"keccak256":"0xbde2cf4655f2f21a4e6cc76c28cf88ade1d8150289c208d48662135be9d5dd97","license":"GPL-3.0","urls":["bzz-raw://bd8f46ed9dc5ad8123e596a3b762815503a04ce8a83098d80ba45085fe3c5953","dweb:/ipfs/QmUa6d2v7Miy26dzUctkrumi5My4G34TL9QNUj9u4hh7iS"]},"contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol":{"keccak256":"0x7a9fb341d2bf50b0dfbce1d614f918ffc0598e1f3e31f8d2a949ab9ce25125af","license":"GPL-3.0","urls":["bzz-raw://81ad1ae72ccc1aeae4416b14cde0fab746ef47515ec3c6750dcbeaa8086d9188","dweb:/ipfs/QmePznL6SjS5iw2TAhwznEAAkVskeseMyNA9psvTB6YtrV"]},"contracts/vendor/sushiswap-v2/libraries/UniswapV2Library.sol":{"keccak256":"0x0f9b5380ff674e29e702eb9e472e728222fb3ec65f38aef03336c8a82e2ad80d","license":"GPL-3.0","urls":["bzz-raw://154392fa8d31dbded1ebe0b7591643ce4b35011dfb3ad90742d8355428c729f1","dweb:/ipfs/QmNhNPjbYt3CBoEstVNEcR2C34eRYxFXpaAqCWJXpj2rvP"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaBpKYAVrJ9tCQfcXiTZf6A7BKgodcBBff9ZEs57xSZf3/archive-info.json b/verification-sources/chain138-metadata-archive/QmaBpKYAVrJ9tCQfcXiTZf6A7BKgodcBBff9ZEs57xSZf3/archive-info.json new file mode 100644 index 0000000..4dd91ec --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaBpKYAVrJ9tCQfcXiTZf6A7BKgodcBBff9ZEs57xSZf3/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaBpKYAVrJ9tCQfcXiTZf6A7BKgodcBBff9ZEs57xSZf3", + "metadata_digest": "b008e205b93303f3b290fcefb4aab003624159bc4e48b129c77c7201864b8e36", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2ERC20.sol", + "contract_name": "IUniswapV2ERC20", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaBpKYAVrJ9tCQfcXiTZf6A7BKgodcBBff9ZEs57xSZf3/metadata.json b/verification-sources/chain138-metadata-archive/QmaBpKYAVrJ9tCQfcXiTZf6A7BKgodcBBff9ZEs57xSZf3/metadata.json new file mode 100644 index 0000000..bb12796 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaBpKYAVrJ9tCQfcXiTZf6A7BKgodcBBff9ZEs57xSZf3/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2ERC20.sol":"IUniswapV2ERC20"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2ERC20.sol":{"keccak256":"0x9e433765e9ef7b4ff5e406b260b222c47c2aa27d36df756db708064fcb239ae7","urls":["bzz-raw://5b67c24a5e1652b51ad2f37adad2905519f0e05e7c8b2b4d8b3e00b429bb9213","dweb:/ipfs/QmarJq43GabAGGSqtMUb87ACYQt73mSFbXKyFAPDXpbFNM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaCVNTkmQgn2xhgWhzec9LZDpJPtPxVRCyXzX1X8jhBbb/archive-info.json b/verification-sources/chain138-metadata-archive/QmaCVNTkmQgn2xhgWhzec9LZDpJPtPxVRCyXzX1X8jhBbb/archive-info.json new file mode 100644 index 0000000..9735ebe --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaCVNTkmQgn2xhgWhzec9LZDpJPtPxVRCyXzX1X8jhBbb/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaCVNTkmQgn2xhgWhzec9LZDpJPtPxVRCyXzX1X8jhBbb", + "metadata_digest": "b035098f50f6729c549b82c7292dc71d34e9bd7e845f2832e53373afa1d028fe", + "source_path": "contracts/iso4217w/interfaces/IMintController.sol", + "contract_name": "IMintController", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaCVNTkmQgn2xhgWhzec9LZDpJPtPxVRCyXzX1X8jhBbb/metadata.json b/verification-sources/chain138-metadata-archive/QmaCVNTkmQgn2xhgWhzec9LZDpJPtPxVRCyXzX1X8jhBbb/metadata.json new file mode 100644 index 0000000..320b87c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaCVNTkmQgn2xhgWhzec9LZDpJPtPxVRCyXzX1X8jhBbb/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"settlementId","type":"bytes32"}],"name":"MintExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"name":"MintRejected","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"canMint","outputs":[{"internalType":"bool","name":"canMint","type":"bool"},{"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isOracleQuorumMet","outputs":[{"internalType":"bool","name":"quorumMet","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"settlementId","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Minting requires: verified fiat settlement, custodian attestation, oracle quorum","kind":"dev","methods":{"canMint(address,uint256)":{"params":{"amount":"Amount to mint","token":"Token address"},"returns":{"canMint":"True if minting is allowed","reasonCode":"Reason if not allowed"}},"isOracleQuorumMet(address)":{"params":{"token":"Token address"},"returns":{"quorumMet":"True if quorum is met"}},"mint(address,address,uint256,bytes32)":{"params":{"amount":"Amount to mint (in token decimals)","settlementId":"Fiat settlement ID for audit trail","to":"Recipient address","token":"Token address"}}},"title":"IMintController","version":1},"userdoc":{"kind":"user","methods":{"canMint(address,uint256)":{"notice":"Check if minting is allowed"},"isOracleQuorumMet(address)":{"notice":"Check if oracle quorum is met"},"mint(address,address,uint256,bytes32)":{"notice":"Mint tokens (requires reserve verification)"}},"notice":"Interface for minting ISO-4217 W tokens with reserve verification","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/interfaces/IMintController.sol":"IMintController"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/iso4217w/interfaces/IMintController.sol":{"keccak256":"0xf3db44aba20bcba2d2bef96743dc7c6c6cdc0b8903256f821aef5f90c39c0a5a","license":"MIT","urls":["bzz-raw://69bd577b7f2b6064145073df7ed6a5f4c14ff28e7f43960c17888b04163ffda3","dweb:/ipfs/QmR4fTciLomqyq45EbHUFkDDfeAmfGq7FGSPYKtfA9jucA"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaCyzBVJpwormrNJuoQ6ek8Q73kfS4ZnS49Q7uJVKr45D/archive-info.json b/verification-sources/chain138-metadata-archive/QmaCyzBVJpwormrNJuoQ6ek8Q73kfS4ZnS49Q7uJVKr45D/archive-info.json new file mode 100644 index 0000000..4b0c58c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaCyzBVJpwormrNJuoQ6ek8Q73kfS4ZnS49Q7uJVKr45D/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaCyzBVJpwormrNJuoQ6ek8Q73kfS4ZnS49Q7uJVKr45D", + "metadata_digest": "b05564b55ffc834b16752421911fb463788fb425655f6be208fe22f3ebeac2e8", + "source_path": "contracts/bridge/adapters/non-evm/SolanaAdapter.sol", + "contract_name": "SolanaAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaCyzBVJpwormrNJuoQ6ek8Q73kfS4ZnS49Q7uJVKr45D/metadata.json b/verification-sources/chain138-metadata-archive/QmaCyzBVJpwormrNJuoQ6ek8Q73kfS4ZnS49Q7uJVKr45D/metadata.json new file mode 100644 index 0000000..1f3b0bc --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaCyzBVJpwormrNJuoQ6ek8Q73kfS4ZnS49Q7uJVKr45D/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"txSignature","type":"string"},{"indexed":false,"internalType":"uint256","name":"finalizedSlot","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"fulfillmentId","type":"bytes32"}],"name":"SolanaBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"destination","type":"string"},{"indexed":false,"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"SolanaBridgeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"SolanaBridgeMarkedFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"enum IChainAdapter.BridgeStatus","name":"newStatus","type":"uint8"},{"indexed":false,"internalType":"string","name":"note","type":"string"}],"name":"SolanaBridgeRecovered","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"string","name":"txSignature","type":"string"},{"internalType":"uint256","name":"finalizedSlot","type":"uint256"},{"internalType":"bytes32","name":"fulfillmentId","type":"bytes32"}],"name":"confirmTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"confirmedSlots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"fulfillmentIdsByRequest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"string","name":"reason","type":"string"}],"name":"markFailed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minFinalitySlots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"newStatus","type":"uint8"},{"internalType":"string","name":"note","type":"string"}],"name":"recoverBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slots","type":"uint256"}],"name":"setMinFinalitySlots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"solanaTxSignatures","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedFulfillmentIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"Tracks idempotent fulfillment ids so the relay can resume safely after restarts.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"SolanaAdapter","version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"}},"notice":"Bridge adapter for Solana mainnet-beta using an off-chain relay/oracle path","version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/non-evm/SolanaAdapter.sol":"SolanaAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/adapters/non-evm/SolanaAdapter.sol":{"keccak256":"0x73dc4f0b0657459fdb45855ee2cd9e00acf1a00d9a8745cb795a3bba1727d87e","license":"MIT","urls":["bzz-raw://344f3b7921911939c8fe626518114672ed2191698496b9e103e450e2b178e780","dweb:/ipfs/QmPLtJY3bqVzESWwwdfrFFLQY2Gmrh67smP7fNhYJT3SbW"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaDMPXErTZMqNpAZzG98Q5SBV4mFrc72GtKkRDDsrwriz/archive-info.json b/verification-sources/chain138-metadata-archive/QmaDMPXErTZMqNpAZzG98Q5SBV4mFrc72GtKkRDDsrwriz/archive-info.json new file mode 100644 index 0000000..dae4668 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaDMPXErTZMqNpAZzG98Q5SBV4mFrc72GtKkRDDsrwriz/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaDMPXErTZMqNpAZzG98Q5SBV4mFrc72GtKkRDDsrwriz", + "metadata_digest": "b06d97db41984dc3aa4bdae299a2e08cb28ea16603f23fc1ecb9190007de5a27", + "source_path": "contracts/channels/IGenericStateChannelManager.sol", + "contract_name": "IGenericStateChannelManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaDMPXErTZMqNpAZzG98Q5SBV4mFrc72GtKkRDDsrwriz/metadata.json b/verification-sources/chain138-metadata-archive/QmaDMPXErTZMqNpAZzG98Q5SBV4mFrc72GtKkRDDsrwriz/metadata.json new file mode 100644 index 0000000..a43b4cd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaDMPXErTZMqNpAZzG98Q5SBV4mFrc72GtKkRDDsrwriz/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"stateHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"balanceA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDeadline","type":"uint256"}],"name":"ChallengeSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldWindow","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWindow","type":"uint256"}],"name":"ChallengeWindowUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"stateHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"balanceA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceB","type":"uint256"},{"indexed":false,"internalType":"bool","name":"cooperative","type":"bool"}],"name":"ChannelClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":true,"internalType":"address","name":"participantA","type":"address"},{"indexed":true,"internalType":"address","name":"participantB","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositB","type":"uint256"}],"name":"ChannelOpened","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"bytes32","name":"stateHash","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"challengeClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"bytes32","name":"stateHash","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"closeChannelCooperative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"finalizeClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"fundChannel","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"getChannel","outputs":[{"components":[{"internalType":"address","name":"participantA","type":"address"},{"internalType":"address","name":"participantB","type":"address"},{"internalType":"uint256","name":"depositA","type":"uint256"},{"internalType":"uint256","name":"depositB","type":"uint256"},{"internalType":"enum IGenericStateChannelManager.ChannelStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"disputeNonce","type":"uint256"},{"internalType":"bytes32","name":"disputeStateHash","type":"bytes32"},{"internalType":"uint256","name":"disputeBalanceA","type":"uint256"},{"internalType":"uint256","name":"disputeBalanceB","type":"uint256"},{"internalType":"uint256","name":"disputeDeadline","type":"uint256"}],"internalType":"struct IGenericStateChannelManager.Channel","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChannelCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"participantA","type":"address"},{"internalType":"address","name":"participantB","type":"address"}],"name":"getChannelId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"participantB","type":"address"}],"name":"openChannel","outputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"bytes32","name":"stateHash","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"submitClose","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"IGenericStateChannelManager","version":1},"userdoc":{"kind":"user","methods":{},"notice":"State channels with committed stateHash: same as payment channels but settlement attests to an arbitrary stateHash (e.g. game result, attestation).","version":1}},"settings":{"compilationTarget":{"contracts/channels/IGenericStateChannelManager.sol":"IGenericStateChannelManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/channels/IGenericStateChannelManager.sol":{"keccak256":"0xacfaf7210b4cd666cb0447499dfbfeaa8a391168b63aa3917bfaa4dead616c45","license":"MIT","urls":["bzz-raw://22ad5d4696ed7c10033fd00dbf2427bd702c996df09674e7795892ae236fc837","dweb:/ipfs/QmTAYD15mJTDC9eXd3m8hnWzcR8XsXNdw98cBALao81ioE"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaEBSPojw4QDPk8PPaff5AFAjeZSxFUeUHJeAExbQ1zm3/archive-info.json b/verification-sources/chain138-metadata-archive/QmaEBSPojw4QDPk8PPaff5AFAjeZSxFUeUHJeAExbQ1zm3/archive-info.json new file mode 100644 index 0000000..9f0b1ff --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaEBSPojw4QDPk8PPaff5AFAjeZSxFUeUHJeAExbQ1zm3/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaEBSPojw4QDPk8PPaff5AFAjeZSxFUeUHJeAExbQ1zm3", + "metadata_digest": "b0a3ec465d2d75d1ddf736733ab03c3cf55b02fa17c97cd434fe0d2787a3c1ee", + "source_path": "contracts/vault/adapters/CollateralAdapter.sol", + "contract_name": "CollateralAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaEBSPojw4QDPk8PPaff5AFAjeZSxFUeUHJeAExbQ1zm3/metadata.json b/verification-sources/chain138-metadata-archive/QmaEBSPojw4QDPk8PPaff5AFAjeZSxFUeUHJeAExbQ1zm3/metadata.json new file mode 100644 index 0000000..f40692b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaEBSPojw4QDPk8PPaff5AFAjeZSxFUeUHJeAExbQ1zm3/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"ledger_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CollateralDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"liquidator","type":"address"}],"name":"CollateralSeized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CollateralWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"approveAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedAssets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ledger","outputs":[{"internalType":"contract ILedger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"revokeAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"liquidator","type":"address"}],"name":"seize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ledger_","type":"address"}],"name":"setLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Only callable by Vaults, only accepts approved assets","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"approveAsset(address)":{"params":{"asset":"Asset address"}},"deposit(address,address,uint256)":{"params":{"amount":"Amount to deposit","asset":"Collateral asset address (address(0) for native ETH)","vault":"Vault address"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeAsset(address)":{"params":{"asset":"Asset address"}},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"seize(address,address,uint256,address)":{"params":{"amount":"Amount to seize","asset":"Collateral asset address","liquidator":"Liquidator address","vault":"Vault address"}},"setLedger(address)":{"params":{"ledger_":"New ledger address"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"withdraw(address,address,uint256)":{"params":{"amount":"Amount to withdraw","asset":"Collateral asset address","vault":"Vault address"}}},"title":"CollateralAdapter","version":1},"userdoc":{"kind":"user","methods":{"approveAsset(address)":{"notice":"Approve an asset for collateral"},"deposit(address,address,uint256)":{"notice":"Deposit M0 collateral"},"revokeAsset(address)":{"notice":"Revoke asset approval"},"seize(address,address,uint256,address)":{"notice":"Seize collateral during liquidation"},"setLedger(address)":{"notice":"Set ledger address"},"withdraw(address,address,uint256)":{"notice":"Withdraw M0 collateral"}},"notice":"Handles M0 collateral deposits and withdrawals","version":1}},"settings":{"compilationTarget":{"contracts/vault/adapters/CollateralAdapter.sol":"CollateralAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/vault/adapters/CollateralAdapter.sol":{"keccak256":"0x6f3f5d1441e755483bd99a5a37b8a6987e035d9d712128d44b48a3c3c8e0d072","license":"MIT","urls":["bzz-raw://504eb4949e224e4197349fed5e19d9020f29b99707dbadd27217d106eec645d2","dweb:/ipfs/QmXiSjHiViKm1nmv99o2EZrsM9PaP3JsDCKqxy8AmCw99n"]},"contracts/vault/interfaces/ICollateralAdapter.sol":{"keccak256":"0x45c2214f58500a3ad92ea1ea2c018bb0e71e1dd441e6c293cfbb88ffa5629efc","license":"MIT","urls":["bzz-raw://92e981007a82373da7f08bd7ec4de0b92126091b73356e641adaaf3d46531a1b","dweb:/ipfs/QmbcB6qSdN9imJEEdQQngBkokhtXNMK5eTUyjccpjyLSVd"]},"contracts/vault/interfaces/ILedger.sol":{"keccak256":"0x3a8e8a2d48458202fffe065e691c1abeae50ccb8fc2af8971af7e94ae23d9273","license":"MIT","urls":["bzz-raw://6214e1b92f519cb100b315b2eb64b61e21479f75ebecd3a2e74524806347a5d4","dweb:/ipfs/QmRzswWJmFPa5BAy2npMN2WwrdmNd8pymySMHo1EdSZXED"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaKoCMgZsFv95YCE65SMXxD55CZxqusYVCry5ervzGdZ8/archive-info.json b/verification-sources/chain138-metadata-archive/QmaKoCMgZsFv95YCE65SMXxD55CZxqusYVCry5ervzGdZ8/archive-info.json new file mode 100644 index 0000000..8a0cb2d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaKoCMgZsFv95YCE65SMXxD55CZxqusYVCry5ervzGdZ8/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaKoCMgZsFv95YCE65SMXxD55CZxqusYVCry5ervzGdZ8", + "metadata_digest": "b2144238f43a55ddfd31c53a44745678fa21847aafaecf210d7e834806a0121f", + "source_path": "contracts/bridge/trustless/interfaces/IBalancerVault.sol", + "contract_name": "IBalancerVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaKoCMgZsFv95YCE65SMXxD55CZxqusYVCry5ervzGdZ8/metadata.json b/verification-sources/chain138-metadata-archive/QmaKoCMgZsFv95YCE65SMXxD55CZxqusYVCry5ervzGdZ8/metadata.json new file mode 100644 index 0000000..b64b221 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaKoCMgZsFv95YCE65SMXxD55CZxqusYVCry5ervzGdZ8/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"}],"name":"getPool","outputs":[{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint8","name":"specialization","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"}],"name":"getPoolTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256","name":"lastChangeBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IBalancerVault.SwapKind","name":"kind","type":"uint8"},{"components":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"enum IBalancerVault.SwapKind","name":"kind","type":"uint8"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"}],"internalType":"struct IBalancerVault.SingleSwap[]","name":"swaps","type":"tuple[]"},{"internalType":"address[]","name":"assets","type":"address[]"}],"name":"queryBatchSwap","outputs":[{"internalType":"int256[]","name":"assetDeltas","type":"int256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"enum IBalancerVault.SwapKind","name":"kind","type":"uint8"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"}],"internalType":"struct IBalancerVault.SingleSwap","name":"singleSwap","type":"tuple"},{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bool","name":"fromInternalBalance","type":"bool"},{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"bool","name":"toInternalBalance","type":"bool"}],"internalType":"struct IBalancerVault.FundManagement","name":"funds","type":"tuple"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swap","outputs":[{"internalType":"uint256","name":"amountCalculated","type":"uint256"}],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"Balancer provides weighted pools and better stablecoin swaps","kind":"dev","methods":{"getPool(bytes32)":{"params":{"poolId":"Pool identifier"},"returns":{"poolAddress":"Pool address","specialization":"Pool specialization type"}},"getPoolTokens(bytes32)":{"params":{"poolId":"Pool identifier"},"returns":{"balances":"Token balances in the pool","lastChangeBlock":"Last block number that changed balances","tokens":"Token addresses in the pool"}},"queryBatchSwap(uint8,(bytes32,uint8,address,address,uint256,bytes)[],address[])":{"params":{"assets":"Array of assets involved","kind":"Swap kind","swaps":"Array of swaps to query"},"returns":{"assetDeltas":"Asset deltas for each asset"}},"swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)":{"params":{"deadline":"Deadline for swap","funds":"Fund management parameters","limit":"Maximum amount to swap (slippage protection)","singleSwap":"Swap parameters"},"returns":{"amountCalculated":"Amount calculated for swap"}}},"title":"IBalancerVault","version":1},"userdoc":{"kind":"user","methods":{"getPool(bytes32)":{"notice":"Get pool information"},"getPoolTokens(bytes32)":{"notice":"Get pool tokens and balances"},"queryBatchSwap(uint8,(bytes32,uint8,address,address,uint256,bytes)[],address[])":{"notice":"Query batch swap for quotes"},"swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)":{"notice":"Execute a single swap"}},"notice":"Interface for Balancer V2 Vault","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/interfaces/IBalancerVault.sol":"IBalancerVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaLEHKoWtmR4ySM19S5dvCd8i1YM3d8hfe7no8jPKkWGB/archive-info.json b/verification-sources/chain138-metadata-archive/QmaLEHKoWtmR4ySM19S5dvCd8i1YM3d8hfe7no8jPKkWGB/archive-info.json new file mode 100644 index 0000000..dd7c111 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaLEHKoWtmR4ySM19S5dvCd8i1YM3d8hfe7no8jPKkWGB/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaLEHKoWtmR4ySM19S5dvCd8i1YM3d8hfe7no8jPKkWGB", + "metadata_digest": "b2309f8468a6ca34347d00cd979c1907df5d5a1a55bddf0b5d204bd1bf595c1c", + "source_path": "contracts/bridge/adapters/hyperledger/FireflyAdapter.sol", + "contract_name": "FireflyAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaLEHKoWtmR4ySM19S5dvCd8i1YM3d8hfe7no8jPKkWGB/metadata.json b/verification-sources/chain138-metadata-archive/QmaLEHKoWtmR4ySM19S5dvCd8i1YM3d8hfe7no8jPKkWGB/metadata.json new file mode 100644 index 0000000..21f8cc0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaLEHKoWtmR4ySM19S5dvCd8i1YM3d8hfe7no8jPKkWGB/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"string","name":"_namespace","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"string","name":"fireflyTxId","type":"string"},{"indexed":false,"internalType":"string","name":"sourceChain","type":"string"}],"name":"FireflyBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"fireflyTxId","type":"string"},{"indexed":false,"internalType":"string","name":"namespace","type":"string"}],"name":"FireflyBridgeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FIREFLY_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"string","name":"fireflyTxId","type":"string"},{"internalType":"string","name":"sourceChain","type":"string"}],"name":"confirmFireflyOperation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fireflyNamespace","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"fireflyTxIds","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"Firefly coordinates multi-chain operations - this adapter interfaces with Firefly API","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"FireflyAdapter","version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"estimateFee(address,uint256,bytes)":{"notice":"Estimate bridge fee"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"}},"notice":"Bridge adapter for Hyperledger Firefly orchestration layer","version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/hyperledger/FireflyAdapter.sol":"FireflyAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/adapters/hyperledger/FireflyAdapter.sol":{"keccak256":"0xebd858cf461043d22540a314eac4ed3ba3ffd6d1a94b844bdd0d8dfafc3506a8","license":"MIT","urls":["bzz-raw://2231fdd45c6144d2d1ec7e062a2ac3c326ea930a9fe0435c208a2a4333e436c6","dweb:/ipfs/QmPsjFCy3VjDFFjz3qtUkwqkzR83qUWhPKY4PdXQjDvbvk"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaM5H8xDCuLhGPvf7G7DvNtq13vvbx3UAocjrLQdsDpKJ/archive-info.json b/verification-sources/chain138-metadata-archive/QmaM5H8xDCuLhGPvf7G7DvNtq13vvbx3UAocjrLQdsDpKJ/archive-info.json new file mode 100644 index 0000000..0a3203b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaM5H8xDCuLhGPvf7G7DvNtq13vvbx3UAocjrLQdsDpKJ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaM5H8xDCuLhGPvf7G7DvNtq13vvbx3UAocjrLQdsDpKJ", + "metadata_digest": "b26806212f5b1f4661234a599bb7040303e35ef3bf25ef219122e2d9cb487781", + "source_path": "contracts/vault/RateAccrual.sol", + "contract_name": "RateAccrual", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaM5H8xDCuLhGPvf7G7DvNtq13vvbx3UAocjrLQdsDpKJ/metadata.json b/verification-sources/chain138-metadata-archive/QmaM5H8xDCuLhGPvf7G7DvNtq13vvbx3UAocjrLQdsDpKJ/metadata.json new file mode 100644 index 0000000..7634b1b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaM5H8xDCuLhGPvf7G7DvNtq13vvbx3UAocjrLQdsDpKJ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldAccumulator","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAccumulator","type":"uint256"}],"name":"InterestAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"InterestRateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RATE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_PER_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"accrueInterest","outputs":[{"internalType":"uint256","name":"newAccumulator","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"principal","type":"uint256"}],"name":"calculateDebtWithInterest","outputs":[{"internalType":"uint256","name":"debtWithInterest","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getRateAccumulator","outputs":[{"internalType":"uint256","name":"accumulator","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"interestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setInterestRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Similar to Aave's interest rate model","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"accrueInterest(address)":{"params":{"asset":"Asset address"},"returns":{"newAccumulator":"Updated rate accumulator"}},"calculateDebtWithInterest(address,uint256)":{"params":{"asset":"Asset address","principal":"Principal debt amount"},"returns":{"debtWithInterest":"Debt amount with accrued interest"}},"getRateAccumulator(address)":{"params":{"asset":"Asset address"},"returns":{"accumulator":"Current rate accumulator"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"interestRate(address)":{"params":{"asset":"Asset address"},"returns":{"_0":"rate Annual interest rate in basis points"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setInterestRate(address,uint256)":{"params":{"asset":"Asset address","rate":"Annual interest rate in basis points (e.g., 500 = 5%)"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"RateAccrual","version":1},"userdoc":{"kind":"user","methods":{"accrueInterest(address)":{"notice":"Accrue interest for an asset"},"calculateDebtWithInterest(address,uint256)":{"notice":"Calculate debt with accrued interest"},"getRateAccumulator(address)":{"notice":"Get current rate accumulator for an asset (accrues interest if needed)"},"interestRate(address)":{"notice":"Get interest rate for an asset"},"setInterestRate(address,uint256)":{"notice":"Set interest rate for an asset"}},"notice":"Applies time-based interest to outstanding debt using continuous compounding","version":1}},"settings":{"compilationTarget":{"contracts/vault/RateAccrual.sol":"RateAccrual"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/vault/RateAccrual.sol":{"keccak256":"0x7457f2bb1be63899a4d4ba0d3d4de3d794da6cf2d2bdb129f39901f224f39463","license":"MIT","urls":["bzz-raw://60887b0c72dcbd5aa98714248d6d726058dea79f6a76637e99ccf2d9f8d94cc6","dweb:/ipfs/QmW8rB7ePH5NYsQetYK9r6V6DEXRVDzcKTA8eUozcusH28"]},"contracts/vault/interfaces/IRateAccrual.sol":{"keccak256":"0xbfb2212c538e553dafae6b942af93e4e8098bb43030d4af46d6d63b2882cc92b","license":"MIT","urls":["bzz-raw://078f67847c1c1d1abceae555aebf6403500eee2a366054cd32fd67da147c1b21","dweb:/ipfs/QmdxDLhAmpSyzxy7iVGGNfc2oHWkoo2WVjjBUtNBNtr18g"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaQbdjR3EshxVHKgPJHsP7AoWdkawnksLup28c4D2rdWt/archive-info.json b/verification-sources/chain138-metadata-archive/QmaQbdjR3EshxVHKgPJHsP7AoWdkawnksLup28c4D2rdWt/archive-info.json new file mode 100644 index 0000000..3159155 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaQbdjR3EshxVHKgPJHsP7AoWdkawnksLup28c4D2rdWt/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmaQbdjR3EshxVHKgPJHsP7AoWdkawnksLup28c4D2rdWt", + "metadata_digest": "b34f16c61e24c2e28e20a1184cce911427a350e491ec5a21749289e5be87814d", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Pair.sol", + "contract_name": "IUniswapV2Pair", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaQbdjR3EshxVHKgPJHsP7AoWdkawnksLup28c4D2rdWt/metadata.json b/verification-sources/chain138-metadata-archive/QmaQbdjR3EshxVHKgPJHsP7AoWdkawnksLup28c4D2rdWt/metadata.json new file mode 100644 index 0000000..045faa3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaQbdjR3EshxVHKgPJHsP7AoWdkawnksLup28c4D2rdWt/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"reserve0","type":"uint112"},{"internalType":"uint112","name":"reserve1","type":"uint112"},{"internalType":"uint32","name":"blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Pair.sol":"IUniswapV2Pair"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x08f9a63b34855eec941be8d36a04424f1a1725a2c030373fcef3afeb480ca385","license":"GPL-3.0","urls":["bzz-raw://174219f9a6c90b4d0133475da5333403aea21ba49d303f3ba28cb4e9a2a0141e","dweb:/ipfs/QmdDy25xsAfWxaKnRbGJys7d9BaPhpbGorMQCY4Au2auZL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaUB7Du3e1kumgN41RNVj57B5ZF1RYsk9DkiBbSycsiWM/archive-info.json b/verification-sources/chain138-metadata-archive/QmaUB7Du3e1kumgN41RNVj57B5ZF1RYsk9DkiBbSycsiWM/archive-info.json new file mode 100644 index 0000000..d1e8476 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaUB7Du3e1kumgN41RNVj57B5ZF1RYsk9DkiBbSycsiWM/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaUB7Du3e1kumgN41RNVj57B5ZF1RYsk9DkiBbSycsiWM", + "metadata_digest": "b439ae38065dac914b4b67a121318a165aaae19eae59a3c401512a5fbd4f62aa", + "source_path": "contracts/bridge/atomic/interfaces/IAtomicBridgeCoordinator.sol", + "contract_name": "IAtomicBridgeCoordinator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaUB7Du3e1kumgN41RNVj57B5ZF1RYsk9DkiBbSycsiWM/metadata.json b/verification-sources/chain138-metadata-archive/QmaUB7Du3e1kumgN41RNVj57B5ZF1RYsk9DkiBbSycsiWM/metadata.json new file mode 100644 index 0000000..613e82b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaUB7Du3e1kumgN41RNVj57B5ZF1RYsk9DkiBbSycsiWM/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"getCommitment","outputs":[{"components":[{"internalType":"bytes32","name":"intentId","type":"bytes32"},{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"uint256","name":"reservedLiquidity","type":"uint256"},{"internalType":"uint256","name":"bondAmount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes32","name":"settlementMode","type":"bytes32"}],"internalType":"struct AtomicTypes.AtomicCommitment","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"}],"name":"getCorridorConfig","outputs":[{"components":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"bool","name":"degraded","type":"bool"},{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"maxNotional","type":"uint256"},{"internalType":"uint16","name":"maxReservedBps","type":"uint16"},{"internalType":"uint256","name":"targetBuffer","type":"uint256"},{"internalType":"uint256","name":"maxSettlementBacklog","type":"uint256"},{"internalType":"uint16","name":"maxOracleDriftBps","type":"uint16"},{"internalType":"uint256","name":"fulfilmentTimeout","type":"uint256"},{"internalType":"uint256","name":"settlementTimeout","type":"uint256"},{"internalType":"bytes32","name":"defaultSettlementMode","type":"bytes32"}],"internalType":"struct AtomicTypes.CorridorConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"}],"name":"getCorridorId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"getIntent","outputs":[{"components":[{"internalType":"uint64","name":"sourceChain","type":"uint64"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"routeId","type":"bytes32"},{"internalType":"bytes32","name":"intentId","type":"bytes32"}],"internalType":"struct AtomicTypes.AtomicIntent","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"getObligation","outputs":[{"components":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"bytes32","name":"intentId","type":"bytes32"},{"internalType":"uint256","name":"sourceEscrow","type":"uint256"},{"internalType":"uint256","name":"destinationReserve","type":"uint256"},{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"enum AtomicTypes.ObligationStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"settlementInitiatedAt","type":"uint256"}],"internalType":"struct AtomicTypes.AtomicObligation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/interfaces/IAtomicBridgeCoordinator.sol":"IAtomicBridgeCoordinator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/atomic/AtomicTypes.sol":{"keccak256":"0x85a1bdb93368582a1dea40790269ee2eda65047cd8812b88efdee02eebd343c1","license":"MIT","urls":["bzz-raw://ace009c17e8b2d13ef3be8d1116d772fd5e2c4cc3483e17c63915e8d9fa00fba","dweb:/ipfs/Qmayj5VSpYsqftkgYnmTQahKXaBK9tiAivjjMHvyYwZoRM"]},"contracts/bridge/atomic/interfaces/IAtomicBridgeCoordinator.sol":{"keccak256":"0xc46f27fc9863b9cc75578f9e73ad83fff40b072af5113ecb791173c71f0dd52b","license":"MIT","urls":["bzz-raw://a7ab01dc396a4f37fc9feb172b849ba54a27ff84aa3d8a821e440f732be72aee","dweb:/ipfs/Qmcppu22yE9EMUJzH9hfXbpyjZRzTyHEs7RaWpahF4mnbB"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaVH1SPPUjimwNiY5shWGs8p5J67vEA16SYqt4FLy1cBr/archive-info.json b/verification-sources/chain138-metadata-archive/QmaVH1SPPUjimwNiY5shWGs8p5J67vEA16SYqt4FLy1cBr/archive-info.json new file mode 100644 index 0000000..5250aa0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaVH1SPPUjimwNiY5shWGs8p5J67vEA16SYqt4FLy1cBr/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaVH1SPPUjimwNiY5shWGs8p5J67vEA16SYqt4FLy1cBr", + "metadata_digest": "b481eecc12b83f0e832b3e87b84ca679c5959e20dee7dd3db4a534da849e82c1", + "source_path": "contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol", + "contract_name": "Chain138PilotBalancerVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaVH1SPPUjimwNiY5shWGs8p5J67vEA16SYqt4FLy1cBr/metadata.json b/verification-sources/chain138-metadata-archive/QmaVH1SPPUjimwNiY5shWGs8p5J67vEA16SYqt4FLy1cBr/metadata.json new file mode 100644 index 0000000..2f520b7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaVH1SPPUjimwNiY5shWGs8p5J67vEA16SYqt4FLy1cBr/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"poolId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"PoolFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"poolId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeBps","type":"uint256"}],"name":"PoolSeeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"poolId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Swapped","type":"event"},{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"fundPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"}],"name":"getPool","outputs":[{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint8","name":"specialization","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"}],"name":"getPoolTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256","name":"lastChangeBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IBalancerVault.SwapKind","name":"kind","type":"uint8"},{"components":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"enum IBalancerVault.SwapKind","name":"kind","type":"uint8"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"}],"internalType":"struct IBalancerVault.SingleSwap[]","name":"swaps","type":"tuple[]"},{"internalType":"address[]","name":"","type":"address[]"}],"name":"queryBatchSwap","outputs":[{"internalType":"int256[]","name":"assetDeltas","type":"int256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint256","name":"feeBps","type":"uint256"}],"name":"seedPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"enum IBalancerVault.SwapKind","name":"kind","type":"uint8"},{"internalType":"address","name":"assetIn","type":"address"},{"internalType":"address","name":"assetOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"}],"internalType":"struct IBalancerVault.SingleSwap","name":"singleSwap","type":"tuple"},{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bool","name":"fromInternalBalance","type":"bool"},{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"bool","name":"toInternalBalance","type":"bool"}],"internalType":"struct IBalancerVault.FundManagement","name":"funds","type":"tuple"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swap","outputs":[{"internalType":"uint256","name":"amountCalculated","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"getPool(bytes32)":{"params":{"poolId":"Pool identifier"},"returns":{"poolAddress":"Pool address","specialization":"Pool specialization type"}},"getPoolTokens(bytes32)":{"params":{"poolId":"Pool identifier"},"returns":{"balances":"Token balances in the pool","lastChangeBlock":"Last block number that changed balances","tokens":"Token addresses in the pool"}},"swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)":{"params":{"deadline":"Deadline for swap","funds":"Fund management parameters","limit":"Maximum amount to swap (slippage protection)","singleSwap":"Swap parameters"},"returns":{"amountCalculated":"Amount calculated for swap"}}},"version":1},"userdoc":{"kind":"user","methods":{"getPool(bytes32)":{"notice":"Get pool information"},"getPoolTokens(bytes32)":{"notice":"Get pool tokens and balances"},"swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)":{"notice":"Execute a single swap"}},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":"Chain138PilotBalancerVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":{"keccak256":"0x679c5ae8c6afb2de2dd20a67ea44b52fc119eff657a797f66b3c9822dded9dcf","license":"MIT","urls":["bzz-raw://927fc1104662d51150305ce34d60ff0856f22de1dc508eff188106970342f2f6","dweb:/ipfs/QmQZCZ5vF91AyGEToPuKvvdzLfkxWgrMQ3P2BAA4FzanoF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaZfmRPn1ykSFW4swUk19fUvrweiyyqRjTZNR9EAXiPSq/archive-info.json b/verification-sources/chain138-metadata-archive/QmaZfmRPn1ykSFW4swUk19fUvrweiyyqRjTZNR9EAXiPSq/archive-info.json new file mode 100644 index 0000000..f3eb055 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaZfmRPn1ykSFW4swUk19fUvrweiyyqRjTZNR9EAXiPSq/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaZfmRPn1ykSFW4swUk19fUvrweiyyqRjTZNR9EAXiPSq", + "metadata_digest": "b5a1fd2c5eed85d51cd7da42d9b531e0ecd8f6b505aba1778da65935323ef11a", + "source_path": "contracts/treasury/TreasuryVault.sol", + "contract_name": "TreasuryVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaZfmRPn1ykSFW4swUk19fUvrweiyyqRjTZNR9EAXiPSq/metadata.json b/verification-sources/chain138-metadata-archive/QmaZfmRPn1ykSFW4swUk19fUvrweiyyqRjTZNR9EAXiPSq/metadata.json new file mode 100644 index 0000000..c3021d8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaZfmRPn1ykSFW4swUk19fUvrweiyyqRjTZNR9EAXiPSq/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"ExceedsDailyCap","type":"error"},{"inputs":[],"name":"ExceedsPerTxCap","type":"error"},{"inputs":[],"name":"ExceedsRateLimit","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"NotModule","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"TokenNotApproved","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxPerTx","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dailyCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rateLimitPerHour","type":"uint256"}],"name":"CapsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ModuleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"TokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"toModule","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferRequested","type":"event"},{"inputs":[],"name":"CAP_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MODULE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dayStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hourStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hourlyCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rateLimitPerHour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"toModule","type":"address"}],"name":"requestTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"},{"internalType":"uint256","name":"_dailyCap","type":"uint256"},{"internalType":"uint256","name":"_rateLimitPerHour","type":"uint256"}],"name":"setCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Enforces per-tx cap, daily cap, and hourly rate limit. See docs/treasury/EXECUTOR_ALLOWLIST_MATRIX.md.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"requestTransfer(address,uint256,address)":{"params":{"amount":"Amount to transfer.","toModule":"Recipient module; must be an approved module.","token":"Approved token address (canonical 138 list only)."}},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"TreasuryVault","version":1},"userdoc":{"kind":"user","methods":{"requestTransfer(address,uint256,address)":{"notice":"Request transfer of tokens to an approved module."}},"notice":"Asset custody for the export path; only approved modules can move funds; only approved tokens can leave.","version":1}},"settings":{"compilationTarget":{"contracts/treasury/TreasuryVault.sol":"TreasuryVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/treasury/TreasuryVault.sol":{"keccak256":"0xcf7a323f25f134a54bcbe0aedd3fdeee01c2552b16861239dbe0c609dd9571ac","license":"MIT","urls":["bzz-raw://f09d043fd92d25301dc04375f50c7e73bd3cd34daec6d93bacc0dfd0460df7b1","dweb:/ipfs/QmNMsw2tTg5CCr7KwiwHCJQQD5DjVLHBrFpHw2zjbkqP8m"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmaa5zJHPpz9WCRHj8RhQMrAPh3efBkDXHML1qMmEL3ECG/archive-info.json b/verification-sources/chain138-metadata-archive/Qmaa5zJHPpz9WCRHj8RhQMrAPh3efBkDXHML1qMmEL3ECG/archive-info.json new file mode 100644 index 0000000..3bd402f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmaa5zJHPpz9WCRHj8RhQMrAPh3efBkDXHML1qMmEL3ECG/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmaa5zJHPpz9WCRHj8RhQMrAPh3efBkDXHML1qMmEL3ECG", + "metadata_digest": "b5bd607bc4b50e122349c2e7583126ec6da49745802c101e80d3f686f34dd401", + "source_path": "contracts/dbis/DBIS_ParticipantRegistry.sol", + "contract_name": "DBIS_ParticipantRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmaa5zJHPpz9WCRHj8RhQMrAPh3efBkDXHML1qMmEL3ECG/metadata.json b/verification-sources/chain138-metadata-archive/Qmaa5zJHPpz9WCRHj8RhQMrAPh3efBkDXHML1qMmEL3ECG/metadata.json new file mode 100644 index 0000000..2c5b353 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmaa5zJHPpz9WCRHj8RhQMrAPh3efBkDXHML1qMmEL3ECG/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"participantId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"OperationalWalletAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"participantId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"OperationalWalletRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"participantId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"legalName","type":"string"},{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint8","name":"entityType","type":"uint8"}],"name":"ParticipantRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"participantId","type":"bytes32"},{"indexed":false,"internalType":"uint8","name":"status","type":"uint8"}],"name":"ParticipantStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARTICIPANT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"participantId","type":"bytes32"},{"internalType":"address","name":"wallet","type":"address"}],"name":"addOperationalWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"participantId","type":"bytes32"}],"name":"getParticipant","outputs":[{"components":[{"internalType":"bytes32","name":"participantId","type":"bytes32"},{"internalType":"string","name":"legalName","type":"string"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"enum DBIS_ParticipantRegistry.EntityType","name":"entityType","type":"uint8"},{"internalType":"enum DBIS_ParticipantRegistry.Status","name":"status","type":"uint8"},{"internalType":"bytes32[]","name":"policyTags","type":"bytes32[]"},{"internalType":"address[]","name":"operationalWallets","type":"address[]"}],"internalType":"struct DBIS_ParticipantRegistry.Participant","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getParticipantByWallet","outputs":[{"internalType":"bytes32","name":"participantId","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"participantId","type":"bytes32"}],"name":"getParticipantStatus","outputs":[{"internalType":"enum DBIS_ParticipantRegistry.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isOperationalWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"participantId","type":"bytes32"},{"internalType":"string","name":"legalName","type":"string"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"enum DBIS_ParticipantRegistry.EntityType","name":"entityType","type":"uint8"},{"internalType":"enum DBIS_ParticipantRegistry.Status","name":"status","type":"uint8"},{"internalType":"bytes32[]","name":"policyTags","type":"bytes32[]"},{"internalType":"address[]","name":"operationalWallets","type":"address[]"}],"internalType":"struct DBIS_ParticipantRegistry.Participant","name":"p","type":"tuple"}],"name":"registerParticipant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"participantId","type":"bytes32"},{"internalType":"address","name":"wallet","type":"address"}],"name":"removeOperationalWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"participantId","type":"bytes32"},{"internalType":"enum DBIS_ParticipantRegistry.Status","name":"s","type":"uint8"}],"name":"setParticipantStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/DBIS_ParticipantRegistry.sol":"DBIS_ParticipantRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dbis/DBIS_ParticipantRegistry.sol":{"keccak256":"0xa11f0a3b715e551ba0450ec718284084a64ea1469734f5607e27d75b03a39dd7","license":"MIT","urls":["bzz-raw://958bfbf38f5af48679d869f9e7386f8cc3eba284c5a99314f3da75f30a46e652","dweb:/ipfs/QmaRSybCjAS8fY6NpbV1BiVMKarn5pxbsj5i39UJjfmVYU"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmabJsL2Q5h3ADfFAMaFQEENoHr6dMofyHPuzW6EE2QGt4/archive-info.json b/verification-sources/chain138-metadata-archive/QmabJsL2Q5h3ADfFAMaFQEENoHr6dMofyHPuzW6EE2QGt4/archive-info.json new file mode 100644 index 0000000..a3eca13 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmabJsL2Q5h3ADfFAMaFQEENoHr6dMofyHPuzW6EE2QGt4/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmabJsL2Q5h3ADfFAMaFQEENoHr6dMofyHPuzW6EE2QGt4", + "metadata_digest": "b60d855e0065da3dd0ad39d4df9ab7c65e08128fe7bd184ebf00daa182cd9d35", + "source_path": "contracts/channels/PaymentChannelManager.sol", + "contract_name": "PaymentChannelManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmabJsL2Q5h3ADfFAMaFQEENoHr6dMofyHPuzW6EE2QGt4/metadata.json b/verification-sources/chain138-metadata-archive/QmabJsL2Q5h3ADfFAMaFQEENoHr6dMofyHPuzW6EE2QGt4/metadata.json new file mode 100644 index 0000000..f24e505 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmabJsL2Q5h3ADfFAMaFQEENoHr6dMofyHPuzW6EE2QGt4/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_challengeWindowSeconds","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDeadline","type":"uint256"}],"name":"ChallengeSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldWindow","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWindow","type":"uint256"}],"name":"ChallengeWindowUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceB","type":"uint256"},{"indexed":false,"internalType":"bool","name":"cooperative","type":"bool"}],"name":"ChannelClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":true,"internalType":"address","name":"participantA","type":"address"},{"indexed":true,"internalType":"address","name":"participantB","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositB","type":"uint256"}],"name":"ChannelOpened","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"challengeClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"challengeWindowSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"closeChannelCooperative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"finalizeClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"fundChannel","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"getChannel","outputs":[{"components":[{"internalType":"address","name":"participantA","type":"address"},{"internalType":"address","name":"participantB","type":"address"},{"internalType":"uint256","name":"depositA","type":"uint256"},{"internalType":"uint256","name":"depositB","type":"uint256"},{"internalType":"enum IPaymentChannelManager.ChannelStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"disputeNonce","type":"uint256"},{"internalType":"uint256","name":"disputeBalanceA","type":"uint256"},{"internalType":"uint256","name":"disputeBalanceB","type":"uint256"},{"internalType":"uint256","name":"disputeDeadline","type":"uint256"}],"internalType":"struct IPaymentChannelManager.Channel","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChannelCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"participantA","type":"address"},{"internalType":"address","name":"participantB","type":"address"}],"name":"getChannelId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getChannelIdByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"participantB","type":"address"}],"name":"openChannel","outputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWindow","type":"uint256"}],"name":"setChallengeWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"balanceA","type":"uint256"},{"internalType":"uint256","name":"balanceB","type":"uint256"},{"internalType":"uint8","name":"vA","type":"uint8"},{"internalType":"bytes32","name":"rA","type":"bytes32"},{"internalType":"bytes32","name":"sA","type":"bytes32"},{"internalType":"uint8","name":"vB","type":"uint8"},{"internalType":"bytes32","name":"rB","type":"bytes32"},{"internalType":"bytes32","name":"sB","type":"bytes32"}],"name":"submitClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Deployable on both Mainnet and Chain-138. Holds ETH; no ERC20 in v1.","errors":{"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{},"title":"PaymentChannelManager","version":1},"userdoc":{"kind":"user","methods":{"challengeWindowSeconds()":{"notice":"Challenge period in seconds (e.g. 24h = 86400)"},"getChannelId(address,address)":{"notice":"Returns first channel id for the pair (0 if none). For multiple channels per pair, enumerate via getChannelCount/getChannel."}},"notice":"Manages payment channels: open, cooperative/unilateral close, challenge window (newest state wins).","version":1}},"settings":{"compilationTarget":{"contracts/channels/PaymentChannelManager.sol":"PaymentChannelManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"contracts/channels/IPaymentChannelManager.sol":{"keccak256":"0x0f7b6d6682bac5b4f941060adc87afa223533a6b3b633894fb069c75c04ea1d3","license":"MIT","urls":["bzz-raw://40741c5dc4c05d1685bd5d9709f072e5f10f999a2d3ed7343d06761c845e9dd3","dweb:/ipfs/QmbrDfHCyrXUzAM9oKbWCymQEyHCbooqxikiwjw8T8QhAz"]},"contracts/channels/PaymentChannelManager.sol":{"keccak256":"0x24e2114946eb71e699466d4625e5be77cc8f83f8be913d9ee72fa85753b19df3","license":"MIT","urls":["bzz-raw://3d889bfd0876df00dae8fbc98a038c46a3a1c413449fd7755fd1ebb2a95f8d3b","dweb:/ipfs/QmedCdFGqqgsQR7W4pXbCRWX4WYbcL9zKxSzUxi2WfKcr3"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmac7CcECh33LR9HoQcpUxu2gBZs8NhyxqzcfxDGQNHp7n/archive-info.json b/verification-sources/chain138-metadata-archive/Qmac7CcECh33LR9HoQcpUxu2gBZs8NhyxqzcfxDGQNHp7n/archive-info.json new file mode 100644 index 0000000..274f161 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmac7CcECh33LR9HoQcpUxu2gBZs8NhyxqzcfxDGQNHp7n/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmac7CcECh33LR9HoQcpUxu2gBZs8NhyxqzcfxDGQNHp7n", + "metadata_digest": "b641e8c00fc4a10fa9bfba69dcde07d53a4efebd37b4995c800a3d64187db415", + "source_path": "@openzeppelin/contracts/interfaces/draft-IERC6093.sol", + "contract_name": "IERC1155Errors", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmac7CcECh33LR9HoQcpUxu2gBZs8NhyxqzcfxDGQNHp7n/metadata.json b/verification-sources/chain138-metadata-archive/Qmac7CcECh33LR9HoQcpUxu2gBZs8NhyxqzcfxDGQNHp7n/metadata.json new file mode 100644 index 0000000..7c10e27 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmac7CcECh33LR9HoQcpUxu2gBZs8NhyxqzcfxDGQNHp7n/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC1155InvalidApprover","type":"error"},{"inputs":[{"internalType":"uint256","name":"idsLength","type":"uint256"},{"internalType":"uint256","name":"valuesLength","type":"uint256"}],"name":"ERC1155InvalidArrayLength","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC1155InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC1155InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC1155InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155MissingApprovalForAll","type":"error"}],"devdoc":{"details":"Standard ERC1155 Errors Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.","errors":{"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred.","tokenId":"Identifier number of a token."}}],"ERC1155InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC1155InvalidArrayLength(uint256,uint256)":[{"details":"Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. Used in batch transfers.","params":{"idsLength":"Length of the array of token identifiers","valuesLength":"Length of the array of token amounts"}}],"ERC1155InvalidOperator(address)":[{"details":"Indicates a failure with the `operator` to be approved. Used in approvals.","params":{"operator":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC1155InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC1155InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC1155MissingApprovalForAll(address,address)":[{"details":"Indicates a failure with the `operator`\u2019s approval. Used in transfers.","params":{"operator":"Address that may be allowed to operate on tokens without being their owner.","owner":"Address of the current owner of a token."}}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":"IERC1155Errors"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmacDjPP92Z2G4UCxKHEJHW1xfiJbC5xstSaxavRqA2Jjw/archive-info.json b/verification-sources/chain138-metadata-archive/QmacDjPP92Z2G4UCxKHEJHW1xfiJbC5xstSaxavRqA2Jjw/archive-info.json new file mode 100644 index 0000000..84cd831 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmacDjPP92Z2G4UCxKHEJHW1xfiJbC5xstSaxavRqA2Jjw/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmacDjPP92Z2G4UCxKHEJHW1xfiJbC5xstSaxavRqA2Jjw", + "metadata_digest": "b6494b1df8c95b75bfc50f390ce7b31303b0d56c18e06d45607cc44634cd1c56", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Pair.sol", + "contract_name": "IUniswapV2Pair", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmacDjPP92Z2G4UCxKHEJHW1xfiJbC5xstSaxavRqA2Jjw/metadata.json b/verification-sources/chain138-metadata-archive/QmacDjPP92Z2G4UCxKHEJHW1xfiJbC5xstSaxavRqA2Jjw/metadata.json new file mode 100644 index 0000000..d54c743 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmacDjPP92Z2G4UCxKHEJHW1xfiJbC5xstSaxavRqA2Jjw/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"reserve0","type":"uint112"},{"internalType":"uint112","name":"reserve1","type":"uint112"},{"internalType":"uint32","name":"blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Pair.sol":"IUniswapV2Pair"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x08f9a63b34855eec941be8d36a04424f1a1725a2c030373fcef3afeb480ca385","license":"GPL-3.0","urls":["bzz-raw://174219f9a6c90b4d0133475da5333403aea21ba49d303f3ba28cb4e9a2a0141e","dweb:/ipfs/QmdDy25xsAfWxaKnRbGJys7d9BaPhpbGorMQCY4Au2auZL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmacyCeiyQKmRHyt5MH7QPhnWKAvQFTHHQikTvrxcjY4c2/archive-info.json b/verification-sources/chain138-metadata-archive/QmacyCeiyQKmRHyt5MH7QPhnWKAvQFTHHQikTvrxcjY4c2/archive-info.json new file mode 100644 index 0000000..4465cbb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmacyCeiyQKmRHyt5MH7QPhnWKAvQFTHHQikTvrxcjY4c2/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmacyCeiyQKmRHyt5MH7QPhnWKAvQFTHHQikTvrxcjY4c2", + "metadata_digest": "b67a71f89dc607d5ab27257d76e185f5a9dbac2c02638df54b6062d5bac32af3", + "source_path": "contracts/mirror/MirrorRegistry.sol", + "contract_name": "MirrorRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmacyCeiyQKmRHyt5MH7QPhnWKAvQFTHHQikTvrxcjY4c2/metadata.json b/verification-sources/chain138-metadata-archive/QmacyCeiyQKmRHyt5MH7QPhnWKAvQFTHHQikTvrxcjY4c2/metadata.json new file mode 100644 index 0000000..3f99e42 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmacyCeiyQKmRHyt5MH7QPhnWKAvQFTHHQikTvrxcjY4c2/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"sourceChainId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"startBlock","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endBlock","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"},{"indexed":false,"internalType":"string","name":"uri","type":"string"},{"indexed":false,"internalType":"uint64","name":"ts","type":"uint64"}],"name":"CommitSubmitted","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"publisher","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"PublisherSet","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_COMMITS_PER_BLOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commitsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commitsThisBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publishers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setPublisher","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sourceChainId","type":"uint256"},{"internalType":"uint64","name":"startBlock","type":"uint64"},{"internalType":"uint64","name":"endBlock","type":"uint64"},{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint64","name":"ts","type":"uint64"}],"name":"submitCommit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"submitCommit(chainId, startBlock, endBlock, root, uri, ts) + event CommitSubmitted. Publisher allowlist and optional rate limiting.","kind":"dev","methods":{"submitCommit(uint256,uint64,uint64,bytes32,string,uint64)":{"params":{"endBlock":"End block (inclusive).","root":"Merkle root of leaves (tx_hash, block_number, receipt_root, payload_hash, sal_hash).","sourceChainId":"Chain ID (e.g. 138, 651940).","startBlock":"Start block (inclusive).","ts":"Timestamp of commit (epoch seconds).","uri":"URI to leaf set (e.g. S3 or API)."}}},"title":"MirrorRegistry","version":1},"userdoc":{"kind":"user","methods":{"submitCommit(uint256,uint64,uint64,bytes32,string,uint64)":{"notice":"Submit a Merkle commitment for a block range on source chain (138 or 651940)."}},"notice":"Stores Merkle commitment roots for DBIS/Alltra transaction mirroring to public mainnets.","version":1}},"settings":{"compilationTarget":{"contracts/mirror/MirrorRegistry.sol":"MirrorRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/mirror/MirrorRegistry.sol":{"keccak256":"0x8dfc867d491e5f80088d19eac85ee04fd8d008223c0989a71c4a30271e9eb86b","license":"MIT","urls":["bzz-raw://daf90c4008fe0099289ef045767958567c1413893cd2ce8717b782837d35e2d0","dweb:/ipfs/QmPXu2qLDBe9ogjj6GyNtmdBWxTmZv5DjD3qYjSJ3BbAVs"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaduyATnBHiwTPAfRbQZaoeeFjfXXxHA1iUMSDmVV3aJB/archive-info.json b/verification-sources/chain138-metadata-archive/QmaduyATnBHiwTPAfRbQZaoeeFjfXXxHA1iUMSDmVV3aJB/archive-info.json new file mode 100644 index 0000000..53b88ba --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaduyATnBHiwTPAfRbQZaoeeFjfXXxHA1iUMSDmVV3aJB/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaduyATnBHiwTPAfRbQZaoeeFjfXXxHA1iUMSDmVV3aJB", + "metadata_digest": "b6b85ef7928064126f2f27ed6cdb36cc34d35440f1274a5c48d921058c4c1b18", + "source_path": "contracts/bridge/trustless/IntentBridgeCoordinatorV2.sol", + "contract_name": "IntentBridgeCoordinatorV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaduyATnBHiwTPAfRbQZaoeeFjfXXxHA1iUMSDmVV3aJB/metadata.json b/verification-sources/chain138-metadata-archive/QmaduyATnBHiwTPAfRbQZaoeeFjfXXxHA1iUMSDmVV3aJB/metadata.json new file mode 100644 index 0000000..3dc0239 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaduyATnBHiwTPAfRbQZaoeeFjfXXxHA1iUMSDmVV3aJB/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_swapRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BridgeExecutorNotConfigured","type":"error"},{"inputs":[{"internalType":"string","name":"reason","type":"string"}],"name":"BridgeValidationFailed","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidIntent","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"bridgeType","type":"bytes32"},{"indexed":true,"internalType":"address","name":"executor","type":"address"}],"name":"BridgeExecutorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"intentHash","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"bridgeReference","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"destinationPlanHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"inputToken","type":"address"},{"indexed":false,"internalType":"address","name":"bridgeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bridgedAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"IntentExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXECUTOR_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeExecutors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"address","name":"outputToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg[]","name":"legs","type":"tuple[]"}],"internalType":"struct RouteTypesV2.RoutePlan","name":"sourcePlan","type":"tuple"},{"internalType":"bytes32","name":"bridgeType","type":"bytes32"},{"internalType":"bytes","name":"bridgeData","type":"bytes"},{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"address","name":"outputToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg[]","name":"legs","type":"tuple[]"}],"internalType":"struct RouteTypesV2.RoutePlan","name":"destinationPlan","type":"tuple"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct RouteTypesV2.BridgeIntentPlan","name":"intent","type":"tuple"}],"name":"executeIntent","outputs":[{"internalType":"bytes32","name":"bridgeReference","type":"bytes32"},{"internalType":"bytes32","name":"destinationPlanHash","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"bridgeType","type":"bytes32"},{"internalType":"address","name":"executor","type":"address"}],"name":"setBridgeExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IEnhancedSwapRouterV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/IntentBridgeCoordinatorV2.sol":"IntentBridgeCoordinatorV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/trustless/IntentBridgeCoordinatorV2.sol":{"keccak256":"0x4280e13418b254cd3556910b033f3b614a74a58799397b57db0354b7d28b6cc7","license":"MIT","urls":["bzz-raw://011a9d52061f1638cfb24673242a07a0fa948a76b0988941f49f54f52be3fd8a","dweb:/ipfs/QmREpy8qvehEjhmeDdxJ3dpfrmy94BSDWhQKwucDRUHhgs"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/interfaces/IBridgeIntentExecutor.sol":{"keccak256":"0xe908b4d74687166a5608622202bb3a7f975ee26d72e5746b19a118e118d44e78","license":"MIT","urls":["bzz-raw://33fc8110b376d6426424854544e69fc6474f1ccb46b5dd81bd5f9d29b2fd2340","dweb:/ipfs/QmQaKoNwpMdjW3GEQFm9jJncEwhe1Az6QNB1MoQm3HG23b"]},"contracts/bridge/trustless/interfaces/IEnhancedSwapRouterV2.sol":{"keccak256":"0x43001bdc9f187d3316ee67f037838c374aafb36a9a1d4af00f2a6b0e4194db72","license":"MIT","urls":["bzz-raw://2756b5a70903d1849a3e457a4c066ff5a169f61a63df6b37e5b6e1f4d009f562","dweb:/ipfs/QmXJWG3ksg9CmChnL5RhnanrubUVFAPiTyugn1hk8qhfrD"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmafhJR5BPhcAcmEdTAmRfsTT9zArGWrZR6N4UqehfkoVu/archive-info.json b/verification-sources/chain138-metadata-archive/QmafhJR5BPhcAcmEdTAmRfsTT9zArGWrZR6N4UqehfkoVu/archive-info.json new file mode 100644 index 0000000..2731d86 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmafhJR5BPhcAcmEdTAmRfsTT9zArGWrZR6N4UqehfkoVu/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmafhJR5BPhcAcmEdTAmRfsTT9zArGWrZR6N4UqehfkoVu", + "metadata_digest": "b72d3570a683443af86b7f7649c57363b7179f6c71dc18e776311537e831dd5c", + "source_path": "contracts/dbis/DBIS_ConversionRouter.sol", + "contract_name": "IBlocklist", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmafhJR5BPhcAcmEdTAmRfsTT9zArGWrZR6N4UqehfkoVu/metadata.json b/verification-sources/chain138-metadata-archive/QmafhJR5BPhcAcmEdTAmRfsTT9zArGWrZR6N4UqehfkoVu/metadata.json new file mode 100644 index 0000000..a1e0aff --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmafhJR5BPhcAcmEdTAmRfsTT9zArGWrZR6N4UqehfkoVu/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/DBIS_ConversionRouter.sol":"IBlocklist"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dbis/DBIS_ConversionRouter.sol":{"keccak256":"0x111773d8c9434f3452ec7e0270f5cee440904c4b24e2b9a6255d6e7b24160b66","license":"MIT","urls":["bzz-raw://77c778de66a0b278cff0c48286274a0b6d8a0b51c627357e2099088971f5f32a","dweb:/ipfs/QmZMMwmcFpV8dh4KdDDYosrCT3e2HqnDcWAjwAnyRqBKRo"]},"contracts/dbis/DBIS_RootRegistry.sol":{"keccak256":"0x8363d9754d5d068b8551d61ad589496faae637714bf383ba5463e1b321b42a4b","license":"MIT","urls":["bzz-raw://407f94c0fb1229bff4d5cbf4c3728757d4bb970dd731bfddf5cbb1bfa1924505","dweb:/ipfs/QmPVzxWWUmkZpS6RLn5VXjSQbr5gwP6uXUobWGTbcw2Pvg"]},"contracts/dbis/DBIS_SignerRegistry.sol":{"keccak256":"0xc75d67d4d75d78ab582560b19b6a93f7ea2dc0e958678aed6bc41e25d763fa6e","license":"MIT","urls":["bzz-raw://4edfce11bd6cfe501e7d7662b39f910076aa064277af47ded14927fe3634c5ae","dweb:/ipfs/QmbjMn6pDzYx5CHvLxXePQNEVtxLeDXxG9GZ5GKDtgoojr"]},"contracts/dbis/IDBIS_EIP712Helper.sol":{"keccak256":"0xbf68a20c4148ff149ea88a24855664287126597c95ddf6523f6747045a85ecae","license":"MIT","urls":["bzz-raw://38c3425f4a22875b835659f5928d39a308aec5017b0e44576aa882cdeaa9a2fa","dweb:/ipfs/QmSfFwR5GZ3kad4SYMda2akmvVGHPzNxei2fLcNDUjpbWd"]},"contracts/dbis/StablecoinReferenceRegistry.sol":{"keccak256":"0x95ce52d9176dbbe35741b96aa1ae5b9d0ceece648522c3611c7a35a0e86c2040","license":"MIT","urls":["bzz-raw://d948677c50fdfc63dd96f9d49932a45b4d838b7fc9b24dacffb0a71946fdc4e0","dweb:/ipfs/QmVTfa59rTTmktV4wh1iMPqrBb2n3d8mUADdBLKkqh3wej"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaijKeSQ1GCTxDG52aWsFbFcqHr3EwbMSLzn6ZjfF61TQ/archive-info.json b/verification-sources/chain138-metadata-archive/QmaijKeSQ1GCTxDG52aWsFbFcqHr3EwbMSLzn6ZjfF61TQ/archive-info.json new file mode 100644 index 0000000..a90c2a8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaijKeSQ1GCTxDG52aWsFbFcqHr3EwbMSLzn6ZjfF61TQ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaijKeSQ1GCTxDG52aWsFbFcqHr3EwbMSLzn6ZjfF61TQ", + "metadata_digest": "b7f43c8ffb508111f94ed39ed7e5660728adcc70bc1e0e747fdeecc84a958ee3", + "source_path": "contracts/flash/TwoHopDodoIntegrationUnwinder.sol", + "contract_name": "TwoHopDodoIntegrationUnwinder", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaijKeSQ1GCTxDG52aWsFbFcqHr3EwbMSLzn6ZjfF61TQ/metadata.json b/verification-sources/chain138-metadata-archive/QmaijKeSQ1GCTxDG52aWsFbFcqHr3EwbMSLzn6ZjfF61TQ/metadata.json new file mode 100644 index 0000000..9542b3f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaijKeSQ1GCTxDG52aWsFbFcqHr3EwbMSLzn6ZjfF61TQ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"integration_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadParams","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"integration","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unwind","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"`data` = abi.encode(address poolA, address poolB, address midToken, uint256 minMidOut). Use for Mainnet when there is no Uniswap V3 route for cWUSDC/USDC but there *is* depth on cWUSDC/cWUSDT and a second PMM pool cWUSDT/USDC (sizes must fit the second pool).","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"TwoHopDodoIntegrationUnwinder","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Unwind `tokenIn -> midToken` on `poolA`, then `midToken -> tokenOut` on `poolB`, both via the same DODO PMM integration.","version":1}},"settings":{"compilationTarget":{"contracts/flash/TwoHopDodoIntegrationUnwinder.sol":"TwoHopDodoIntegrationUnwinder"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/flash/TwoHopDodoIntegrationUnwinder.sol":{"keccak256":"0xe272b61163cf6860d252c8c75048c139586a8f60ba7cadbf040497b3aa0a4c2c","license":"MIT","urls":["bzz-raw://4824ebcb15628a5074529ecb6e10b73c73374a92f2e97c77922dd37bf281d60c","dweb:/ipfs/QmNy9WJimfXdwc78MSZpxf5xz3d323yLKewP2cYx7JAVBT"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmajnA22XR32GFZrViF5s8JPGMAghMMiYxygXmaigkGcN2/archive-info.json b/verification-sources/chain138-metadata-archive/QmajnA22XR32GFZrViF5s8JPGMAghMMiYxygXmaigkGcN2/archive-info.json new file mode 100644 index 0000000..eae81d9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmajnA22XR32GFZrViF5s8JPGMAghMMiYxygXmaigkGcN2/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmajnA22XR32GFZrViF5s8JPGMAghMMiYxygXmaigkGcN2", + "metadata_digest": "b8390594a2b2a08a372b8fa42aa32b45c227c6a01ce182a1b94ba1be321494d7", + "source_path": "contracts/bridge/interfaces/IChainAdapter.sol", + "contract_name": "IChainAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmajnA22XR32GFZrViF5s8JPGMAghMMiYxygXmaigkGcN2/metadata.json b/verification-sources/chain138-metadata-archive/QmajnA22XR32GFZrViF5s8JPGMAghMMiYxygXmaigkGcN2/metadata.json new file mode 100644 index 0000000..014abfa --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmajnA22XR32GFZrViF5s8JPGMAghMMiYxygXmaigkGcN2/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"All chain adapters must implement this interface","kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}}},"title":"IChainAdapter","version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"estimateFee(address,uint256,bytes)":{"notice":"Estimate bridge fee"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"}},"notice":"Interface for chain-specific bridge adapters","version":1}},"settings":{"compilationTarget":{"contracts/bridge/interfaces/IChainAdapter.sol":"IChainAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmak1fH3EYjBM3ryTjVTa1arhdQfv9G4D7bwaT6fn6RSH7/archive-info.json b/verification-sources/chain138-metadata-archive/Qmak1fH3EYjBM3ryTjVTa1arhdQfv9G4D7bwaT6fn6RSH7/archive-info.json new file mode 100644 index 0000000..67c6992 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmak1fH3EYjBM3ryTjVTa1arhdQfv9G4D7bwaT6fn6RSH7/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmak1fH3EYjBM3ryTjVTa1arhdQfv9G4D7bwaT6fn6RSH7", + "metadata_digest": "b8484a9581ee0c6864e60c6b401c0246a0e3e718f84f4c632939b1d7e411ac5a", + "source_path": "contracts/emoney/interfaces/ITokenFactory138.sol", + "contract_name": "ITokenFactory138", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmak1fH3EYjBM3ryTjVTa1arhdQfv9G4D7bwaT6fn6RSH7/metadata.json b/verification-sources/chain138-metadata-archive/Qmak1fH3EYjBM3ryTjVTa1arhdQfv9G4D7bwaT6fn6RSH7/metadata.json new file mode 100644 index 0000000..e1f1af5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmak1fH3EYjBM3ryTjVTa1arhdQfv9G4D7bwaT6fn6RSH7/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"title":"ITokenFactory138","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Minimal interface for TokenFactory138 (stub for build)","version":1}},"settings":{"compilationTarget":{"contracts/emoney/interfaces/ITokenFactory138.sol":"ITokenFactory138"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/emoney/interfaces/ITokenFactory138.sol":{"keccak256":"0x841f40fa43d194f25e2e7d3eea98bcf8176427fbcf0072040e84636fdc8d8423","license":"MIT","urls":["bzz-raw://da86454337c45625cdd5ad6a87aa040f7124911d875243a5e9d3adb2e837fc38","dweb:/ipfs/QmVJ8gB4VRuka1amB1Mj5oDnhXsnwxVUAK8ShkKQugbHFk"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmakxEToyFZ11djAbfLqmEZ1pN7JAB3vPw4M9DfXempd7u/archive-info.json b/verification-sources/chain138-metadata-archive/QmakxEToyFZ11djAbfLqmEZ1pN7JAB3vPw4M9DfXempd7u/archive-info.json new file mode 100644 index 0000000..2edc5ae --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmakxEToyFZ11djAbfLqmEZ1pN7JAB3vPw4M9DfXempd7u/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmakxEToyFZ11djAbfLqmEZ1pN7JAB3vPw4M9DfXempd7u", + "metadata_digest": "b885ff0ce0efdc3fd69afa82f5e522ef47813a657f6d3cd8ab3be2f860571558", + "source_path": "contracts/bridge/interop/BridgeVerifier.sol", + "contract_name": "BridgeVerifier", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmakxEToyFZ11djAbfLqmEZ1pN7JAB3vPw4M9DfXempd7u/metadata.json b/verification-sources/chain138-metadata-archive/QmakxEToyFZ11djAbfLqmEZ1pN7JAB3vPw4M9DfXempd7u/metadata.json new file mode 100644 index 0000000..1b82698 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmakxEToyFZ11djAbfLqmEZ1pN7JAB3vPw4M9DfXempd7u/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"_quorumThreshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"AlreadyAttested","type":"error"},{"inputs":[],"name":"AttestorNotFound","type":"error"},{"inputs":[],"name":"DeadlineExpired","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"InvalidQuorum","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NonceAlreadyUsed","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"attestor","type":"address"},{"indexed":false,"internalType":"bytes32","name":"proofHash","type":"bytes32"}],"name":"AttestationSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"totalWeight","type":"uint256"},{"indexed":false,"internalType":"bool","name":"quorumMet","type":"bool"}],"name":"AttestationVerified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"attestor","type":"address"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"AttestorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"attestor","type":"address"}],"name":"AttestorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"attestor","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"AttestorUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"QuorumThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"ATTESTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"attestor","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"addAttestor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"attestationWeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"attestations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"attestorList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"attestors","outputs":[{"internalType":"address","name":"attestor","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"weight","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllAttestors","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"transferId","type":"bytes32"},{"internalType":"address","name":"attestor","type":"address"}],"name":"hasAttested","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quorumThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"attestor","type":"address"}],"name":"removeAttestor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setQuorumThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"transferId","type":"bytes32"},{"internalType":"bytes32","name":"proofHash","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct BridgeVerifier.Attestation","name":"attestation","type":"tuple"}],"name":"submitAttestation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAttestorWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"attestor","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"updateAttestor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedNonces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"transferId","type":"bytes32"}],"name":"verifyQuorum","outputs":[{"internalType":"bool","name":"quorumMet","type":"bool"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"requiredWeight","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Supports multi-sig quorum for attestations","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}]},"events":{"EIP712DomainChanged()":{"details":"MAY be emitted to signal that the domain could have changed."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"addAttestor(address,uint256)":{"params":{"attestor":"Attestor address","weight":"Weight for quorum calculation"}},"eip712Domain()":{"details":"See {IERC-5267}."},"getAllAttestors()":{"returns":{"_0":"Array of attestor addresses"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasAttested(bytes32,address)":{"params":{"attestor":"Attestor address","transferId":"Transfer identifier"},"returns":{"_0":"True if attested"}},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"removeAttestor(address)":{"params":{"attestor":"Attestor address"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setQuorumThreshold(uint256)":{"params":{"newThreshold":"New threshold in basis points"}},"submitAttestation((bytes32,bytes32,uint256,uint256,bytes))":{"params":{"attestation":"Attestation with signature"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"updateAttestor(address,bool,uint256)":{"params":{"attestor":"Attestor address","enabled":"Enabled status","weight":"New weight"}},"verifyQuorum(bytes32)":{"params":{"transferId":"Transfer identifier"},"returns":{"quorumMet":"Whether quorum threshold is met","requiredWeight":"Required weight for quorum","totalWeight":"Total weight of attestations"}}},"title":"BridgeVerifier","version":1},"userdoc":{"kind":"user","methods":{"addAttestor(address,uint256)":{"notice":"Add an attestor"},"getAllAttestors()":{"notice":"Get all attestors"},"hasAttested(bytes32,address)":{"notice":"Check if an attestor has attested to a transfer"},"removeAttestor(address)":{"notice":"Remove an attestor"},"setQuorumThreshold(uint256)":{"notice":"Update quorum threshold"},"submitAttestation((bytes32,bytes32,uint256,uint256,bytes))":{"notice":"Submit an attestation"},"updateAttestor(address,bool,uint256)":{"notice":"Update attestor configuration"},"verifyQuorum(bytes32)":{"notice":"Verify if quorum is met for a transfer"}},"notice":"Verifies cross-chain proofs and attestor signatures for bridge operations","version":1}},"settings":{"compilationTarget":{"contracts/bridge/interop/BridgeVerifier.sol":"BridgeVerifier"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/bridge/interop/BridgeVerifier.sol":{"keccak256":"0xface84db95c57e445d06d72bf4e2ffc058d3ffbb6cb47a3358818f89524a7edb","license":"MIT","urls":["bzz-raw://290f153f795cf24f2c6f0621d58315a14dda57fa99ecd8c2adbecc1d24e9a5f2","dweb:/ipfs/QmRuncFWg31CsbrRLdsCz956XhYeL5FP27pNNA4hD3LNfd"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmaoPCXRwmBN3JwiEzShz6ogSArzeso5jikhLZ3eri5erV/archive-info.json b/verification-sources/chain138-metadata-archive/QmaoPCXRwmBN3JwiEzShz6ogSArzeso5jikhLZ3eri5erV/archive-info.json new file mode 100644 index 0000000..13185b7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaoPCXRwmBN3JwiEzShz6ogSArzeso5jikhLZ3eri5erV/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmaoPCXRwmBN3JwiEzShz6ogSArzeso5jikhLZ3eri5erV", + "metadata_digest": "b9256341fbe32654ea901ab0e8cdcb021a1f2e10b2702ee2a5769b8f8380077a", + "source_path": "contracts/bridge/trustless/interfaces/IBridgeIntentExecutor.sol", + "contract_name": "IBridgeIntentExecutor", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmaoPCXRwmBN3JwiEzShz6ogSArzeso5jikhLZ3eri5erV/metadata.json b/verification-sources/chain138-metadata-archive/QmaoPCXRwmBN3JwiEzShz6ogSArzeso5jikhLZ3eri5erV/metadata.json new file mode 100644 index 0000000..1a9ef64 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmaoPCXRwmBN3JwiEzShz6ogSArzeso5jikhLZ3eri5erV/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"bridgeType","type":"bytes32"},{"internalType":"bytes","name":"bridgeData","type":"bytes"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"executeBridge","outputs":[{"internalType":"bytes32","name":"referenceId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"bridgeType","type":"bytes32"},{"internalType":"bytes","name":"bridgeData","type":"bytes"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"validateBridge","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/interfaces/IBridgeIntentExecutor.sol":"IBridgeIntentExecutor"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/interfaces/IBridgeIntentExecutor.sol":{"keccak256":"0xe908b4d74687166a5608622202bb3a7f975ee26d72e5746b19a118e118d44e78","license":"MIT","urls":["bzz-raw://33fc8110b376d6426424854544e69fc6474f1ccb46b5dd81bd5f9d29b2fd2340","dweb:/ipfs/QmQaKoNwpMdjW3GEQFm9jJncEwhe1Az6QNB1MoQm3HG23b"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmapzDBGf2UjtKXMsk1z1x9Epa5wDtTpTxnbPPqgGFHiwN/archive-info.json b/verification-sources/chain138-metadata-archive/QmapzDBGf2UjtKXMsk1z1x9Epa5wDtTpTxnbPPqgGFHiwN/archive-info.json new file mode 100644 index 0000000..16edaa9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmapzDBGf2UjtKXMsk1z1x9Epa5wDtTpTxnbPPqgGFHiwN/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmapzDBGf2UjtKXMsk1z1x9Epa5wDtTpTxnbPPqgGFHiwN", + "metadata_digest": "b98e8e4e1ea1b422193c60249cf81b1f5a5949e48cb7d09f887bcb4a17f1c295", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IERC20.sol", + "contract_name": "IERC20", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmapzDBGf2UjtKXMsk1z1x9Epa5wDtTpTxnbPPqgGFHiwN/metadata.json b/verification-sources/chain138-metadata-archive/QmapzDBGf2UjtKXMsk1z1x9Epa5wDtTpTxnbPPqgGFHiwN/metadata.json new file mode 100644 index 0000000..7285a27 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmapzDBGf2UjtKXMsk1z1x9Epa5wDtTpTxnbPPqgGFHiwN/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IERC20.sol":"IERC20"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IERC20.sol":{"keccak256":"0x61db17aebc5d812c7002d15c1da954065e56abe49d64b14c034abe5604d70eb3","urls":["bzz-raw://b006685e753f9120469f10b09c159f222d4cb8b507a6c1f0c14ed50c883ebe66","dweb:/ipfs/QmSyY7iTugbczPwfGK67etiyPULenYGzzRYbt8aabwwkUb"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmazA66TDpzXjxVpLiPg7XNX46464jinQn5QU73eA7t8Lt/archive-info.json b/verification-sources/chain138-metadata-archive/QmazA66TDpzXjxVpLiPg7XNX46464jinQn5QU73eA7t8Lt/archive-info.json new file mode 100644 index 0000000..d4e0e59 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmazA66TDpzXjxVpLiPg7XNX46464jinQn5QU73eA7t8Lt/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmazA66TDpzXjxVpLiPg7XNX46464jinQn5QU73eA7t8Lt", + "metadata_digest": "bbe7f3bdb8362408bcd9e90eacd5e70f51beebba9c121cf4c853a4a2f581f3b5", + "source_path": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol", + "contract_name": "ERC20Upgradeable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmazA66TDpzXjxVpLiPg7XNX46464jinQn5QU73eA7t8Lt/metadata.json b/verification-sources/chain138-metadata-archive/QmazA66TDpzXjxVpLiPg7XNX46464jinQn5QU73eA7t8Lt/metadata.json new file mode 100644 index 0000000..07be4b4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmazA66TDpzXjxVpLiPg7XNX46464jinQn5QU73eA7t8Lt/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Implementation of the {IERC20} interface. This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. TIP: For a detailed writeup see our guide https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. The default value of {decimals} is 18. To change this, you should override this function so it returns a different value. We have followed general OpenZeppelin Contracts guidelines: functions revert instead returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC-20 applications.","errors":{"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Skips emitting an {Approval} event indicating an allowance update. This is not required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol":"ERC20Upgradeable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol":{"keccak256":"0xd518def45c722a6e803e1e26e625db25e01497f672ca566cca585d234ec903b0","license":"MIT","urls":["bzz-raw://6e7de3fccd96783244790cde282435ce0fd3a44ab4ccb10f17005c743202882f","dweb:/ipfs/QmYSepstTqs5UPJvjeJXkWU5R659yReqrSgSGGh65hkbdK"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmb3REcUNaroWwRrcgvGWBrkxw9KhmfqT3fP2jM8jWSDNg/archive-info.json b/verification-sources/chain138-metadata-archive/Qmb3REcUNaroWwRrcgvGWBrkxw9KhmfqT3fP2jM8jWSDNg/archive-info.json new file mode 100644 index 0000000..f0a486f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb3REcUNaroWwRrcgvGWBrkxw9KhmfqT3fP2jM8jWSDNg/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmb3REcUNaroWwRrcgvGWBrkxw9KhmfqT3fP2jM8jWSDNg", + "metadata_digest": "bcbdd2368319ea3b91b97df7d5da8da90f4eacbf169ef5e98771663fb56c2151", + "source_path": "contracts/iso4217w/registry/TokenRegistry.sol", + "contract_name": "TokenRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmb3REcUNaroWwRrcgvGWBrkxw9KhmfqT3fP2jM8jWSDNg/metadata.json b/verification-sources/chain138-metadata-archive/Qmb3REcUNaroWwRrcgvGWBrkxw9KhmfqT3fP2jM8jWSDNg/metadata.json new file mode 100644 index 0000000..1dcc001 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb3REcUNaroWwRrcgvGWBrkxw9KhmfqT3fP2jM8jWSDNg/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":true,"internalType":"address","name":"custodian","type":"address"}],"name":"TokenRegistered","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTRAR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"deactivateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRegisteredCurrencies","outputs":[{"internalType":"string[]","name":"currencies","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getTokenInfo","outputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"custodian","type":"address"},{"internalType":"address","name":"mintController","type":"address"},{"internalType":"address","name":"burnController","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"internalType":"struct ITokenRegistry.TokenInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"registered","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"custodian","type":"address"}],"name":"registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"address","name":"burnController","type":"address"}],"name":"setBurnController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"address","name":"mintController","type":"address"}],"name":"setMintController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Registry is immutable once published (tokens can be deactivated but not removed)","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"deactivateToken(string)":{"params":{"currencyCode":"ISO-4217 currency code"}},"getRegisteredCurrencies()":{"returns":{"currencies":"Array of registered currency codes"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getTokenAddress(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"tokenAddress":"Token contract address"}},"getTokenInfo(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"info":"Token information"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isRegistered(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"registered":"True if registered"}},"registerToken(string,address,string,uint8,address)":{"params":{"currencyCode":"ISO-4217 currency code (must be valid ISO-4217)","custodian":"Custodian address","decimals":"Token decimals (typically 2 for fiat currencies)","tokenAddress":"Token contract address","tokenSymbol":"Token symbol (should be W format)"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setBurnController(string,address)":{"params":{"burnController":"Burn controller address","currencyCode":"ISO-4217 currency code"}},"setMintController(string,address)":{"params":{"currencyCode":"ISO-4217 currency code","mintController":"Mint controller address"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"TokenRegistry","version":1},"userdoc":{"kind":"user","methods":{"deactivateToken(string)":{"notice":"Deactivate a token (emergency)"},"getRegisteredCurrencies()":{"notice":"Get all registered currency codes"},"getTokenAddress(string)":{"notice":"Get token address for ISO-4217 code"},"getTokenInfo(string)":{"notice":"Get token info for ISO-4217 code"},"isRegistered(string)":{"notice":"Check if currency code is registered"},"registerToken(string,address,string,uint8,address)":{"notice":"Register a new ISO-4217 W token"},"setBurnController(string,address)":{"notice":"Set burn controller for a currency"},"setMintController(string,address)":{"notice":"Set mint controller for a currency"}},"notice":"Canonical registry mapping ISO-4217 codes to W token addresses","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/registry/TokenRegistry.sol":"TokenRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/iso4217w/interfaces/ITokenRegistry.sol":{"keccak256":"0x819a713049356cfd7a265358d9c16813dc6e2bbac73b8ed6ff6e594250333464","license":"MIT","urls":["bzz-raw://b6010875dce14843a813a5f9a3437a140a8b84196af364672731b470729ac108","dweb:/ipfs/QmVUkBiHpgf4gWpAHayZ474My6C74T9eZvpqW9rs5MyuAn"]},"contracts/iso4217w/libraries/ISO4217WCompliance.sol":{"keccak256":"0xdfef8ded2a1d1fd8303a05b6846270a0bb882386c2da513260cc19a20c7a8b68","license":"MIT","urls":["bzz-raw://e1107bd7d443a2ef6995fbaceab0e4d06b6c36e72cf5f1b08e9fc64f8a4dc256","dweb:/ipfs/QmNter36BUWZnPHsLZWbQTeDdMiVKQNxWoBHLDoQ74B8JA"]},"contracts/iso4217w/registry/TokenRegistry.sol":{"keccak256":"0x7106cc45496bba1372e271173d4dcde8d0662dbc2bda53f749e42895c3a99cb3","license":"MIT","urls":["bzz-raw://430950484cf5904a964802a595e487293f9d14381d0ff6c59cdede778af3c52c","dweb:/ipfs/QmaacTge822r82LvwN8nXNtK7FuS8pEwJswZNXwZmFqKuL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmb5yWf9gjPWZpQHixaXdHy2bgVtZcSwA9PWWMacqcxcVM/archive-info.json b/verification-sources/chain138-metadata-archive/Qmb5yWf9gjPWZpQHixaXdHy2bgVtZcSwA9PWWMacqcxcVM/archive-info.json new file mode 100644 index 0000000..75cbffd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb5yWf9gjPWZpQHixaXdHy2bgVtZcSwA9PWWMacqcxcVM/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmb5yWf9gjPWZpQHixaXdHy2bgVtZcSwA9PWWMacqcxcVM", + "metadata_digest": "bd657a648156efb245dd822214a3cea100dd6ff33a8ac7ab4e98a9db23480760", + "source_path": "contracts/vault/Vault.sol", + "contract_name": "Vault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmb5yWf9gjPWZpQHixaXdHy2bgVtZcSwA9PWWMacqcxcVM/metadata.json b/verification-sources/chain138-metadata-archive/Qmb5yWf9gjPWZpQHixaXdHy2bgVtZcSwA9PWWMacqcxcVM/metadata.json new file mode 100644 index 0000000..4d42653 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb5yWf9gjPWZpQHixaXdHy2bgVtZcSwA9PWWMacqcxcVM/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"entity_","type":"address"},{"internalType":"address","name":"ledger_","type":"address"},{"internalType":"address","name":"entityRegistry_","type":"address"},{"internalType":"address","name":"collateralAdapter_","type":"address"},{"internalType":"address","name":"eMoneyJoin_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"borrower","type":"address"}],"name":"Borrowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"repayer","type":"address"}],"name":"Repaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collateralAdapter","outputs":[{"internalType":"contract ICollateralAdapter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eMoneyJoin","outputs":[{"internalType":"contract IeMoneyJoin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entityRegistry","outputs":[{"internalType":"contract IRegulatedEntityRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHealth","outputs":[{"internalType":"uint256","name":"healthRatio","type":"uint256"},{"internalType":"uint256","name":"collateralValue","type":"uint256"},{"internalType":"uint256","name":"debtValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ledger","outputs":[{"internalType":"contract ILedger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"debtToken","type":"address"}],"name":"setDebtToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"depositToken","type":"address"}],"name":"setDepositToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Each vault is owned by a regulated entity","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"borrow(address,uint256)":{"params":{"amount":"Amount to borrow","currency":"eMoney currency address"}},"deposit(address,uint256)":{"params":{"amount":"Amount to deposit","asset":"Collateral asset address (address(0) for native ETH)"}},"getHealth()":{"returns":{"collateralValue":"Total collateral value in XAU","debtValue":"Total debt value in XAU","healthRatio":"Collateralization ratio in basis points"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"repay(address,uint256)":{"params":{"amount":"Amount to repay","currency":"eMoney currency address"}},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setDebtToken(address,address)":{"params":{"currency":"Currency address","debtToken":"Debt token address"}},"setDepositToken(address,address)":{"params":{"asset":"Asset address","depositToken":"Deposit token address"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"withdraw(address,uint256)":{"params":{"amount":"Amount to withdraw","asset":"Collateral asset address"}}},"stateVariables":{"owner":{"return":"owner Vault owner address","returns":{"_0":"owner Vault owner address"}}},"title":"Vault","version":1},"userdoc":{"kind":"user","methods":{"borrow(address,uint256)":{"notice":"Borrow eMoney against collateral"},"deposit(address,uint256)":{"notice":"Deposit M0 collateral into vault"},"getHealth()":{"notice":"Get vault health"},"owner()":{"notice":"Get vault owner"},"repay(address,uint256)":{"notice":"Repay borrowed eMoney"},"setDebtToken(address,address)":{"notice":"Set debt token for a currency"},"setDepositToken(address,address)":{"notice":"Set deposit token for an asset"},"withdraw(address,uint256)":{"notice":"Withdraw collateral from vault"}},"notice":"Aave-style vault for deposit, borrow, repay, withdraw operations","version":1}},"settings":{"compilationTarget":{"contracts/vault/Vault.sol":"Vault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol":{"keccak256":"0xd518def45c722a6e803e1e26e625db25e01497f672ca566cca585d234ec903b0","license":"MIT","urls":["bzz-raw://6e7de3fccd96783244790cde282435ce0fd3a44ab4ccb10f17005c743202882f","dweb:/ipfs/QmYSepstTqs5UPJvjeJXkWU5R659yReqrSgSGGh65hkbdK"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/vault/Vault.sol":{"keccak256":"0x9a064d7713140a036c81c34f4cde7b964eff46e9f9a0ed128b3b30e79216e646","license":"MIT","urls":["bzz-raw://c8077104750c8578014c60914558c21489bb83d84086a127bc31897558f0668b","dweb:/ipfs/Qme5eDJizvYQdBjUKunhsyeTVLycCkSWPQY8g3TPfqKYh6"]},"contracts/vault/interfaces/ICollateralAdapter.sol":{"keccak256":"0x45c2214f58500a3ad92ea1ea2c018bb0e71e1dd441e6c293cfbb88ffa5629efc","license":"MIT","urls":["bzz-raw://92e981007a82373da7f08bd7ec4de0b92126091b73356e641adaaf3d46531a1b","dweb:/ipfs/QmbcB6qSdN9imJEEdQQngBkokhtXNMK5eTUyjccpjyLSVd"]},"contracts/vault/interfaces/ILedger.sol":{"keccak256":"0x3a8e8a2d48458202fffe065e691c1abeae50ccb8fc2af8971af7e94ae23d9273","license":"MIT","urls":["bzz-raw://6214e1b92f519cb100b315b2eb64b61e21479f75ebecd3a2e74524806347a5d4","dweb:/ipfs/QmRzswWJmFPa5BAy2npMN2WwrdmNd8pymySMHo1EdSZXED"]},"contracts/vault/interfaces/IRegulatedEntityRegistry.sol":{"keccak256":"0xf3ec40774d215299eae68db073b733885023d6f8d1d9a00575c02842a8c54af4","license":"MIT","urls":["bzz-raw://ea06721c4f4ca7f59e3c9e14fc376e3c43d7cd83f544dbdf18c6e182441186b0","dweb:/ipfs/QmRFbfhyDp9UJBepDinYvs7TC6pLbZBgajnZbtPXqmpcWp"]},"contracts/vault/interfaces/IVault.sol":{"keccak256":"0x8d8b34ee40744f19fc1c758cd08815b748750059ea87eb89b25b0490c3613c9c","license":"MIT","urls":["bzz-raw://af6f236b0a80f6eb36c4c006df04c5199247c021182c5afb08184503b187a552","dweb:/ipfs/QmSobXGKCjL8WfvKA312zK3dtE7M5DmioKEucN4MP4TZEZ"]},"contracts/vault/interfaces/IeMoneyJoin.sol":{"keccak256":"0x61df69d6ee9f5966c1b3bfb9bdf938506af7895b0afa8543d73588fb6470ca49","license":"MIT","urls":["bzz-raw://063843b2dfc41802c80bb808e1783701273ce23ef773aa08827f3b923d7102d3","dweb:/ipfs/QmXwc26Y1yAgetLapiUGPLCPoxkp3tAHf5cuSfPBC4PPLw"]},"contracts/vault/tokens/DebtToken.sol":{"keccak256":"0xb791a91845fa03b3b69fb92165dd8c716a270920171ff63de7b17489eb4871da","license":"MIT","urls":["bzz-raw://84a630592b68a85070e26195cc5a24ed085078f5bf04d4b2b35037e6295c1e45","dweb:/ipfs/QmTXHxwdnPZKMKNyvgXtKh8AYvqSPKxMBL6eR5KzsJRs1T"]},"contracts/vault/tokens/DepositToken.sol":{"keccak256":"0xa1220a078010b1554f80da8f4883b2c339eca95ef1d20e070c97cccc3ab1723c","license":"MIT","urls":["bzz-raw://5879ab048f39cff3bcef678959740643a43eecb7fe8a864192339f5fe8591f17","dweb:/ipfs/QmRq6Jd25dkF7dt3YLbtvPQosegBEA1xqdU7Sgc1C1Tpep"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmb6JCqHSwLqiiQ9qUsgUBwNNZ1T99t8x3p1dh5oMGkUfo/archive-info.json b/verification-sources/chain138-metadata-archive/Qmb6JCqHSwLqiiQ9qUsgUBwNNZ1T99t8x3p1dh5oMGkUfo/archive-info.json new file mode 100644 index 0000000..1fdeeab --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb6JCqHSwLqiiQ9qUsgUBwNNZ1T99t8x3p1dh5oMGkUfo/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "Qmb6JCqHSwLqiiQ9qUsgUBwNNZ1T99t8x3p1dh5oMGkUfo", + "metadata_digest": "bd7a9d2ca966d1807dd7fbaa02390b3ecc7c2ff5ecdd540a8408aa7f89eeb63e", + "source_path": "contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol", + "contract_name": "TransferHelper", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmb6JCqHSwLqiiQ9qUsgUBwNNZ1T99t8x3p1dh5oMGkUfo/metadata.json b/verification-sources/chain138-metadata-archive/Qmb6JCqHSwLqiiQ9qUsgUBwNNZ1T99t8x3p1dh5oMGkUfo/metadata.json new file mode 100644 index 0000000..3669f36 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb6JCqHSwLqiiQ9qUsgUBwNNZ1T99t8x3p1dh5oMGkUfo/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol":"TransferHelper"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/libraries/TransferHelper.sol":{"keccak256":"0x7a9fb341d2bf50b0dfbce1d614f918ffc0598e1f3e31f8d2a949ab9ce25125af","license":"GPL-3.0","urls":["bzz-raw://81ad1ae72ccc1aeae4416b14cde0fab746ef47515ec3c6750dcbeaa8086d9188","dweb:/ipfs/QmePznL6SjS5iw2TAhwznEAAkVskeseMyNA9psvTB6YtrV"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmb78GcfFchqF3QWjjcoeWcaDp5vpER1BU6r2dHsgBXqNw/archive-info.json b/verification-sources/chain138-metadata-archive/Qmb78GcfFchqF3QWjjcoeWcaDp5vpER1BU6r2dHsgBXqNw/archive-info.json new file mode 100644 index 0000000..7f249d6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb78GcfFchqF3QWjjcoeWcaDp5vpER1BU6r2dHsgBXqNw/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmb78GcfFchqF3QWjjcoeWcaDp5vpER1BU6r2dHsgBXqNw", + "metadata_digest": "bdb0f62309be08cffedcef45cbeb8e88ed46bad4e2180a41c23e656e412d14e8", + "source_path": "contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol", + "contract_name": "Chain138PilotUniswapV3Router", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmb78GcfFchqF3QWjjcoeWcaDp5vpER1BU6r2dHsgBXqNw/metadata.json b/verification-sources/chain138-metadata-archive/Qmb78GcfFchqF3QWjjcoeWcaDp5vpER1BU6r2dHsgBXqNw/metadata.json new file mode 100644 index 0000000..ff9bf85 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb78GcfFchqF3QWjjcoeWcaDp5vpER1BU6r2dHsgBXqNw/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"poolKey","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"PairFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"poolKey","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint24","name":"fee","type":"uint24"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"PairSeeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"poolKey","type":"bytes32"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Swapped","type":"event"},{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"}],"internalType":"struct ISwapRouter.ExactInputParams","name":"params","type":"tuple"}],"name":"exactInput","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct ISwapRouter.ExactInputSingleParams","name":"params","type":"tuple"}],"name":"exactInputSingle","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"name":"fundPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"getPairReserves","outputs":[{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quoteExactInput","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint160","name":"","type":"uint160"}],"name":"quoteExactInputSingle","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"name":"seedPair","outputs":[{"internalType":"bytes32","name":"poolKey","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":"Chain138PilotUniswapV3Router"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":{"keccak256":"0x679c5ae8c6afb2de2dd20a67ea44b52fc119eff657a797f66b3c9822dded9dcf","license":"MIT","urls":["bzz-raw://927fc1104662d51150305ce34d60ff0856f22de1dc508eff188106970342f2f6","dweb:/ipfs/QmQZCZ5vF91AyGEToPuKvvdzLfkxWgrMQ3P2BAA4FzanoF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmb8c5dbm79KrhFtrg6eDEKwp1PJoAJ5kEAa9BAF4P4HyY/archive-info.json b/verification-sources/chain138-metadata-archive/Qmb8c5dbm79KrhFtrg6eDEKwp1PJoAJ5kEAa9BAF4P4HyY/archive-info.json new file mode 100644 index 0000000..e3a8eb9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb8c5dbm79KrhFtrg6eDEKwp1PJoAJ5kEAa9BAF4P4HyY/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmb8c5dbm79KrhFtrg6eDEKwp1PJoAJ5kEAa9BAF4P4HyY", + "metadata_digest": "be11fce4040633b9568b5a635a04002a02a0598dc7a8051226503f48d27f39c7", + "source_path": "contracts/ccip/CCIPWETH9Bridge.sol", + "contract_name": "CCIPWETH9Bridge", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmb8c5dbm79KrhFtrg6eDEKwp1PJoAJ5kEAa9BAF4P4HyY/metadata.json b/verification-sources/chain138-metadata-archive/Qmb8c5dbm79KrhFtrg6eDEKwp1PJoAJ5kEAa9BAF4P4HyY/metadata.json new file mode 100644 index 0000000..b29ccb2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb8c5dbm79KrhFtrg6eDEKwp1PJoAJ5kEAa9BAF4P4HyY/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_ccipRouter","type":"address"},{"internalType":"address","name":"_weth9","type":"address"},{"internalType":"address","name":"_feeToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CrossChainTransferCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"CrossChainTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiverBridge","type":"address"}],"name":"DestinationAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"DestinationRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiverBridge","type":"address"}],"name":"DestinationUpdated","type":"event"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiverBridge","type":"address"}],"name":"addDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ccipRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"destinationChains","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destinations","outputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiverBridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDestinationChains","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"removeDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendCrossChain","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiverBridge","type":"address"}],"name":"updateDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeToken","type":"address"}],"name":"updateFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth9","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Enables users to send WETH9 tokens across chains via CCIP","kind":"dev","methods":{"calculateFee(uint64,uint256)":{"params":{"amount":"The amount of WETH9 to send","destinationChainSelector":"The chain selector of the destination chain"},"returns":{"fee":"The fee required for the transfer"}},"ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"params":{"message":"The CCIP message"}},"sendCrossChain(uint64,address,uint256)":{"params":{"amount":"The amount of WETH9 to send","destinationChainSelector":"The chain selector of the destination chain","recipient":"The recipient address on the destination chain"},"returns":{"messageId":"The CCIP message ID"}}},"title":"CCIP WETH9 Bridge","version":1},"userdoc":{"kind":"user","methods":{"addDestination(uint64,address)":{"notice":"Add destination chain"},"calculateFee(uint64,uint256)":{"notice":"Calculate fee for cross-chain transfer"},"ccipReceive((bytes32,uint64,bytes,bytes,(address,uint256,uint8)[]))":{"notice":"Receive WETH9 tokens from another chain via CCIP"},"changeAdmin(address)":{"notice":"Change admin"},"getDestinationChains()":{"notice":"Get destination chains"},"getUserNonce(address)":{"notice":"Get user nonce"},"removeDestination(uint64)":{"notice":"Remove destination chain"},"sendCrossChain(uint64,address,uint256)":{"notice":"Send WETH9 tokens to another chain via CCIP"},"updateDestination(uint64,address)":{"notice":"Update destination receiver bridge"},"updateFeeToken(address)":{"notice":"Update fee token"}},"notice":"Cross-chain WETH9 transfer bridge using Chainlink CCIP","version":1}},"settings":{"compilationTarget":{"contracts/ccip/CCIPWETH9Bridge.sol":"CCIPWETH9Bridge"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"contracts/ccip/CCIPWETH9Bridge.sol":{"keccak256":"0x9b370018bc9f9184523c5e92a9e704f62df0dd4c240b0a8b59ac33585ef05651","license":"MIT","urls":["bzz-raw://26901f83517dd654b1127c7eac8abbeca0a25d47552b012e86525bcdc6f6cb8a","dweb:/ipfs/QmYvAmmQL8FoTKK6Kb2rzHoUEVfK6gD4GwMXCcwynYJk7d"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmb9jAyXZyerkunTUvUJQpBX5oB3Neb59QaH7QiF4ydW1w/archive-info.json b/verification-sources/chain138-metadata-archive/Qmb9jAyXZyerkunTUvUJQpBX5oB3Neb59QaH7QiF4ydW1w/archive-info.json new file mode 100644 index 0000000..97215a0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb9jAyXZyerkunTUvUJQpBX5oB3Neb59QaH7QiF4ydW1w/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmb9jAyXZyerkunTUvUJQpBX5oB3Neb59QaH7QiF4ydW1w", + "metadata_digest": "be5b967782a914b41524df073cd023a347d4f2657510751bf2a7b6d28267b84a", + "source_path": "contracts/dex/DODOPMMIntegration.sol", + "contract_name": "DODOPMMIntegration", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmb9jAyXZyerkunTUvUJQpBX5oB3Neb59QaH7QiF4ydW1w/metadata.json b/verification-sources/chain138-metadata-archive/Qmb9jAyXZyerkunTUvUJQpBX5oB3Neb59QaH7QiF4ydW1w/metadata.json new file mode 100644 index 0000000..aff4b1d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmb9jAyXZyerkunTUvUJQpBX5oB3Neb59QaH7QiF4ydW1w/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"dodoVendingMachine_","type":"address"},{"internalType":"address","name":"dodoApprove_","type":"address"},{"internalType":"address","name":"officialUSDT_","type":"address"},{"internalType":"address","name":"officialUSDC_","type":"address"},{"internalType":"address","name":"compliantUSDT_","type":"address"},{"internalType":"address","name":"compliantUSDC_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpShares","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":false,"internalType":"address","name":"creator","type":"address"}],"name":"PoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":false,"internalType":"address","name":"importer","type":"address"}],"name":"PoolImported","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"}],"name":"PoolRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"bool","name":"standardSurface","type":"bool"}],"name":"PoolSurfaceValidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"reserveSystem","type":"address"}],"name":"ReserveSystemSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"trader","type":"address"}],"name":"SwapExecuted","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"baseShare","type":"uint256"},{"internalType":"uint256","name":"quoteShare","type":"uint256"},{"internalType":"uint256","name":"lpShare","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compliantUSDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compliantUSDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"initialPrice","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"createCUSDCUSDCPool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"initialPrice","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"createCUSDTCUSDCPool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"initialPrice","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"createCUSDTUSDTPool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"initialPrice","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"createPool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dodoApprove","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dodoVendingMachine","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllPools","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"getPoolConfig","outputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"internalType":"struct DODOPMMIntegration.PoolConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"getPoolPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"getPoolPriceOrOracle","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"getPoolReserves","outputs":[{"internalType":"uint256","name":"baseReserve","type":"uint256"},{"internalType":"uint256","name":"quoteReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasStandardPoolSurface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"initialPrice","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"importExistingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRegisteredPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"officialUSDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"officialUSDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolConfigs","outputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"refreshPoolSurface","outputs":[{"internalType":"bool","name":"standardSurface","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"removePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveSystem","outputs":[{"internalType":"contract IReserveSystem","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reserveSystem_","type":"address"}],"name":"setReserveSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapCUSDCForUSDC","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapCUSDTForUSDC","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapCUSDTForUSDT","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapExactIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapUSDCForCUSDC","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapUSDCForCUSDT","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapUSDTForCUSDT","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Manages liquidity pools on DODO and provides swap functionality between compliant tokens (cUSDT/cUSDC) and official tokens (USDT/USDC) This contract facilitates exchangeability between compliant and official tokens through DODO's Proactive Market Maker algorithm, which maintains price stability and provides efficient liquidity.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"addLiquidity(address,uint256,uint256)":{"params":{"baseAmount":"Amount of base token to deposit","pool":"Pool address","quoteAmount":"Amount of quote token to deposit"}},"createCUSDCUSDCPool(uint256,uint256,uint256,bool)":{"params":{"initialPrice":"Initial price (1e18 = $1)","isOpenTWAP":"Enable TWAP oracle","k":"Slippage factor","lpFeeRate":"Liquidity provider fee rate (basis points)"}},"createCUSDTCUSDCPool(uint256,uint256,uint256,bool)":{"params":{"initialPrice":"Initial price (1e18 = $1 for stablecoin pairs)","isOpenTWAP":"Enable TWAP oracle for price discovery","k":"Slippage factor (0.5e18 = 50%, lower = less slippage)","lpFeeRate":"Liquidity provider fee rate (basis points, 3 = 0.03%)"}},"createCUSDTUSDTPool(uint256,uint256,uint256,bool)":{"params":{"initialPrice":"Initial price (1e18 = $1 for stablecoin pairs)","isOpenTWAP":"Enable TWAP oracle for price discovery","k":"Slippage factor (0.5e18 = 50%, lower = less slippage, higher = more slippage)","lpFeeRate":"Liquidity provider fee rate (basis points, 3 = 0.03%)"}},"createPool(address,address,uint256,uint256,uint256,bool)":{"params":{"baseToken":"Base token address","initialPrice":"Initial price (1e18 = $1 for stablecoins)","isOpenTWAP":"Enable TWAP oracle for price discovery","k":"Slippage factor (0.5e18 = 50%, lower = less slippage)","lpFeeRate":"Liquidity provider fee rate (basis points, 3 = 0.03%)","quoteToken":"Quote token address"}},"getAllPools()":{"returns":{"_0":"List of all pool addresses"}},"getPoolConfig(address)":{"params":{"pool":"Pool address"},"returns":{"config":"Pool configuration struct"}},"getPoolPrice(address)":{"params":{"pool":"Pool address"},"returns":{"price":"Current mid price (1e18 = $1 for stablecoins)"}},"getPoolPriceOrOracle(address)":{"params":{"pool":"Pool address"},"returns":{"price":"Price in 18 decimals (quote per base; 1e18 = $1 for stablecoins)"}},"getPoolReserves(address)":{"params":{"pool":"Pool address"},"returns":{"baseReserve":"Base token reserve","quoteReserve":"Quote token reserve"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"importExistingPool(address,address,address,uint256,uint256,uint256,bool)":{"details":"Use this when the pool exists at the DODO/provider layer but was not recorded in the integration mappings or allPools inventory."},"refreshPoolSurface(address)":{"details":"Useful during migrations when a replacement pool has been seeded and should now qualify as a standard DODO venue for routers and indexers."},"removePool(address)":{"params":{"pool":"Pool address to remove"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setReserveSystem(address)":{"params":{"reserveSystem_":"ReserveSystem address (address(0) to disable)"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"swapCUSDCForUSDC(address,uint256,uint256)":{"params":{"amountIn":"Amount of cUSDC to sell","minAmountOut":"Minimum amount of USDC to receive","pool":"Pool address"}},"swapCUSDTForUSDT(address,uint256,uint256)":{"params":{"amountIn":"Amount of cUSDT to sell","minAmountOut":"Minimum amount of USDT to receive (slippage protection)","pool":"Pool address"}},"swapExactIn(address,address,uint256,uint256)":{"params":{"amountIn":"Amount of tokenIn","minAmountOut":"Minimum amount of tokenOut to receive","pool":"Pool address","tokenIn":"Token to sell"},"returns":{"amountOut":"Amount of quote/base token received (sent to msg.sender)"}},"swapUSDCForCUSDC(address,uint256,uint256)":{"params":{"amountIn":"Amount of USDC to sell","minAmountOut":"Minimum amount of cUSDC to receive","pool":"Pool address"}},"swapUSDTForCUSDT(address,uint256,uint256)":{"params":{"amountIn":"Amount of USDT to sell","minAmountOut":"Minimum amount of cUSDT to receive","pool":"Pool address"}}},"title":"DODOPMMIntegration","version":1},"userdoc":{"kind":"user","methods":{"addLiquidity(address,uint256,uint256)":{"notice":"Add liquidity to a DODO PMM pool"},"createCUSDCUSDCPool(uint256,uint256,uint256,bool)":{"notice":"Create DODO PMM pool for cUSDC/USDC pair"},"createCUSDTCUSDCPool(uint256,uint256,uint256,bool)":{"notice":"Create DODO PMM pool for cUSDT/cUSDC pair (public liquidity per VAULT_SYSTEM_MASTER_TECHNICAL_PLAN \u00a74)"},"createCUSDTUSDTPool(uint256,uint256,uint256,bool)":{"notice":"Create DODO PMM pool for cUSDT/USDT pair"},"createPool(address,address,uint256,uint256,uint256,bool)":{"notice":"Create DODO PMM pool for any base/quote token pair (generic)"},"getAllPools()":{"notice":"Get all registered pools"},"getPoolConfig(address)":{"notice":"Get pool configuration"},"getPoolPrice(address)":{"notice":"Get current pool price (pool mid only; use getPoolPriceOrOracle for oracle-backed price)"},"getPoolPriceOrOracle(address)":{"notice":"Get pool price: oracle (ReserveSystem) if configured and available, else pool getMidPrice()"},"getPoolReserves(address)":{"notice":"Get pool reserves"},"importExistingPool(address,address,address,uint256,uint256,uint256,bool)":{"notice":"Import an already-deployed DODO PMM pool into integration state."},"refreshPoolSurface(address)":{"notice":"Re-run full standard-surface validation for an already-registered pool."},"removePool(address)":{"notice":"Remove pool (emergency only)"},"reserveSystem()":{"notice":"Optional ReserveSystem for oracle-backed mid price (base/quote in reserve system)"},"setReserveSystem(address)":{"notice":"Set optional ReserveSystem for oracle-backed mid price"},"swapCUSDCForUSDC(address,uint256,uint256)":{"notice":"Swap cUSDC for official USDC via DODO PMM"},"swapCUSDTForUSDC(address,uint256,uint256)":{"notice":"Swap cUSDT for cUSDC via cUSDT/cUSDC DODO PMM pool (public liquidity pair per Master Plan \u00a74)"},"swapCUSDTForUSDT(address,uint256,uint256)":{"notice":"Swap cUSDT for official USDT via DODO PMM"},"swapExactIn(address,address,uint256,uint256)":{"notice":"Generic swap for any registered pool (full mesh routing)."},"swapUSDCForCUSDC(address,uint256,uint256)":{"notice":"Swap official USDC for cUSDC via DODO PMM"},"swapUSDCForCUSDT(address,uint256,uint256)":{"notice":"Swap cUSDC for cUSDT via cUSDT/cUSDC DODO PMM pool"},"swapUSDTForCUSDT(address,uint256,uint256)":{"notice":"Swap official USDT for cUSDT via DODO PMM"}},"notice":"Integration contract for DODO PMM pools with CompliantUSDT/USDC","version":1}},"settings":{"compilationTarget":{"contracts/dex/DODOPMMIntegration.sol":"DODOPMMIntegration"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dex/DODOPMMIntegration.sol":{"keccak256":"0x1405e3af6768c64eca2f10258049ad1c6ba71facaef4efe24a97ca6d5f068132","license":"MIT","urls":["bzz-raw://cda6ca9dd862d1bbf228d774aa6eb02c4608797da335ac32be00b3f8ad5c1721","dweb:/ipfs/Qmcko5CRpsfR4hx7QmndPUDjcD3bEtQdjzPcJe1u7jDEUB"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbBECzohsEpVh2LdEcA2svtFoaqsATg2fwicb5DbyUQp5/archive-info.json b/verification-sources/chain138-metadata-archive/QmbBECzohsEpVh2LdEcA2svtFoaqsATg2fwicb5DbyUQp5/archive-info.json new file mode 100644 index 0000000..bacc52d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbBECzohsEpVh2LdEcA2svtFoaqsATg2fwicb5DbyUQp5/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbBECzohsEpVh2LdEcA2svtFoaqsATg2fwicb5DbyUQp5", + "metadata_digest": "bebdff96c18f350c39ce965c43ff3ab88b360e07a6c38a8015591b09d61a8ede", + "source_path": "contracts/mirror/MirrorManager.sol", + "contract_name": "MirrorManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbBECzohsEpVh2LdEcA2svtFoaqsATg2fwicb5DbyUQp5/metadata.json b/verification-sources/chain138-metadata-archive/QmbBECzohsEpVh2LdEcA2svtFoaqsATg2fwicb5DbyUQp5/metadata.json new file mode 100644 index 0000000..20dc841 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbBECzohsEpVh2LdEcA2svtFoaqsATg2fwicb5DbyUQp5/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"srcChain","type":"uint64"},{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"uint64","name":"dstChain","type":"uint64"}],"name":"MirrorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"srcChain","type":"uint64"},{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"uint64","name":"dstChain","type":"uint64"},{"indexed":false,"internalType":"address","name":"dst","type":"address"}],"name":"MirrorSet","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"Processed","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChain","type":"uint64"},{"internalType":"address","name":"src","type":"address"},{"internalType":"uint64","name":"dstChain","type":"uint64"}],"name":"getMirror","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"markProcessed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"mirrors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChain","type":"uint64"},{"internalType":"address","name":"src","type":"address"},{"internalType":"uint64","name":"dstChain","type":"uint64"}],"name":"removeMirror","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChain","type":"uint64"},{"internalType":"address","name":"src","type":"address"},{"internalType":"uint64","name":"dstChain","type":"uint64"},{"internalType":"address","name":"dst","type":"address"}],"name":"setMirror","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"MirrorManager","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Registry of mirrored token/contract addresses across chains with replay protection and pausability","version":1}},"settings":{"compilationTarget":{"contracts/mirror/MirrorManager.sol":"MirrorManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/mirror/MirrorManager.sol":{"keccak256":"0x3b262b4cd4243273d69d11cb4db03b31cfb21065f4903d1e72fb0ecc0c4cc7f8","license":"MIT","urls":["bzz-raw://d0593f1abeae8e1ef368430f991c5653fc28cfb04fb517a35b3d8c0016f45874","dweb:/ipfs/QmeBJS4KrBvY2nUSY6tLkDdN2uFN4exTWvyLyaHUWPARR6"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbD8tWHMuVqdk94MU4xjh5ApHztde2yykyoXTxamLJL4q/archive-info.json b/verification-sources/chain138-metadata-archive/QmbD8tWHMuVqdk94MU4xjh5ApHztde2yykyoXTxamLJL4q/archive-info.json new file mode 100644 index 0000000..25bade6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbD8tWHMuVqdk94MU4xjh5ApHztde2yykyoXTxamLJL4q/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbD8tWHMuVqdk94MU4xjh5ApHztde2yykyoXTxamLJL4q", + "metadata_digest": "bf3b256031743efe2f9002a8de6e0bf0b8529172c16eeff0097e4c1cc64844a2", + "source_path": "@openzeppelin/contracts/utils/math/SignedMath.sol", + "contract_name": "SignedMath", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbD8tWHMuVqdk94MU4xjh5ApHztde2yykyoXTxamLJL4q/metadata.json b/verification-sources/chain138-metadata-archive/QmbD8tWHMuVqdk94MU4xjh5ApHztde2yykyoXTxamLJL4q/metadata.json new file mode 100644 index 0000000..1c1b3e5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbD8tWHMuVqdk94MU4xjh5ApHztde2yykyoXTxamLJL4q/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"details":"Standard signed math utilities missing in the Solidity language.","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/math/SignedMath.sol":"SignedMath"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbDBJ1RwCXwxFenkCHFYK2HavEa776UFw1qBwLoqiTFYJ/archive-info.json b/verification-sources/chain138-metadata-archive/QmbDBJ1RwCXwxFenkCHFYK2HavEa776UFw1qBwLoqiTFYJ/archive-info.json new file mode 100644 index 0000000..9373d96 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbDBJ1RwCXwxFenkCHFYK2HavEa776UFw1qBwLoqiTFYJ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbDBJ1RwCXwxFenkCHFYK2HavEa776UFw1qBwLoqiTFYJ", + "metadata_digest": "bf3ddd9708bb18b8bbc6eb05d8d7adf2ac2780eded84f062c0eb53115d644daf", + "source_path": "contracts/bridge/BridgeOrchestrator.sol", + "contract_name": "BridgeOrchestrator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbDBJ1RwCXwxFenkCHFYK2HavEa776UFw1qBwLoqiTFYJ/metadata.json b/verification-sources/chain138-metadata-archive/QmbDBJ1RwCXwxFenkCHFYK2HavEa776UFw1qBwLoqiTFYJ/metadata.json new file mode 100644 index 0000000..6171fb7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbDBJ1RwCXwxFenkCHFYK2HavEa776UFw1qBwLoqiTFYJ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"assetTypeHash","type":"bytes32"},{"indexed":false,"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"indexed":false,"internalType":"address","name":"bridgeContract","type":"address"}],"name":"AssetTypeBridgeRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"indexed":true,"internalType":"address","name":"bridgeContract","type":"address"},{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"BridgeRouted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"assetTypeHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"bridgeContract","type":"address"}],"name":"BridgeUnregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetRegistry","outputs":[{"internalType":"contract UniversalAssetRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum UniversalAssetRegistry.AssetType","name":"","type":"uint8"}],"name":"assetTypeStats","outputs":[{"internalType":"uint256","name":"totalBridges","type":"uint256"},{"internalType":"uint256","name":"successfulBridges","type":"uint256"},{"internalType":"uint256","name":"failedBridges","type":"uint256"},{"internalType":"uint256","name":"lastBridgeTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"assetTypeToBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32","name":"assetType","type":"bytes32"},{"internalType":"bool","name":"usePMM","type":"bool"},{"internalType":"bool","name":"useVault","type":"bool"},{"internalType":"bytes","name":"complianceProof","type":"bytes"},{"internalType":"bytes","name":"vaultInstructions","type":"bytes"}],"internalType":"struct UniversalCCIPBridge.BridgeOperation","name":"op","type":"tuple"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bridgeStats","outputs":[{"internalType":"uint256","name":"totalBridges","type":"uint256"},{"internalType":"uint256","name":"successfulBridges","type":"uint256"},{"internalType":"uint256","name":"failedBridges","type":"uint256"},{"internalType":"uint256","name":"lastBridgeTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultBridge","outputs":[{"internalType":"contract UniversalCCIPBridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"}],"name":"getAssetTypeStats","outputs":[{"components":[{"internalType":"uint256","name":"totalBridges","type":"uint256"},{"internalType":"uint256","name":"successfulBridges","type":"uint256"},{"internalType":"uint256","name":"failedBridges","type":"uint256"},{"internalType":"uint256","name":"lastBridgeTime","type":"uint256"}],"internalType":"struct BridgeOrchestrator.RoutingStats","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"}],"name":"getBridgeForAssetType","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bridgeContract","type":"address"}],"name":"getBridgeStats","outputs":[{"components":[{"internalType":"uint256","name":"totalBridges","type":"uint256"},{"internalType":"uint256","name":"successfulBridges","type":"uint256"},{"internalType":"uint256","name":"failedBridges","type":"uint256"},{"internalType":"uint256","name":"lastBridgeTime","type":"uint256"}],"internalType":"struct BridgeOrchestrator.RoutingStats","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_assetRegistry","type":"address"},{"internalType":"address","name":"_defaultBridge","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRegisteredBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"bridgeContract","type":"address"}],"name":"registerAssetTypeBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_defaultBridge","type":"address"}],"name":"setDefaultBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"}],"name":"unregisterBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"Central routing layer for multi-asset bridge system","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"title":"BridgeOrchestrator","version":1},"userdoc":{"kind":"user","methods":{"bridge((address,uint256,uint64,address,bytes32,bool,bool,bytes,bytes))":{"notice":"Route bridge request to appropriate bridge"},"registerAssetTypeBridge(uint8,address)":{"notice":"Register asset type bridge"},"setDefaultBridge(address)":{"notice":"Set default bridge"},"unregisterBridge(uint8)":{"notice":"Unregister bridge"}},"notice":"Routes bridge requests to appropriate asset-specific bridges","version":1}},"settings":{"compilationTarget":{"contracts/bridge/BridgeOrchestrator.sol":"BridgeOrchestrator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/BridgeOrchestrator.sol":{"keccak256":"0x2f6eeba4efce2c1a2de799639be9875007b162780900bdb63b3dc15589e1bddb","license":"MIT","urls":["bzz-raw://46064827f9772954434570562e39b03357666b24d1dc6a4d8cfe535c7906c0bf","dweb:/ipfs/QmVUr3vtTSNoVJwiwW1MhKEJnV9b9viGMTAfJs8WFupQz9"]},"contracts/bridge/UniversalCCIPBridge.sol":{"keccak256":"0xcdbe2bad1997db39d23990cc77a7e304ff228d4de878b0a897285e9eaf1f39ca","license":"MIT","urls":["bzz-raw://fe0c40c17b7869587ecacd0fe72f880a3e1e8a836d7f93650d52123bbc9efce2","dweb:/ipfs/QmXqoeHhNAJqJqA7NHw4WjpqWW8SXwVJ7TosQkTp74NiDY"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbEb6McFXcjaY5yiLqb589S9cYs21isnrqeubUnaqQwpw/archive-info.json b/verification-sources/chain138-metadata-archive/QmbEb6McFXcjaY5yiLqb589S9cYs21isnrqeubUnaqQwpw/archive-info.json new file mode 100644 index 0000000..be00ec3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbEb6McFXcjaY5yiLqb589S9cYs21isnrqeubUnaqQwpw/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbEb6McFXcjaY5yiLqb589S9cYs21isnrqeubUnaqQwpw", + "metadata_digest": "bf9a5b2b00ad014db1ad0937e8c41c657c668ae564e0b06359e8c2f85420e96c", + "source_path": "@openzeppelin/contracts/interfaces/draft-IERC1822.sol", + "contract_name": "IERC1822Proxiable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbEb6McFXcjaY5yiLqb589S9cYs21isnrqeubUnaqQwpw/metadata.json b/verification-sources/chain138-metadata-archive/QmbEb6McFXcjaY5yiLqb589S9cYs21isnrqeubUnaqQwpw/metadata.json new file mode 100644 index 0000000..4f88368 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbEb6McFXcjaY5yiLqb589S9cYs21isnrqeubUnaqQwpw/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified proxy whose upgrades are fully controlled by the current implementation.","kind":"dev","methods":{"proxiableUUID()":{"details":"Returns the storage slot that the proxiable contract assumes is being used to store the implementation address. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":"IERC1822Proxiable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbFGTy4GyK5dvMX8uqjm2qbGGeAMrMd5bKBJ64nrALPnb/archive-info.json b/verification-sources/chain138-metadata-archive/QmbFGTy4GyK5dvMX8uqjm2qbGGeAMrMd5bKBJ64nrALPnb/archive-info.json new file mode 100644 index 0000000..57f0cd6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbFGTy4GyK5dvMX8uqjm2qbGGeAMrMd5bKBJ64nrALPnb/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbFGTy4GyK5dvMX8uqjm2qbGGeAMrMd5bKBJ64nrALPnb", + "metadata_digest": "bfc6dff7b008bba6dd90f70955a7d2653fac45c30e5412127772f1de29a8e554", + "source_path": "contracts/ccip/CCIPRouter.sol", + "contract_name": "CCIPRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbFGTy4GyK5dvMX8uqjm2qbGGeAMrMd5bKBJ64nrALPnb/metadata.json b/verification-sources/chain138-metadata-archive/QmbFGTy4GyK5dvMX8uqjm2qbGGeAMrMd5bKBJ64nrALPnb/metadata.json new file mode 100644 index 0000000..65dfb6b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbFGTy4GyK5dvMX8uqjm2qbGGeAMrMd5bKBJ64nrALPnb/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_feeToken","type":"address"},{"internalType":"uint256","name":"_baseFee","type":"uint256"},{"internalType":"uint256","name":"_dataFeePerByte","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"indexed":false,"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"receiver","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"indexed":false,"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"bytes","name":"extraArgs","type":"bytes"}],"name":"MessageSent","type":"event"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"addSupportedChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"token","type":"address"}],"name":"addSupportedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"components":[{"internalType":"bytes","name":"receiver","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"address","name":"feeToken","type":"address"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"internalType":"struct IRouterClient.EVM2AnyMessage","name":"message","type":"tuple"}],"name":"ccipSend","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint256","name":"fees","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dataFeePerByte","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"components":[{"internalType":"bytes","name":"receiver","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"address","name":"feeToken","type":"address"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"internalType":"struct IRouterClient.EVM2AnyMessage","name":"message","type":"tuple"}],"name":"getFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"}],"name":"getSupportedTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"receivedMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"removeSupportedChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"sentMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"supportedChains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseFee","type":"uint256"},{"internalType":"uint256","name":"_dataFeePerByte","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawNativeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Implements message sending, fee calculation, and message validation","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"ccipSend(uint64,(bytes,bytes,(address,uint256,uint8)[],address,bytes))":{"params":{"destinationChainSelector":"The chain selector of the destination chain","message":"The message to send"},"returns":{"fees":"The fees required for the message","messageId":"The ID of the sent message"}},"getFee(uint64,(bytes,bytes,(address,uint256,uint8)[],address,bytes))":{"params":{"destinationChainSelector":"The chain selector of the destination chain","message":"The message to send"},"returns":{"fee":"The fee required for the message"}},"getSupportedTokens(uint64)":{"params":{"destinationChainSelector":"The chain selector of the destination chain"},"returns":{"tokens":"The list of supported tokens"}}},"title":"CCIP Router Implementation","version":1},"userdoc":{"events":{"MessageReceived(bytes32,uint64,address,bytes,(address,uint256,uint8)[])":{"notice":"Emitted when a message is received"},"MessageSent(bytes32,uint64,address,bytes,bytes,(address,uint256,uint8)[],address,bytes)":{"notice":"Emitted when a message is sent"}},"kind":"user","methods":{"addSupportedChain(uint64)":{"notice":"Add supported chain"},"addSupportedToken(uint64,address)":{"notice":"Add supported token for a chain"},"ccipSend(uint64,(bytes,bytes,(address,uint256,uint8)[],address,bytes))":{"notice":"Send a message to a destination chain"},"changeAdmin(address)":{"notice":"Change admin"},"getFee(uint64,(bytes,bytes,(address,uint256,uint8)[],address,bytes))":{"notice":"Get the fee for sending a message"},"getSupportedTokens(uint64)":{"notice":"Get supported tokens for a destination chain"},"removeSupportedChain(uint64)":{"notice":"Remove supported chain"},"updateFees(uint256,uint256)":{"notice":"Update fee configuration"},"withdrawFees(uint256)":{"notice":"Withdraw collected fees"},"withdrawNativeFees()":{"notice":"Withdraw all native token (ETH) fees"}},"notice":"Full Chainlink CCIP Router interface implementation","version":1}},"settings":{"compilationTarget":{"contracts/ccip/CCIPRouter.sol":"CCIPRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/ccip/CCIPRouter.sol":{"keccak256":"0x391fc2077dd036edb98f26d6bc05d61188270117498730ce75866373b8105512","license":"MIT","urls":["bzz-raw://e320bf73aa34be859b4de1d8caf2e32fb2b5beddfcd1c4625c3f01f6b5469456","dweb:/ipfs/QmdRVePXnLduqbfsdVNQukKFpfTQMBv9PSY944a3bB4woD"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbGqhct8grMY63p8thzZUpgwpD81JBa6SWyxoLmPLPjW6/archive-info.json b/verification-sources/chain138-metadata-archive/QmbGqhct8grMY63p8thzZUpgwpD81JBa6SWyxoLmPLPjW6/archive-info.json new file mode 100644 index 0000000..5f55cdb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbGqhct8grMY63p8thzZUpgwpD81JBa6SWyxoLmPLPjW6/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmbGqhct8grMY63p8thzZUpgwpD81JBa6SWyxoLmPLPjW6", + "metadata_digest": "c02e08f8f0310b5537dd10877ff92d98710b2433440e9fd9da826d03e111d85f", + "source_path": "contracts/vendor/sushiswap-v2/UniswapV2ERC20.sol", + "contract_name": "UniswapV2ERC20", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbGqhct8grMY63p8thzZUpgwpD81JBa6SWyxoLmPLPjW6/metadata.json b/verification-sources/chain138-metadata-archive/QmbGqhct8grMY63p8thzZUpgwpD81JBa6SWyxoLmPLPjW6/metadata.json new file mode 100644 index 0000000..e02bca7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbGqhct8grMY63p8thzZUpgwpD81JBa6SWyxoLmPLPjW6/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/UniswapV2ERC20.sol":"UniswapV2ERC20"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/UniswapV2ERC20.sol":{"keccak256":"0x2effe906b7ffa4fd9ff704fb426f46d21b9af881bbc9ca35f221531243251826","license":"GPL-3.0","urls":["bzz-raw://27a0ecc1fff91645ccd91ba3305272aeb3fbd124a48760e984a0b7c192946377","dweb:/ipfs/QmZpWRVXgSvesXppoitQiEWv4QWw5Xt1e34rxocYcswn1b"]},"contracts/vendor/sushiswap-v2/libraries/SafeMath.sol":{"keccak256":"0xbde2cf4655f2f21a4e6cc76c28cf88ade1d8150289c208d48662135be9d5dd97","license":"GPL-3.0","urls":["bzz-raw://bd8f46ed9dc5ad8123e596a3b762815503a04ce8a83098d80ba45085fe3c5953","dweb:/ipfs/QmUa6d2v7Miy26dzUctkrumi5My4G34TL9QNUj9u4hh7iS"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbHP9cFatvvK3vhsoH9PC4mXiaeDpeBKZb9zpyeqoUrjh/archive-info.json b/verification-sources/chain138-metadata-archive/QmbHP9cFatvvK3vhsoH9PC4mXiaeDpeBKZb9zpyeqoUrjh/archive-info.json new file mode 100644 index 0000000..681559f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbHP9cFatvvK3vhsoH9PC4mXiaeDpeBKZb9zpyeqoUrjh/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbHP9cFatvvK3vhsoH9PC4mXiaeDpeBKZb9zpyeqoUrjh", + "metadata_digest": "c05197f0a2fdc682a280948d79d99a333bd5ca9eb54220e41422b2e6673152e8", + "source_path": "@openzeppelin/contracts/access/AccessControl.sol", + "contract_name": "AccessControl", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbHP9cFatvvK3vhsoH9PC4mXiaeDpeBKZb9zpyeqoUrjh/metadata.json b/verification-sources/chain138-metadata-archive/QmbHP9cFatvvK3vhsoH9PC4mXiaeDpeBKZb9zpyeqoUrjh/metadata.json new file mode 100644 index 0000000..6fb3426 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbHP9cFatvvK3vhsoH9PC4mXiaeDpeBKZb9zpyeqoUrjh/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Contract module that allows children to implement role-based access control mechanisms. This is a lightweight version that doesn't allow enumerating role members except through off-chain means by accessing the contract event logs. Some applications may benefit from on-chain enumerability, for those cases see {AccessControlEnumerable}. Roles are referred to by their `bytes32` identifier. These should be exposed in the external API and be unique. The best way to achieve this is by using `public constant` hash digests: ```solidity bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\"); ``` Roles can be used to represent a set of permissions. To restrict access to a function call, use {hasRole}: ```solidity function foo() public { require(hasRole(MY_ROLE, msg.sender)); ... } ``` Roles can be granted and revoked dynamically via the {grantRole} and {revokeRole} functions. Each role has an associated admin role, and only accounts that have a role's admin role can call {grantRole} and {revokeRole}. By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means that only accounts with this role will be able to grant or revoke other roles. More complex role relationships can be created by using {_setRoleAdmin}. WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to grant and revoke this role. Extra precautions should be taken to secure accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} to enforce additional security measures for this role.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/access/AccessControl.sol":"AccessControl"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbP3SBNy6BkLHD3311WBimgsERh67sKFGYCsS3oR1uLN6/archive-info.json b/verification-sources/chain138-metadata-archive/QmbP3SBNy6BkLHD3311WBimgsERh67sKFGYCsS3oR1uLN6/archive-info.json new file mode 100644 index 0000000..a9869db --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbP3SBNy6BkLHD3311WBimgsERh67sKFGYCsS3oR1uLN6/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmbP3SBNy6BkLHD3311WBimgsERh67sKFGYCsS3oR1uLN6", + "metadata_digest": "c1c4c98fd399e0d9c42f079616df486c4bafdae815a443c8ce4d6bcc6632ab13", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IWETH.sol", + "contract_name": "IWETH", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbP3SBNy6BkLHD3311WBimgsERh67sKFGYCsS3oR1uLN6/metadata.json b/verification-sources/chain138-metadata-archive/QmbP3SBNy6BkLHD3311WBimgsERh67sKFGYCsS3oR1uLN6/metadata.json new file mode 100644 index 0000000..7817f5d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbP3SBNy6BkLHD3311WBimgsERh67sKFGYCsS3oR1uLN6/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IWETH.sol":"IWETH"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IWETH.sol":{"keccak256":"0x680172744962444cd2f8470d50991336b431fe4e29dd835018ac2f36e53344be","license":"GPL-3.0","urls":["bzz-raw://4eaabf44a03be36934e7102e102434350a866ba6f129cfa49ff842c8de73bf40","dweb:/ipfs/QmVXsCsEUeMXk4cJGYJ9toqw4V5T2XDuwaHWERdHA1SeDP"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbSHb2YZKuiLhmj7cBNiXeFGW5j4G6CJE28axTx3dqsgy/archive-info.json b/verification-sources/chain138-metadata-archive/QmbSHb2YZKuiLhmj7cBNiXeFGW5j4G6CJE28axTx3dqsgy/archive-info.json new file mode 100644 index 0000000..fab32ff --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbSHb2YZKuiLhmj7cBNiXeFGW5j4G6CJE28axTx3dqsgy/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbSHb2YZKuiLhmj7cBNiXeFGW5j4G6CJE28axTx3dqsgy", + "metadata_digest": "c2998838900524d20e9de04026bcf50ee44ced2db4fe2ebb4aba3d39ab1670d6", + "source_path": "contracts/bridge/trustless/libraries/FraudProofTypes.sol", + "contract_name": "FraudProofTypes", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbSHb2YZKuiLhmj7cBNiXeFGW5j4G6CJE28axTx3dqsgy/metadata.json b/verification-sources/chain138-metadata-archive/QmbSHb2YZKuiLhmj7cBNiXeFGW5j4G6CJE28axTx3dqsgy/metadata.json new file mode 100644 index 0000000..ecc6102 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbSHb2YZKuiLhmj7cBNiXeFGW5j4G6CJE28axTx3dqsgy/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"details":"Defines structures and encoding for different fraud proof types","kind":"dev","methods":{},"title":"FraudProofTypes","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Library for encoding/decoding fraud proof data","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/libraries/FraudProofTypes.sol":"FraudProofTypes"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/libraries/FraudProofTypes.sol":{"keccak256":"0x15e2c59fc46db2ddb33eda2bcd632392564d859942fb1e0026622201f45fe9ab","license":"MIT","urls":["bzz-raw://81e5b0e23122f0d1bccab7d8470987e3aaa787c2d02e140631ff70a83567ae2c","dweb:/ipfs/QmbxNW8tY3FnyFM5GKrEj9Vtr9kLSX6X78xKQGjPdbfd46"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbTkE5z8nkr9k9G92mZnhnNPpGX2zio9x4A8XBYDDauZj/archive-info.json b/verification-sources/chain138-metadata-archive/QmbTkE5z8nkr9k9G92mZnhnNPpGX2zio9x4A8XBYDDauZj/archive-info.json new file mode 100644 index 0000000..d9145d0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbTkE5z8nkr9k9G92mZnhnNPpGX2zio9x4A8XBYDDauZj/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbTkE5z8nkr9k9G92mZnhnNPpGX2zio9x4A8XBYDDauZj", + "metadata_digest": "c2f93bd2ac6fa98f49d4658a1182f35150987147b6979e9a37bef8ba7713bce2", + "source_path": "contracts/bridge/trustless/SwapBridgeSwapCoordinator.sol", + "contract_name": "SwapBridgeSwapCoordinator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbTkE5z8nkr9k9G92mZnhnNPpGX2zio9x4A8XBYDDauZj/metadata.json b/verification-sources/chain138-metadata-archive/QmbTkE5z8nkr9k9G92mZnhnNPpGX2zio9x4A8XBYDDauZj/metadata.json new file mode 100644 index 0000000..6a45080 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbTkE5z8nkr9k9G92mZnhnNPpGX2zio9x4A8XBYDDauZj/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_bridge","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientOutput","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"SameToken","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceToken","type":"address"},{"indexed":true,"internalType":"address","name":"bridgeableToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountBridged","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"destinationChain","type":"uint64"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"SwapAndBridgeExecuted","type":"event"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"contract UniversalCCIPBridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sourceToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"bridgeableToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32","name":"assetType","type":"bytes32"},{"internalType":"bool","name":"usePMM","type":"bool"},{"internalType":"bool","name":"useVault","type":"bool"}],"name":"swapAndBridge","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract EnhancedSwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"User approves coordinator for sourceToken; coordinator swaps via EnhancedSwapRouter (Dodoex) then calls UniversalCCIPBridge","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"swapAndBridge(address,uint256,uint256,address,uint64,address,bytes32,bool,bool)":{"params":{"amountIn":"Amount of source token","amountOutMin":"Minimum bridgeable token from swap (slippage protection; ignored if sourceToken == bridgeableToken)","assetType":"Asset type hash for bridge (from UniversalAssetRegistry)","bridgeableToken":"Token to bridge (WETH or stablecoin); must be registered on bridge","destinationChainSelector":"CCIP destination chain selector","recipient":"Recipient on destination chain","sourceToken":"Token user is sending (will be swapped if different from bridgeableToken)","usePMM":"Whether bridge should use PMM liquidity","useVault":"Whether bridge should use vault"}}},"title":"SwapBridgeSwapCoordinator","version":1},"userdoc":{"kind":"user","methods":{"swapAndBridge(address,uint256,uint256,address,uint64,address,bytes32,bool,bool)":{"notice":"Swap source token to bridgeable token then bridge to destination chain"}},"notice":"Coordinates source-chain swap (token A -> bridgeable token) then CCIP bridge in one flow","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/SwapBridgeSwapCoordinator.sol":"SwapBridgeSwapCoordinator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/UniversalCCIPBridge.sol":{"keccak256":"0xcdbe2bad1997db39d23990cc77a7e304ff228d4de878b0a897285e9eaf1f39ca","license":"MIT","urls":["bzz-raw://fe0c40c17b7869587ecacd0fe72f880a3e1e8a836d7f93650d52123bbc9efce2","dweb:/ipfs/QmXqoeHhNAJqJqA7NHw4WjpqWW8SXwVJ7TosQkTp74NiDY"]},"contracts/bridge/trustless/EnhancedSwapRouter.sol":{"keccak256":"0x7b0ff8b8f9efdf21c655af224adb375da88851180557cec99b7063c30a1d4f87","license":"MIT","urls":["bzz-raw://61fb6da1ad5a3ddf6a30fec013036d69b4fd32b5fa5dce4842a6afd897c9a22f","dweb:/ipfs/QmSoso3FZA4temTo3wXyhpRYyx88SM5f4NRaiaEi76fjKY"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]},"contracts/bridge/trustless/SwapBridgeSwapCoordinator.sol":{"keccak256":"0xb395dbcde0fda57df509c78b7025c96e330402d7fe1db01b5e76ed1855b2a4ce","license":"MIT","urls":["bzz-raw://e1aed34954158e7d1bafe98ff95cd35ef46b34912d43980d53bbb889ba66d6a7","dweb:/ipfs/QmfPaYoLtKWdue7VN56ziKbFnWenxrVaXRbDisC69eppus"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/IDodoexRouter.sol":{"keccak256":"0x308f04c802c19b06ee0e627b07fc2ebeee50ac4ad5d716e2c0c83a61acab0b7b","license":"MIT","urls":["bzz-raw://4075ad950eee500921c9d32dbd3f34dc87a83ab52c9186e6d29d52a77b0757c7","dweb:/ipfs/QmcBtfPDmBbuPMEm9CoDUWY16kv6UErDi6Ay4oGGhkqC72"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/interfaces/IWETH.sol":{"keccak256":"0x2797f22d48c59542f0c7eb5d4405c7c5c2156c764faf9798de2493e5f6487977","license":"MIT","urls":["bzz-raw://e876c569dce230e2eaf208885fa3df05879363b80df005bbe1841f404c789202","dweb:/ipfs/QmTMEUjEVx2ZvKKe7L6uuEWZYbFaTUYAkabF91189J5wMf"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/liquidity/interfaces/ILiquidityProvider.sol":{"keccak256":"0xa10b0aef06554835dc192851d0b487bc32d822f73d95558a82f9d37a29071248","license":"MIT","urls":["bzz-raw://5d579daa420f9219b117b44969f43058fbf81979f08a85403dbac621d64955b2","dweb:/ipfs/QmeDFsbuqfnFoVVZQ1S5LMriqLfB8H7qgkCS51yzCydwot"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbajKyiajxEH4r5V4KNorTGEWzVFTnZXV4UibZgegPyss/archive-info.json b/verification-sources/chain138-metadata-archive/QmbajKyiajxEH4r5V4KNorTGEWzVFTnZXV4UibZgegPyss/archive-info.json new file mode 100644 index 0000000..a46111d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbajKyiajxEH4r5V4KNorTGEWzVFTnZXV4UibZgegPyss/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmbajKyiajxEH4r5V4KNorTGEWzVFTnZXV4UibZgegPyss", + "metadata_digest": "c4c34893d5e274ada0ab0198427b18df574ec1b49f7464eb6821caaa1abc5c26", + "source_path": "contracts/vendor/uniswap-v2-core/libraries/Math.sol", + "contract_name": "Math", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbajKyiajxEH4r5V4KNorTGEWzVFTnZXV4UibZgegPyss/metadata.json b/verification-sources/chain138-metadata-archive/QmbajKyiajxEH4r5V4KNorTGEWzVFTnZXV4UibZgegPyss/metadata.json new file mode 100644 index 0000000..949c3a8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbajKyiajxEH4r5V4KNorTGEWzVFTnZXV4UibZgegPyss/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/libraries/Math.sol":"Math"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/libraries/Math.sol":{"keccak256":"0x05927cb4aa14897bd567607522c18d2d518fa803ade6f870fac244c6f3702a3b","urls":["bzz-raw://b2805464c2d75cbdd726d6bd5c9b8d1f2c8566b606ec769ffa9a194a42248862","dweb:/ipfs/QmWBa9BsCH8gbncvDFXmfMJX1USTHvAREtc8C7nz6miQpw"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbearMaFuoyu1qksLsDDFFrL91WvLzNokk15jZfNaX9fs/archive-info.json b/verification-sources/chain138-metadata-archive/QmbearMaFuoyu1qksLsDDFFrL91WvLzNokk15jZfNaX9fs/archive-info.json new file mode 100644 index 0000000..ba492ba --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbearMaFuoyu1qksLsDDFFrL91WvLzNokk15jZfNaX9fs/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbearMaFuoyu1qksLsDDFFrL91WvLzNokk15jZfNaX9fs", + "metadata_digest": "c5c005c94a8fb78abd46ad26c90b9a177f7442af418ccf9154a9f1d6ecd7af4e", + "source_path": "contracts/bridge/integration/WTokenReserveVerifier.sol", + "contract_name": "WTokenReserveVerifier", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbearMaFuoyu1qksLsDDFFrL91WvLzNokk15jZfNaX9fs/metadata.json b/verification-sources/chain138-metadata-archive/QmbearMaFuoyu1qksLsDDFFrL91WvLzNokk15jZfNaX9fs/metadata.json new file mode 100644 index 0000000..a54ed8d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbearMaFuoyu1qksLsDDFFrL91WvLzNokk15jZfNaX9fs/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"bridgeEscrowVault_","type":"address"},{"internalType":"address","name":"reserveOracle_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InsufficientReserve","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"TokenNotVerified","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"reserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"sufficient","type":"bool"}],"name":"ReserveVerified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"verified","type":"bool"}],"name":"TokenVerified","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeEscrowVault","outputs":[{"internalType":"contract BridgeEscrowVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isTokenVerified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveOracle","outputs":[{"internalType":"contract ReserveOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setReserveThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unregisterToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"verifiedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"internalType":"uint256","name":"destinationReserve","type":"uint256"},{"internalType":"uint256","name":"destinationSupply","type":"uint256"}],"name":"verifyDestinationReserve","outputs":[{"internalType":"bool","name":"verified","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"bridgeAmount","type":"uint256"}],"name":"verifyReserveBeforeBridge","outputs":[{"internalType":"bool","name":"verified","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"bridgeAmount","type":"uint256"}],"name":"verifyReserveWithOracle","outputs":[{"internalType":"bool","name":"verified","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Ensures 1:1 backing maintained across bridge operations","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"registerToken(address)":{"params":{"token":"W token address"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setReserveThreshold(uint256)":{"params":{"threshold":"Threshold in basis points (10000 = 100%)"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"unregisterToken(address)":{"params":{"token":"W token address"}},"verifyDestinationReserve(address,uint256,uint256,uint256)":{"params":{"bridgeAmount":"Amount bridged","destinationReserve":"Reserve on destination chain","destinationSupply":"Supply on destination chain (before minting bridged amount)","token":"W token address on destination chain"},"returns":{"verified":"True if destination reserve is sufficient"}},"verifyReserveBeforeBridge(address,uint256)":{"params":{"bridgeAmount":"Amount to bridge","token":"W token address"},"returns":{"verified":"True if reserve is sufficient"}},"verifyReserveWithOracle(address,uint256)":{"params":{"bridgeAmount":"Amount to bridge","token":"W token address"},"returns":{"verified":"True if reserve is sufficient according to oracle"}}},"title":"WTokenReserveVerifier","version":1},"userdoc":{"kind":"user","methods":{"isTokenVerified(address)":{"notice":"Check if token is verified"},"registerToken(address)":{"notice":"Register a W token for reserve verification"},"setReserveThreshold(uint256)":{"notice":"Set reserve verification threshold"},"unregisterToken(address)":{"notice":"Unregister a W token"},"verifyDestinationReserve(address,uint256,uint256,uint256)":{"notice":"Verify reserve on destination chain (after bridge)"},"verifyReserveBeforeBridge(address,uint256)":{"notice":"Verify reserve before bridge operation"},"verifyReserveWithOracle(address,uint256)":{"notice":"Verify reserve sufficiency using oracle"}},"notice":"Verifies W token reserves before allowing bridge operations","version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/WTokenReserveVerifier.sol":"WTokenReserveVerifier"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/bridge/integration/WTokenReserveVerifier.sol":{"keccak256":"0xd048dffbf4009294c372e3fec0e984bc2fcb4bdd356d8cc33b3dbbded45375f4","license":"MIT","urls":["bzz-raw://ddf0ff899a2ce7b6a15a8cabfbb61fbba4cf396a86c9c5e84d86c419d5943466","dweb:/ipfs/Qmc5YQdQiABL4npNxRQvMX6RnFvrSq7yuaP4g38shtUMWu"]},"contracts/bridge/interop/BridgeEscrowVault.sol":{"keccak256":"0x4411967c78a32fc800fd88c7875c4552e247579659899621e6b0dbe7d1cffd98","license":"MIT","urls":["bzz-raw://e1ccca6d988e95a0255160c5908691a99744f7f988653765d42e9d1b7019e357","dweb:/ipfs/QmUy33pNSkMciFLkoQpbP7kBSDcwLHiNS48xzeEvdktRmF"]},"contracts/iso4217w/interfaces/IISO4217WToken.sol":{"keccak256":"0xd583b83e8598f54e2f3cc5e8bf954441fa73e959a0b816522eb66528b248d412","license":"MIT","urls":["bzz-raw://103a3010d1805dc5e1bbda03ce9338e03aa0ca36a914677cd45ece3ec8868ae3","dweb:/ipfs/QmQDnC1kxKbtedmyjMN4W8oonbGQ4y6LARWWqn7jK4V8W9"]},"contracts/iso4217w/interfaces/IReserveOracle.sol":{"keccak256":"0x2f9808bf9f3816c6ecdf4ef1587561ad965533019d9ce776ade03b85cbca3984","license":"MIT","urls":["bzz-raw://02a32c5327766990352c77017831be93977e32944b078ed68d2583d3f1c06e97","dweb:/ipfs/QmNr3wLfNkxao2VWndxzMDpYDmqP1t5dYdY8NcFi7omFEU"]},"contracts/iso4217w/oracle/ReserveOracle.sol":{"keccak256":"0x82b62fe98aa8d2f2c17f10e3c614297e8e76754681c8e8ee2bc32552986cecc4","license":"MIT","urls":["bzz-raw://f0341c32cf56d1a344c55504671c4018eae5b349d8c0d1ef9b207b8d9fdb48af","dweb:/ipfs/QmS6dMYytEC46oijBSTb4AKejQvD8SgqKxSkFFQhqY9oiy"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbfWejuczVXAdXoWTrRB5ijJJezfXyAzCKBk4arS6aYuy/archive-info.json b/verification-sources/chain138-metadata-archive/QmbfWejuczVXAdXoWTrRB5ijJJezfXyAzCKBk4arS6aYuy/archive-info.json new file mode 100644 index 0000000..d9f001c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbfWejuczVXAdXoWTrRB5ijJJezfXyAzCKBk4arS6aYuy/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbfWejuczVXAdXoWTrRB5ijJJezfXyAzCKBk4arS6aYuy", + "metadata_digest": "c5fcdaaa9763597cda4ceee6912cad8c082ca846dfcead972a3d1be38f9cf634", + "source_path": "contracts/emoney/ComplianceRegistry.sol", + "contract_name": "ComplianceRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbfWejuczVXAdXoWTrRB5ijJJezfXyAzCKBk4arS6aYuy/metadata.json b/verification-sources/chain138-metadata-archive/QmbfWejuczVXAdXoWTrRB5ijJJezfXyAzCKBk4arS6aYuy/metadata.json new file mode 100644 index 0000000..e5e2f30 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbfWejuczVXAdXoWTrRB5ijJJezfXyAzCKBk4arS6aYuy/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"canTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"ComplianceRegistry","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Stub for build; full implementation when emoney module is restored","version":1}},"settings":{"compilationTarget":{"contracts/emoney/ComplianceRegistry.sol":"ComplianceRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/ComplianceRegistry.sol":{"keccak256":"0xc1477127bf8e7bfa2749793336a288bf2747002a4041291ce6fbb42d2fdfb0fc","license":"MIT","urls":["bzz-raw://fe9f4f299de6f9ba0a48bcd122266d26c4101684d5127512c0d9ee86db7f93cf","dweb:/ipfs/QmXWrGHhjCmBWkdoHtSHwqxY8JVAo8MBEvmLN4WyGkVUPx"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbiHsdx3qAYn8NWJWPYo5SUMUt7Lu4ERAMYNUbASVRzsb/archive-info.json b/verification-sources/chain138-metadata-archive/QmbiHsdx3qAYn8NWJWPYo5SUMUt7Lu4ERAMYNUbASVRzsb/archive-info.json new file mode 100644 index 0000000..dd60289 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbiHsdx3qAYn8NWJWPYo5SUMUt7Lu4ERAMYNUbASVRzsb/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbiHsdx3qAYn8NWJWPYo5SUMUt7Lu4ERAMYNUbASVRzsb", + "metadata_digest": "c6b3261cca596284b04ad49f036f8a277d4070135feb5517934c85d35f39dcda", + "source_path": "@openzeppelin/contracts/utils/introspection/IERC165.sol", + "contract_name": "IERC165", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbiHsdx3qAYn8NWJWPYo5SUMUt7Lu4ERAMYNUbASVRzsb/metadata.json b/verification-sources/chain138-metadata-archive/QmbiHsdx3qAYn8NWJWPYo5SUMUt7Lu4ERAMYNUbASVRzsb/metadata.json new file mode 100644 index 0000000..5e6ebae --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbiHsdx3qAYn8NWJWPYo5SUMUt7Lu4ERAMYNUbASVRzsb/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.","kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/introspection/IERC165.sol":"IERC165"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbkwUzcFWpgKbVkYHUimsjPovLskRMyafZExr2YhFgYnj/archive-info.json b/verification-sources/chain138-metadata-archive/QmbkwUzcFWpgKbVkYHUimsjPovLskRMyafZExr2YhFgYnj/archive-info.json new file mode 100644 index 0000000..640ddf2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbkwUzcFWpgKbVkYHUimsjPovLskRMyafZExr2YhFgYnj/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmbkwUzcFWpgKbVkYHUimsjPovLskRMyafZExr2YhFgYnj", + "metadata_digest": "c760d5f68b96f569ec73ce8b9bffcbebd7ab853b04afb6f7a06ec9d59cda3cf0", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IERC20.sol", + "contract_name": "IERC20", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbkwUzcFWpgKbVkYHUimsjPovLskRMyafZExr2YhFgYnj/metadata.json b/verification-sources/chain138-metadata-archive/QmbkwUzcFWpgKbVkYHUimsjPovLskRMyafZExr2YhFgYnj/metadata.json new file mode 100644 index 0000000..27894a7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbkwUzcFWpgKbVkYHUimsjPovLskRMyafZExr2YhFgYnj/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IERC20.sol":"IERC20"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IERC20.sol":{"keccak256":"0x61db17aebc5d812c7002d15c1da954065e56abe49d64b14c034abe5604d70eb3","urls":["bzz-raw://b006685e753f9120469f10b09c159f222d4cb8b507a6c1f0c14ed50c883ebe66","dweb:/ipfs/QmSyY7iTugbczPwfGK67etiyPULenYGzzRYbt8aabwwkUb"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbmAUc3mpHkSwxRcDXkpdxTb95qW23j1HTh6MJx8CwRTz/archive-info.json b/verification-sources/chain138-metadata-archive/QmbmAUc3mpHkSwxRcDXkpdxTb95qW23j1HTh6MJx8CwRTz/archive-info.json new file mode 100644 index 0000000..38019d7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbmAUc3mpHkSwxRcDXkpdxTb95qW23j1HTh6MJx8CwRTz/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbmAUc3mpHkSwxRcDXkpdxTb95qW23j1HTh6MJx8CwRTz", + "metadata_digest": "c76f8700e2cc2780817aa222fa20be0255948fa97064d025e6b7bdd2dc5f9d3d", + "source_path": "contracts/vendor/openzeppelin/UUPSUpgradeable.sol", + "contract_name": "UUPSUpgradeable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbmAUc3mpHkSwxRcDXkpdxTb95qW23j1HTh6MJx8CwRTz/metadata.json b/verification-sources/chain138-metadata-archive/QmbmAUc3mpHkSwxRcDXkpdxTb95qW23j1HTh6MJx8CwRTz/metadata.json new file mode 100644 index 0000000..a74ad50 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbmAUc3mpHkSwxRcDXkpdxTb95qW23j1HTh6MJx8CwRTz/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"Compatibility shim for OZ 4.x-style upgradeable UUPS initialization. The installed OZ 5.x upgradeable package re-exports the non-upgradeable UUPS contract and no longer includes `__UUPSUpgradeable_init()`. Several existing contracts in this repo still call that hook during initialization, so we keep a local wrapper that restores the expected no-op initializer surface.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":"UUPSUpgradeable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbmJJYZgM9YdtRtQdB39GFTSnjKNohgzJBcTr7rUuJPQg/archive-info.json b/verification-sources/chain138-metadata-archive/QmbmJJYZgM9YdtRtQdB39GFTSnjKNohgzJBcTr7rUuJPQg/archive-info.json new file mode 100644 index 0000000..266c350 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbmJJYZgM9YdtRtQdB39GFTSnjKNohgzJBcTr7rUuJPQg/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbmJJYZgM9YdtRtQdB39GFTSnjKNohgzJBcTr7rUuJPQg", + "metadata_digest": "c778607a4afc84dc764ca7b8fee033308a08ca565e20193c696d141ebd6b847d", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Callee.sol", + "contract_name": "IUniswapV2Callee", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbmJJYZgM9YdtRtQdB39GFTSnjKNohgzJBcTr7rUuJPQg/metadata.json b/verification-sources/chain138-metadata-archive/QmbmJJYZgM9YdtRtQdB39GFTSnjKNohgzJBcTr7rUuJPQg/metadata.json new file mode 100644 index 0000000..7260c1b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbmJJYZgM9YdtRtQdB39GFTSnjKNohgzJBcTr7rUuJPQg/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"uniswapV2Call","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Callee.sol":"IUniswapV2Callee"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Callee.sol":{"keccak256":"0xdb17a1fb73e261e736ae8862be2d9a32964fc4b3741f48980f5cdc9d92b99a96","urls":["bzz-raw://468dab23a95d9d9b7d6ce74008d45eef3de2f137ede604e6be6c5e7d0121c5e9","dweb:/ipfs/QmcXwjTfp6tCRgf1KsNQyUAtrqKhiaN6fbaHVGr22eficP"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbnyD99hYkZDY4AAAhqQrmywVvo2Xdv8g6F7VjN7b4ddP/archive-info.json b/verification-sources/chain138-metadata-archive/QmbnyD99hYkZDY4AAAhqQrmywVvo2Xdv8g6F7VjN7b4ddP/archive-info.json new file mode 100644 index 0000000..de47685 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbnyD99hYkZDY4AAAhqQrmywVvo2Xdv8g6F7VjN7b4ddP/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbnyD99hYkZDY4AAAhqQrmywVvo2Xdv8g6F7VjN7b4ddP", + "metadata_digest": "c7e5f3243a90fcfd8e474deba1b29cdc94660810368c3b3ef9dc6ff28a3171e6", + "source_path": "contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol", + "contract_name": "Chain138PilotCurve3Pool", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbnyD99hYkZDY4AAAhqQrmywVvo2Xdv8g6F7VjN7b4ddP/metadata.json b/verification-sources/chain138-metadata-archive/QmbnyD99hYkZDY4AAAhqQrmywVvo2Xdv8g6F7VjN7b4ddP/metadata.json new file mode 100644 index 0000000..f95656b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbnyD99hYkZDY4AAAhqQrmywVvo2Xdv8g6F7VjN7b4ddP/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"address","name":"token2","type":"address"},{"internalType":"uint256","name":"feeBps_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"i","type":"int128"},{"indexed":true,"internalType":"int128","name":"j","type":"int128"},{"indexed":false,"internalType":"uint256","name":"dx","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dy","type":"uint256"}],"name":"Exchanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount2","type":"uint256"}],"name":"Funded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"coins","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int128","name":"i","type":"int128"},{"internalType":"int128","name":"j","type":"int128"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"min_dy","type":"uint256"}],"name":"exchange","outputs":[{"internalType":"uint256","name":"dy","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"int128","name":"i","type":"int128"},{"internalType":"int128","name":"j","type":"int128"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"min_dy","type":"uint256"}],"name":"exchange_underlying","outputs":[{"internalType":"uint256","name":"dy","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint256","name":"amount2","type":"uint256"}],"name":"fund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int128","name":"i","type":"int128"},{"internalType":"int128","name":"j","type":"int128"},{"internalType":"uint256","name":"dx","type":"uint256"}],"name":"get_dy","outputs":[{"internalType":"uint256","name":"dy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"reserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":"Chain138PilotCurve3Pool"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":{"keccak256":"0x679c5ae8c6afb2de2dd20a67ea44b52fc119eff657a797f66b3c9822dded9dcf","license":"MIT","urls":["bzz-raw://927fc1104662d51150305ce34d60ff0856f22de1dc508eff188106970342f2f6","dweb:/ipfs/QmQZCZ5vF91AyGEToPuKvvdzLfkxWgrMQ3P2BAA4FzanoF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbofierUjB9apQDXnBE9aiEfFbkbHi6gsCtDFzpubNX3W/archive-info.json b/verification-sources/chain138-metadata-archive/QmbofierUjB9apQDXnBE9aiEfFbkbHi6gsCtDFzpubNX3W/archive-info.json new file mode 100644 index 0000000..2e486ca --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbofierUjB9apQDXnBE9aiEfFbkbHi6gsCtDFzpubNX3W/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbofierUjB9apQDXnBE9aiEfFbkbHi6gsCtDFzpubNX3W", + "metadata_digest": "c813c0d5140112adaf02dec1075b3b1d22f5cd958cb3cdb841be0ed8dfa216f1", + "source_path": "contracts/bridge/trustless/EnhancedSwapRouter.sol", + "contract_name": "EnhancedSwapRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbofierUjB9apQDXnBE9aiEfFbkbHi6gsCtDFzpubNX3W/metadata.json b/verification-sources/chain138-metadata-archive/QmbofierUjB9apQDXnBE9aiEfFbkbHi6gsCtDFzpubNX3W/metadata.json new file mode 100644 index 0000000..e4cba64 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbofierUjB9apQDXnBE9aiEfFbkbHi6gsCtDFzpubNX3W/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_uniswapV3Router","type":"address"},{"internalType":"address","name":"_curve3Pool","type":"address"},{"internalType":"address","name":"_dodoexRouter","type":"address"},{"internalType":"address","name":"_balancerVault","type":"address"},{"internalType":"address","name":"_oneInchRouter","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_dai","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"DodoRouteNotConfigured","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientOutput","type":"error"},{"inputs":[],"name":"InvalidProvider","type":"error"},{"inputs":[],"name":"InvalidRoutingConfig","type":"error"},{"inputs":[],"name":"ProviderDisabled","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"SwapFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum EnhancedSwapRouter.SwapProvider","name":"provider","type":"uint8"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ProviderToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sizeCategory","type":"uint256"},{"indexed":false,"internalType":"enum EnhancedSwapRouter.SwapProvider[]","name":"providers","type":"uint8[]"}],"name":"RoutingConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum EnhancedSwapRouter.SwapProvider","name":"provider","type":"uint8"},{"indexed":true,"internalType":"enum LiquidityPoolETH.AssetType","name":"inputAsset","type":"uint8"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasUsed","type":"uint256"}],"name":"SwapExecuted","type":"event"},{"inputs":[],"name":"COORDINATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_TIER_HIGH","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_TIER_LOW","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_TIER_MEDIUM","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MEDIUM_SWAP_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTING_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SMALL_SWAP_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum EnhancedSwapRouter.SwapProvider","name":"provider","type":"uint8"},{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"_executeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"_getBalancerQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"_getDodoexQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"_getUniswapV3Quote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balancerPoolIds","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balancerVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve3Pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dodoLiquidityProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"dodoPoolAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dodoexRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getQuotes","outputs":[{"internalType":"enum EnhancedSwapRouter.SwapProvider[]","name":"providers","type":"uint8[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneInchRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum EnhancedSwapRouter.SwapProvider","name":"","type":"uint8"}],"name":"providerEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"bytes32","name":"poolId","type":"bytes32"}],"name":"setBalancerPoolId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"}],"name":"setDodoLiquidityProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"address","name":"poolAddress","type":"address"}],"name":"setDodoPoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum EnhancedSwapRouter.SwapProvider","name":"provider","type":"uint8"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setProviderEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sizeCategory","type":"uint256"},{"internalType":"enum EnhancedSwapRouter.SwapProvider[]","name":"providers","type":"uint8[]"}],"name":"setRoutingConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_quoter","type":"address"}],"name":"setUniswapQuoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sizeBasedRouting","outputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum LiquidityPoolETH.AssetType","name":"inputAsset","type":"uint8"},{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"enum EnhancedSwapRouter.SwapProvider","name":"preferredProvider","type":"uint8"}],"name":"swapToStablecoin","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"enum EnhancedSwapRouter.SwapProvider","name":"providerUsed","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"swapTokenToToken","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapQuoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV3Router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Supports Uniswap V3, Curve, Dodoex PMM, Balancer, and 1inch aggregation","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"constructor":{"params":{"_balancerVault":"Balancer Vault address","_curve3Pool":"Curve 3pool address","_dai":"DAI address","_dodoexRouter":"Dodoex Router address","_oneInchRouter":"1inch Router address (can be address(0))","_uniswapV3Router":"Uniswap V3 SwapRouter address","_usdc":"USDC address","_usdt":"USDT address","_weth":"WETH address"}},"getQuotes(address,uint256)":{"params":{"amountIn":"Input amount","stablecoinToken":"Target stablecoin"},"returns":{"amounts":"Array of output amounts for each provider","providers":"Array of providers that returned quotes"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setBalancerPoolId(address,address,bytes32)":{"params":{"poolId":"Balancer pool ID","tokenIn":"Input token","tokenOut":"Output token"}},"setDodoLiquidityProvider(address)":{"params":{"provider":"Address of ILiquidityProvider-compatible contract"}},"setDodoPoolAddress(address,address,address)":{"params":{"poolAddress":"Dodo PMM pool address","tokenIn":"Input token","tokenOut":"Output token"}},"setProviderEnabled(uint8,bool)":{"params":{"enabled":"Whether to enable","provider":"Provider to toggle"}},"setRoutingConfig(uint256,uint8[])":{"params":{"providers":"Ordered list of providers to try","sizeCategory":"0 = small, 1 = medium, 2 = large"}},"setUniswapQuoter(address)":{"params":{"_quoter":"Quoter contract address (address(0) to use 0.5% slippage estimate)"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"swapToStablecoin(uint8,address,uint256,uint256,uint8)":{"params":{"amountIn":"Input amount","amountOutMin":"Minimum output (slippage protection)","inputAsset":"Input asset type (ETH or WETH)","preferredProvider":"Optional preferred provider (0 = auto-select)","stablecoinToken":"Target stablecoin"},"returns":{"amountOut":"Output amount","providerUsed":"Provider that executed the swap"}},"swapTokenToToken(address,address,uint256,uint256)":{"params":{"amountIn":"Input amount","amountOutMin":"Minimum output (slippage protection)","tokenIn":"Input token","tokenOut":"Output token"},"returns":{"amountOut":"Output amount"}}},"stateVariables":{"uniswapQuoter":{"details":"Uniswap V3 Quoter for on-chain quotes; set via setUniswapQuoter when deployed on 138/651940"}},"title":"EnhancedSwapRouter","version":1},"userdoc":{"kind":"user","methods":{"_executeSwap(uint8,address,uint256,uint256)":{"notice":"Execute swap via specified provider"},"_getBalancerQuote(address,uint256)":{"notice":"Get Balancer quote (view) When poolId configured, would query Balancer. Otherwise estimate for stablecoins."},"_getDodoexQuote(address,uint256)":{"notice":"Get Dodoex quote (view)"},"_getUniswapV3Quote(address,uint256)":{"notice":"Get Uniswap V3 quote (view) When UNISWAP_QUOTER_ADDRESS is configured, queries quoter. Otherwise returns estimate via amountIn * 9950/10000 (0.5% slippage) for stablecoin pairs."},"constructor":{"notice":"Constructor"},"getQuotes(address,uint256)":{"notice":"Get quote from all enabled providers"},"setBalancerPoolId(address,address,bytes32)":{"notice":"Set Balancer pool ID for a token pair"},"setDodoLiquidityProvider(address)":{"notice":"Set DODO liquidity provider implementation for environments that execute swaps via a local provider/integration instead of an external Dodoex router."},"setDodoPoolAddress(address,address,address)":{"notice":"Set Dodoex PMM pool address for a token pair"},"setProviderEnabled(uint8,bool)":{"notice":"Toggle provider on/off"},"setRoutingConfig(uint256,uint8[])":{"notice":"Set routing configuration for a size category"},"setUniswapQuoter(address)":{"notice":"Set Uniswap V3 Quoter address for on-chain quotes"},"swapToStablecoin(uint8,address,uint256,uint256,uint8)":{"notice":"Swap to stablecoin using intelligent routing"},"swapTokenToToken(address,address,uint256,uint256)":{"notice":"Swap arbitrary token pair via Dodoex when pool is configured"}},"notice":"Multi-protocol swap router with intelligent routing and decision logic","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/EnhancedSwapRouter.sol":"EnhancedSwapRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/trustless/EnhancedSwapRouter.sol":{"keccak256":"0x7b0ff8b8f9efdf21c655af224adb375da88851180557cec99b7063c30a1d4f87","license":"MIT","urls":["bzz-raw://61fb6da1ad5a3ddf6a30fec013036d69b4fd32b5fa5dce4842a6afd897c9a22f","dweb:/ipfs/QmSoso3FZA4temTo3wXyhpRYyx88SM5f4NRaiaEi76fjKY"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/IDodoexRouter.sol":{"keccak256":"0x308f04c802c19b06ee0e627b07fc2ebeee50ac4ad5d716e2c0c83a61acab0b7b","license":"MIT","urls":["bzz-raw://4075ad950eee500921c9d32dbd3f34dc87a83ab52c9186e6d29d52a77b0757c7","dweb:/ipfs/QmcBtfPDmBbuPMEm9CoDUWY16kv6UErDi6Ay4oGGhkqC72"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/interfaces/IWETH.sol":{"keccak256":"0x2797f22d48c59542f0c7eb5d4405c7c5c2156c764faf9798de2493e5f6487977","license":"MIT","urls":["bzz-raw://e876c569dce230e2eaf208885fa3df05879363b80df005bbe1841f404c789202","dweb:/ipfs/QmTMEUjEVx2ZvKKe7L6uuEWZYbFaTUYAkabF91189J5wMf"]},"contracts/liquidity/interfaces/ILiquidityProvider.sol":{"keccak256":"0xa10b0aef06554835dc192851d0b487bc32d822f73d95558a82f9d37a29071248","license":"MIT","urls":["bzz-raw://5d579daa420f9219b117b44969f43058fbf81979f08a85403dbac621d64955b2","dweb:/ipfs/QmeDFsbuqfnFoVVZQ1S5LMriqLfB8H7qgkCS51yzCydwot"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbscxSjAf6yjkuXX6zpkeCC6CaNL16DeRmYKjPNsqkqhD/archive-info.json b/verification-sources/chain138-metadata-archive/QmbscxSjAf6yjkuXX6zpkeCC6CaNL16DeRmYKjPNsqkqhD/archive-info.json new file mode 100644 index 0000000..8c6f935 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbscxSjAf6yjkuXX6zpkeCC6CaNL16DeRmYKjPNsqkqhD/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbscxSjAf6yjkuXX6zpkeCC6CaNL16DeRmYKjPNsqkqhD", + "metadata_digest": "c916f406d88ab67bc0dd5acad0f2d9a8a0f03a1bed146c64402f96f273a91514", + "source_path": "contracts/tokens/CompliantFiatTokenV2.sol", + "contract_name": "CompliantFiatTokenV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbscxSjAf6yjkuXX6zpkeCC6CaNL16DeRmYKjPNsqkqhD/metadata.json b/verification-sources/chain138-metadata-archive/QmbscxSjAf6yjkuXX6zpkeCC6CaNL16DeRmYKjPNsqkqhD/metadata.json new file mode 100644 index 0000000..73d4546 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbscxSjAf6yjkuXX6zpkeCC6CaNL16DeRmYKjPNsqkqhD/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"string","name":"currencyCode_","type":"string"},{"internalType":"string","name":"versionTag_","type":"string"},{"internalType":"address","name":"initialOperator","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"bool","name":"forwardCanonical_","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationAlreadyUsed","type":"error"},{"inputs":[{"internalType":"uint256","name":"validBefore","type":"uint256"}],"name":"AuthorizationExpired","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"authorizer","type":"address"}],"name":"AuthorizationInvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"address","name":"caller","type":"address"}],"name":"AuthorizationMustBeUsedByPayee","type":"error"},{"inputs":[{"internalType":"uint256","name":"validAfter","type":"uint256"}],"name":"AuthorizationNotYetValid","type":"error"},{"inputs":[{"internalType":"string","name":"aliasValue","type":"string"}],"name":"DuplicateAlias","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC2612ExpiredSignature","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC2612InvalidSigner","type":"error"},{"inputs":[],"name":"EmptyAlias","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"GovernanceControllerNotConfigured","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"GovernanceControllerOnly","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidAccountNonce","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint256","name":"attemptedPeriodMint","type":"uint256"}],"name":"MintCapExceeded","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"OwnerUnauthorized","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint256","name":"attemptedTotalSupply","type":"uint256"}],"name":"SupplyCapExceeded","type":"error"},{"inputs":[],"name":"ZeroGovernanceController","type":"error"},{"inputs":[],"name":"ZeroOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AuthorizationUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"}],"name":"CanonicalUnderlyingAssetUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"operationType","type":"bytes32"},{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"reasonHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"accountingRef","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"messageCorrelationId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"CompliantOperationDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mechanism","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisputeResolutionMechanismSet","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"forwardCanonical","type":"bool"}],"name":"ForwardCanonicalUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"}],"name":"GovernanceProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"JurisdictionDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"aliasValue","type":"string"}],"name":"LegacyAliasAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LegalNotice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"}],"name":"PrimaryJurisdictionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"approvalId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"actionType","type":"string"},{"indexed":false,"internalType":"bytes32","name":"referenceHash","type":"bytes32"}],"name":"RegulatoryApprovalRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"disclosureURI","type":"string"}],"name":"RegulatoryDisclosureURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reportingURI","type":"string"}],"name":"ReportingURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"storageNamespace","type":"bytes32"}],"name":"StorageNamespaceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"supervisionRequired","type":"bool"},{"indexed":false,"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"indexed":false,"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"}],"name":"SupervisionConfigurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"}],"name":"SupervisionProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"category","type":"string"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"SupervisoryNoticeRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"supplyCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintingPeriodCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintingPeriodDuration","type":"uint256"}],"name":"SupplyControlsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbolDisplay","type":"string"}],"name":"SymbolDisplayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"TokenURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"ValueTransferDeclared","type":"event"},{"inputs":[],"name":"BRIDGE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CANCEL_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COMPLIANCE_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISPUTE_RESOLUTION_MECHANISM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNANCE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_ARBITRATION_SUPPORT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_TRADE_TERMS_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_UNIFORM_RULES_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTRUMENT_CLASSIFICATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_20022_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_27001_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_3166_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_4217_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_8601_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JURISDICTION_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_ENFORCEABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_FRAMEWORK_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_JURISDICTION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_BURN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_MINT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_RECEIVE_WITH_AUTHORIZATION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_TRANSFER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATION_TRANSFER_WITH_AUTHORIZATION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RECEIVE_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATORY_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_OF_PROCESS_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPERVISOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFERABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAVEL_RULE_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"aliasValue","type":"string"}],"name":"addLegacyAlias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetVersionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"authorizationState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"reasonHash","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"cancelAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canonicalUnderlyingAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currencyCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintingPeriodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"aliasValue","type":"string"}],"name":"emergencyAddLegacyAlias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"disclosureURI_","type":"string"},{"internalType":"string","name":"reportingURI_","type":"string"}],"name":"emergencySetDisclosureMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"emergencySetForwardCanonical","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"governanceProfileId_","type":"bytes32"},{"internalType":"bytes32","name":"supervisionProfileId_","type":"bytes32"},{"internalType":"bytes32","name":"storageNamespace_","type":"bytes32"},{"internalType":"string","name":"jurisdiction_","type":"string"},{"internalType":"address","name":"canonicalUnderlyingAsset_","type":"address"},{"internalType":"bool","name":"supervisionRequired_","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired_","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod_","type":"uint256"}],"name":"emergencySetGovernanceMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"forwardCanonical_","type":"bool"},{"internalType":"string","name":"tokenURI_","type":"string"},{"internalType":"string","name":"symbolDisplay_","type":"string"}],"name":"emergencySetPresentationMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwardCanonical","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governmentApprovalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legacyAliases","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumUpgradeNoticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"reasonHash","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedInCurrentPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPeriodCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPeriodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"primaryJurisdiction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"receiveWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"recordLegalNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"approvalId","type":"bytes32"},{"internalType":"string","name":"actionType","type":"string"},{"internalType":"bytes32","name":"referenceHash","type":"bytes32"}],"name":"recordRegulatoryApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"noticeId","type":"bytes32"},{"internalType":"string","name":"category","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"name":"recordSupervisoryNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"regulatoryDisclosureURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reportingURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalUnderlyingAsset_","type":"address"}],"name":"setCanonicalUnderlyingAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setForwardCanonical","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governanceController_","type":"address"}],"name":"setGovernanceController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"governanceProfileId_","type":"bytes32"}],"name":"setGovernanceProfileId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"jurisdiction_","type":"string"}],"name":"setPrimaryJurisdiction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"disclosureURI_","type":"string"}],"name":"setRegulatoryDisclosureURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"reportingURI_","type":"string"}],"name":"setReportingURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"storageNamespace_","type":"bytes32"}],"name":"setStorageNamespace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"supervisionRequired_","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired_","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod_","type":"uint256"}],"name":"setSupervisionConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"supervisionProfileId_","type":"bytes32"}],"name":"setSupervisionProfileId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supplyCap_","type":"uint256"},{"internalType":"uint256","name":"mintingPeriodCap_","type":"uint256"},{"internalType":"uint256","name":"mintingPeriodDuration_","type":"uint256"}],"name":"setSupplyControls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbolDisplay_","type":"string"}],"name":"setSymbolDisplay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storageNamespace","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionProfileId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supervisionRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbolDisplay","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"versionTag","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedTransport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"InvalidAccountNonce(address,uint256)":[{"details":"The nonce used for an `account` is not the expected current nonce."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"EIP712DomainChanged()":{"details":"MAY be emitted to signal that the domain could have changed."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}."},"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"eip712Domain()":{"details":"See {IERC-5267}."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"name()":{"details":"Returns the name of the token."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"title":"CompliantFiatTokenV2","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Canonical GRU c* V2 money token with permit, authorization transfers, explicit audit attribution, role-gated mint/burn, and version-aware asset identity.","version":1}},"settings":{"compilationTarget":{"contracts/tokens/CompliantFiatTokenV2.sol":"CompliantFiatTokenV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Nonces.sol":{"keccak256":"0x0082767004fca261c332e9ad100868327a863a88ef724e844857128845ab350f","license":"MIT","urls":["bzz-raw://132dce9686a54e025eb5ba5d2e48208f847a1ec3e60a3e527766d7bf53fb7f9e","dweb:/ipfs/QmXn1a2nUZMpu2z6S88UoTfMVtY2YNh86iGrzJDYmMkKeZ"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/compliance/LegallyCompliantBaseV2.sol":{"keccak256":"0x8097270ea1c6c78c9d39861536d19d01318a136d425c85d758105de4eeb0049c","license":"MIT","urls":["bzz-raw://4a629636fc02ed9cfd4134274d8a2125e440d0b024793c1ab0d12a96422596d9","dweb:/ipfs/QmdvmzFw21CJzKAL4Cf89dssoSFCPhurNGn1fCDkAS3bBN"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/tokens/CompliantFiatTokenV2.sol":{"keccak256":"0x397d0a74841b3fdafb237597c704ae2e143cf77210ca2890c844935ea6c14995","license":"MIT","urls":["bzz-raw://572326b14b654fcab80768037fff300282cae505aef1bac34e78df358a842f36","dweb:/ipfs/QmNmYsUHEM9ZJbcrPTu2gYpqLwsbKAjtDG74ZX8hfKNp23"]},"contracts/tokens/interfaces/ICompliantFiatTokenV2.sol":{"keccak256":"0xe3c7a30c697eb0b1088ac434537edb848e41e7575f2f8c278879d87ace145145","license":"MIT","urls":["bzz-raw://85b112dc21132487dd6a7361d142748005721ae16d7ed2647c0df4630048f55c","dweb:/ipfs/QmNr8eX8kR82ZR388uhAJDKZopn3pLX3YN7pDqELwiWo8w"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmbuz2ix71E7ncJhDd3uzkqQA11aiVHNaojus7ruNNNKPp/archive-info.json b/verification-sources/chain138-metadata-archive/Qmbuz2ix71E7ncJhDd3uzkqQA11aiVHNaojus7ruNNNKPp/archive-info.json new file mode 100644 index 0000000..6db3c1b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmbuz2ix71E7ncJhDd3uzkqQA11aiVHNaojus7ruNNNKPp/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "Qmbuz2ix71E7ncJhDd3uzkqQA11aiVHNaojus7ruNNNKPp", + "metadata_digest": "c9b1f16c19dd30f854f4598b472aa9ffcfa36d3b11e2fbd6d468a89d4706b0eb", + "source_path": "contracts/vendor/sushiswap-v2/libraries/UniswapV2Library.sol", + "contract_name": "UniswapV2Library", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmbuz2ix71E7ncJhDd3uzkqQA11aiVHNaojus7ruNNNKPp/metadata.json b/verification-sources/chain138-metadata-archive/Qmbuz2ix71E7ncJhDd3uzkqQA11aiVHNaojus7ruNNNKPp/metadata.json new file mode 100644 index 0000000..58128b1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmbuz2ix71E7ncJhDd3uzkqQA11aiVHNaojus7ruNNNKPp/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/libraries/UniswapV2Library.sol":"UniswapV2Library"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x08f9a63b34855eec941be8d36a04424f1a1725a2c030373fcef3afeb480ca385","license":"GPL-3.0","urls":["bzz-raw://174219f9a6c90b4d0133475da5333403aea21ba49d303f3ba28cb4e9a2a0141e","dweb:/ipfs/QmdDy25xsAfWxaKnRbGJys7d9BaPhpbGorMQCY4Au2auZL"]},"contracts/vendor/sushiswap-v2/libraries/SafeMath.sol":{"keccak256":"0xbde2cf4655f2f21a4e6cc76c28cf88ade1d8150289c208d48662135be9d5dd97","license":"GPL-3.0","urls":["bzz-raw://bd8f46ed9dc5ad8123e596a3b762815503a04ce8a83098d80ba45085fe3c5953","dweb:/ipfs/QmUa6d2v7Miy26dzUctkrumi5My4G34TL9QNUj9u4hh7iS"]},"contracts/vendor/sushiswap-v2/libraries/UniswapV2Library.sol":{"keccak256":"0x0f9b5380ff674e29e702eb9e472e728222fb3ec65f38aef03336c8a82e2ad80d","license":"GPL-3.0","urls":["bzz-raw://154392fa8d31dbded1ebe0b7591643ce4b35011dfb3ad90742d8355428c729f1","dweb:/ipfs/QmNhNPjbYt3CBoEstVNEcR2C34eRYxFXpaAqCWJXpj2rvP"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbwR2RgkV2skPhmkBLZ1bjJvswNaTah3UsxyxWhgPC273/archive-info.json b/verification-sources/chain138-metadata-archive/QmbwR2RgkV2skPhmkBLZ1bjJvswNaTah3UsxyxWhgPC273/archive-info.json new file mode 100644 index 0000000..8fa3e34 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbwR2RgkV2skPhmkBLZ1bjJvswNaTah3UsxyxWhgPC273/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbwR2RgkV2skPhmkBLZ1bjJvswNaTah3UsxyxWhgPC273", + "metadata_digest": "ca0fc9207c41334e443ee8008cae9a6594f3a214965f684d0eb6340198c9e67a", + "source_path": "contracts/bridge/trustless/BondManager.sol", + "contract_name": "BondManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbwR2RgkV2skPhmkBLZ1bjJvswNaTah3UsxyxWhgPC273/metadata.json b/verification-sources/chain138-metadata-archive/QmbwR2RgkV2skPhmkBLZ1bjJvswNaTah3UsxyxWhgPC273/metadata.json new file mode 100644 index 0000000..e6bc2c2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbwR2RgkV2skPhmkBLZ1bjJvswNaTah3UsxyxWhgPC273/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"_bondMultiplier","type":"uint256"},{"internalType":"uint256","name":"_minBond","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BondAlreadyReleased","type":"error"},{"inputs":[],"name":"BondAlreadySlashed","type":"error"},{"inputs":[],"name":"BondNotFound","type":"error"},{"inputs":[],"name":"BondNotReleased","type":"error"},{"inputs":[],"name":"InsufficientBond","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"ZeroDepositId","type":"error"},{"inputs":[],"name":"ZeroRelayer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"relayer","type":"address"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"BondPosted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"relayer","type":"address"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"BondReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"relayer","type":"address"},{"indexed":true,"internalType":"address","name":"challenger","type":"address"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"challengerReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnedAmount","type":"uint256"}],"name":"BondSlashed","type":"event"},{"inputs":[],"name":"bondMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bonds","outputs":[{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"bool","name":"slashed","type":"bool"},{"internalType":"bool","name":"released","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"getBond","outputs":[{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"slashed","type":"bool"},{"internalType":"bool","name":"released","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"getRequiredBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"relayer","type":"address"}],"name":"getTotalBonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"address","name":"relayer","type":"address"}],"name":"postBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"releaseBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"depositIds","type":"uint256[]"}],"name":"releaseBondsBatch","outputs":[{"internalType":"uint256","name":"totalReleased","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"challenger","type":"address"}],"name":"slashBond","outputs":[{"internalType":"uint256","name":"challengerReward","type":"uint256"},{"internalType":"uint256","name":"burnedAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalBonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEthHeld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Bonds are posted in ETH. Slashed bonds split 50% to challenger, 50% burned (sent to address(0)).","errors":{"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{"constructor":{"params":{"_bondMultiplier":"Bond multiplier in basis points (11000 = 110% = 1.1x)","_minBond":"Minimum bond amount in wei"}},"getBond(uint256)":{"params":{"depositId":"Deposit ID to check"},"returns":{"amount":"Bond amount","relayer":"Address that posted the bond","released":"Whether bond has been released","slashed":"Whether bond has been slashed"}},"getRequiredBond(uint256)":{"params":{"depositAmount":"Amount of the deposit"},"returns":{"_0":"requiredBond Minimum bond amount required"}},"getTotalBonds(address)":{"params":{"relayer":"Address to check"},"returns":{"_0":"Total amount of bonds posted"}},"postBond(uint256,uint256,address)":{"params":{"depositAmount":"Amount of the deposit (used to calculate bond size)","depositId":"Deposit ID from source chain","relayer":"Address of the relayer posting the bond (can be different from msg.sender if called by InboxETH)"},"returns":{"_0":"bondAmount The bond amount that was posted"}},"releaseBond(uint256)":{"params":{"depositId":"Deposit ID associated with the bond"},"returns":{"_0":"bondAmount Amount returned to relayer"}},"releaseBondsBatch(uint256[])":{"params":{"depositIds":"Array of deposit IDs to release bonds for"},"returns":{"totalReleased":"Total amount released"}},"slashBond(uint256,address)":{"params":{"challenger":"Address of the challenger proving fraud","depositId":"Deposit ID associated with the bond"},"returns":{"burnedAmount":"Amount burned (sent to address(0))","challengerReward":"Amount sent to challenger"}}},"title":"BondManager","version":1},"userdoc":{"kind":"user","methods":{"constructor":{"notice":"Constructor sets bond parameters"},"getBond(uint256)":{"notice":"Get bond information for a deposit"},"getRequiredBond(uint256)":{"notice":"Calculate required bond amount for a deposit"},"getTotalBonds(address)":{"notice":"Get total bonds posted by a relayer"},"postBond(uint256,uint256,address)":{"notice":"Post bond for a claim"},"releaseBond(uint256)":{"notice":"Release bond after successful claim finalization"},"releaseBondsBatch(uint256[])":{"notice":"Release multiple bonds in batch (gas optimization)"},"slashBond(uint256,address)":{"notice":"Slash bond due to fraudulent claim"},"totalEthHeld()":{"notice":"Total ETH held in active (non-released, non-slashed) bonds. Used for value-conservation invariant."}},"notice":"Manages bonds for trustless bridge claims with dynamic sizing and slashing","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/BondManager.sol":"BondManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/BondManager.sol":{"keccak256":"0xd9c903ba88cae86f3477b282c24308a3e8da48885518337e551f747576edab8f","license":"MIT","urls":["bzz-raw://77b72abe65c34dbe450d7bef2be8bf49ce2e188fb18955143cae39d1318ed510","dweb:/ipfs/QmTZXXgixwpjzcsGuqRS6X9JWwaFawg2g6ptHWLNoGzeN2"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmbytvTfRk87uxevoRmDmPyvXhCaXHcHJf9NuNXtnJwdEd/archive-info.json b/verification-sources/chain138-metadata-archive/QmbytvTfRk87uxevoRmDmPyvXhCaXHcHJf9NuNXtnJwdEd/archive-info.json new file mode 100644 index 0000000..bab2698 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbytvTfRk87uxevoRmDmPyvXhCaXHcHJf9NuNXtnJwdEd/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmbytvTfRk87uxevoRmDmPyvXhCaXHcHJf9NuNXtnJwdEd", + "metadata_digest": "cab27d9c4db0f855aa9e655a158a8cfe65d61bf999fc69a32b34369a20655686", + "source_path": "contracts/reserve/PriceFeedKeeper.sol", + "contract_name": "PriceFeedKeeper", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmbytvTfRk87uxevoRmDmPyvXhCaXHcHJf9NuNXtnJwdEd/metadata.json b/verification-sources/chain138-metadata-archive/QmbytvTfRk87uxevoRmDmPyvXhCaXHcHJf9NuNXtnJwdEd/metadata.json new file mode 100644 index 0000000..4b9ed2c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmbytvTfRk87uxevoRmDmPyvXhCaXHcHJf9NuNXtnJwdEd/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"oraclePriceFeed_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"}],"name":"AssetTracked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"}],"name":"AssetUntracked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"MaxUpdatesPerCallChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"assets","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PriceFeedsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldInterval","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newInterval","type":"uint256"}],"name":"UpdateIntervalChanged","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KEEPER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPKEEPER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"updateNeeded","type":"bool"},{"internalType":"address[]","name":"assets","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTrackedAssets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUpkeepGasEstimate","outputs":[{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTracked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUpdatesPerCall","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"needsUpdate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oraclePriceFeed","outputs":[{"internalType":"contract OraclePriceFeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performUpkeep","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"address[]","name":"updatedAssets","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxUpdatesPerCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oraclePriceFeed_","type":"address"}],"name":"setOraclePriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setUpdateInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"trackAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"trackedAssets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"untrackAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"}],"name":"updateAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Can be called by external keepers (Chainlink Keepers, Gelato, etc.) to update price feeds","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"checkUpkeep()":{"returns":{"assets":"Array of assets that need updating","updateNeeded":"True if any assets need updating"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getTrackedAssets()":{"returns":{"_0":"assets Array of tracked asset addresses"}},"getUpkeepGasEstimate()":{"returns":{"gasEstimate":"Estimated gas needed for upkeep"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"needsUpdate(address)":{"params":{"asset":"Address of the asset"},"returns":{"_0":"needsUpdate True if asset needs updating"}},"performUpkeep()":{"returns":{"success":"True if updates were successful","updatedAssets":"Array of assets that were updated"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setMaxUpdatesPerCall(uint256)":{"params":{"max":"New maximum updates per call"}},"setOraclePriceFeed(address)":{"params":{"oraclePriceFeed_":"New oracle price feed address"}},"setUpdateInterval(uint256)":{"params":{"interval":"New update interval in seconds"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"trackAsset(address)":{"params":{"asset":"Address of the asset to track"}},"untrackAsset(address)":{"params":{"asset":"Address of the asset to untrack"}},"updateAssets(address[])":{"params":{"assets":"Array of asset addresses to update"}}},"title":"PriceFeedKeeper","version":1},"userdoc":{"kind":"user","methods":{"checkUpkeep()":{"notice":"Check if any assets need updating"},"getTrackedAssets()":{"notice":"Get all tracked assets"},"getUpkeepGasEstimate()":{"notice":"Get gas estimate for upkeep"},"needsUpdate(address)":{"notice":"Check if a specific asset needs updating"},"performUpkeep()":{"notice":"Perform upkeep - update price feeds that need updating"},"setMaxUpdatesPerCall(uint256)":{"notice":"Set maximum updates per call"},"setOraclePriceFeed(address)":{"notice":"Set oracle price feed address"},"setUpdateInterval(uint256)":{"notice":"Set update interval"},"trackAsset(address)":{"notice":"Add asset to tracking list"},"untrackAsset(address)":{"notice":"Remove asset from tracking list"},"updateAssets(address[])":{"notice":"Update specific assets"}},"notice":"Keeper contract for automated price feed updates","version":1}},"settings":{"compilationTarget":{"contracts/reserve/PriceFeedKeeper.sol":"PriceFeedKeeper"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/oracle/IAggregator.sol":{"keccak256":"0xcdbf107184805058e5725282eb6ade5778fe5ac5ac4cacc3d12438d2292e2951","license":"MIT","urls":["bzz-raw://552f85c4185c0c6273b28a9b5f5473154c0d490885e597dae305882d64377809","dweb:/ipfs/QmXMp3tKq42tUr1RoxhC81vfwQ7aYPFsGkpq5SHTpUmsnu"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]},"contracts/reserve/OraclePriceFeed.sol":{"keccak256":"0xaf62465e45e1a8466c7a66bb6e65ef497f3fc0a1d498887fa700d1e959e59a2e","license":"MIT","urls":["bzz-raw://209c8e0b8dfcc3f65c1178c043a32f973b58583dd26fde8ef20bdd7fc4480717","dweb:/ipfs/QmctVjoAtoyHK9jUfeF3RBGt2dvzKKpcTpG5SR4HEyjG3o"]},"contracts/reserve/PriceFeedKeeper.sol":{"keccak256":"0xd94a5850627cbc41b6127f6a6c40082c6f90a914c46d803a80ce1c75330b141e","license":"MIT","urls":["bzz-raw://e7ede5ec5fe30f3c05e12f54b8a20653518cacf1173ada31ff20ed4867c2ec5c","dweb:/ipfs/QmPbGz5Rb5fUQJivQX4L1YD2xjFNH7eFBk6h4b3yfVoEKF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmc2qTwXGfS8TDHYvapZeSbCW7brkxxfTQDCyRiJGoDTXf/archive-info.json b/verification-sources/chain138-metadata-archive/Qmc2qTwXGfS8TDHYvapZeSbCW7brkxxfTQDCyRiJGoDTXf/archive-info.json new file mode 100644 index 0000000..c439196 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmc2qTwXGfS8TDHYvapZeSbCW7brkxxfTQDCyRiJGoDTXf/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmc2qTwXGfS8TDHYvapZeSbCW7brkxxfTQDCyRiJGoDTXf", + "metadata_digest": "cb7352f0a93fb8ca2b6453909918d7c6bbbd2b10df08de86be8aa40ec060907a", + "source_path": "contracts/oracle/Aggregator.sol", + "contract_name": "Aggregator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmc2qTwXGfS8TDHYvapZeSbCW7brkxxfTQDCyRiJGoDTXf/metadata.json b/verification-sources/chain138-metadata-archive/Qmc2qTwXGfS8TDHYvapZeSbCW7brkxxfTQDCyRiJGoDTXf/metadata.json new file mode 100644 index 0000000..4330341 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmc2qTwXGfS8TDHYvapZeSbCW7brkxxfTQDCyRiJGoDTXf/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_description","type":"string"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_heartbeat","type":"uint256"},{"internalType":"uint256","name":"_deviationThreshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"current","type":"int256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedAt","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"DeviationThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldHeartbeat","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newHeartbeat","type":"uint256"}],"name":"HeartbeatUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"startedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startedAt","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"}],"name":"TransmitterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"}],"name":"TransmitterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"transmitter","type":"address"}],"name":"addTransmitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deviationThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransmitters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"heartbeat","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTransmitter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"transmitter","type":"address"}],"name":"removeTransmitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint256","name":"answer","type":"uint256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint256","name":"answeredInRound","type":"uint256"},{"internalType":"address","name":"transmitter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transmitters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"answer","type":"uint256"}],"name":"updateAnswer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateDeviationThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newHeartbeat","type":"uint256"}],"name":"updateHeartbeat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Implements round-based oracle updates with access control","kind":"dev","methods":{"updateAnswer(uint256)":{"params":{"answer":"New answer value"}}},"title":"Oracle Aggregator","version":1},"userdoc":{"kind":"user","methods":{"addTransmitter(address)":{"notice":"Add a transmitter"},"changeAdmin(address)":{"notice":"Change admin"},"getRoundData(uint80)":{"notice":"Get round data for a specific round"},"getTransmitters()":{"notice":"Get list of transmitters"},"latestAnswer()":{"notice":"Get the latest answer"},"latestRoundData()":{"notice":"Get the latest round data"},"pause()":{"notice":"Pause the aggregator"},"removeTransmitter(address)":{"notice":"Remove a transmitter"},"unpause()":{"notice":"Unpause the aggregator"},"updateAnswer(uint256)":{"notice":"Update the answer for the current round"},"updateDeviationThreshold(uint256)":{"notice":"Update deviation threshold"},"updateHeartbeat(uint256)":{"notice":"Update heartbeat"}},"notice":"Chainlink-compatible oracle aggregator for price feeds","version":1}},"settings":{"compilationTarget":{"contracts/oracle/Aggregator.sol":"Aggregator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/oracle/Aggregator.sol":{"keccak256":"0x3fc143b0a198de17d066c05f311edfb3daecef9cc930b7cec2533c63349d6542","license":"MIT","urls":["bzz-raw://8295b365e9a3b2c659bda05e4f0f8e2c42c53e678d9d8e9a3ce98370f8e25ab4","dweb:/ipfs/QmQvtqXXpuLdspqrDXRz8q68HdpNHXKTdG8P9tWiffBrAj"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmc4ovELPALsGgVPyfva75MNeRAETvpLKn2aXtJf4h6Ur1/archive-info.json b/verification-sources/chain138-metadata-archive/Qmc4ovELPALsGgVPyfva75MNeRAETvpLKn2aXtJf4h6Ur1/archive-info.json new file mode 100644 index 0000000..d273e7d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmc4ovELPALsGgVPyfva75MNeRAETvpLKn2aXtJf4h6Ur1/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmc4ovELPALsGgVPyfva75MNeRAETvpLKn2aXtJf4h6Ur1", + "metadata_digest": "cbf4bc9944c2c822e0bc606257c1f261bbe7a33769d1ccd8b50d7a4f57d9f70e", + "source_path": "contracts/emoney/PolicyManager.sol", + "contract_name": "PolicyManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmc4ovELPALsGgVPyfva75MNeRAETvpLKn2aXtJf4h6Ur1/metadata.json b/verification-sources/chain138-metadata-archive/Qmc4ovELPALsGgVPyfva75MNeRAETvpLKn2aXtJf4h6Ur1/metadata.json new file mode 100644 index 0000000..dfa8107 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmc4ovELPALsGgVPyfva75MNeRAETvpLKn2aXtJf4h6Ur1/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"canTransfer","outputs":[{"internalType":"bool","name":"isAuthorized","type":"bool"},{"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"canTransferWithContext","outputs":[{"internalType":"bool","name":"isAuthorized","type":"bool"},{"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"PolicyManager","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Stub for build; full implementation when emoney module is restored","version":1}},"settings":{"compilationTarget":{"contracts/emoney/PolicyManager.sol":"PolicyManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/PolicyManager.sol":{"keccak256":"0x6fc3ce5719a36a6c7eba0b4ed0528218c2086196c914d8f20e498d79edbe83f6","license":"MIT","urls":["bzz-raw://311f13e5161def51d2ba3ff760a8be61a5dd8bec028ad1046432893a892257ec","dweb:/ipfs/QmVAZccBs3CPBaE6ChiYTfqF5anDUyJEjvnLyV6U5oqqSi"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmc8LePnsJSaq2eWiuHxvtcGGVCDbofiF327oXFnastWxu/archive-info.json b/verification-sources/chain138-metadata-archive/Qmc8LePnsJSaq2eWiuHxvtcGGVCDbofiF327oXFnastWxu/archive-info.json new file mode 100644 index 0000000..2b85255 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmc8LePnsJSaq2eWiuHxvtcGGVCDbofiF327oXFnastWxu/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmc8LePnsJSaq2eWiuHxvtcGGVCDbofiF327oXFnastWxu", + "metadata_digest": "ccdc38e2f33bca3976679641832257c1847060bb9aa42f2086939132fd470cb6", + "source_path": "contracts/tokens/CompliantBTC.sol", + "contract_name": "CompliantBTC", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmc8LePnsJSaq2eWiuHxvtcGGVCDbofiF327oXFnastWxu/metadata.json b/verification-sources/chain138-metadata-archive/Qmc8LePnsJSaq2eWiuHxvtcGGVCDbofiF327oXFnastWxu/metadata.json new file mode 100644 index 0000000..52329cc --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmc8LePnsJSaq2eWiuHxvtcGGVCDbofiF327oXFnastWxu/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"initialSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mechanism","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisputeResolutionMechanismSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"JurisdictionDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LegalNotice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"ValueTransferDeclared","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISPUTE_RESOLUTION_MECHANISM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_ARBITRATION_SUPPORT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_TRADE_TERMS_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_UNIFORM_RULES_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTRUMENT_CLASSIFICATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_20022_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_27001_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_3166_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_4217_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_8601_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_ENFORCEABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_FRAMEWORK_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_JURISDICTION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATORY_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SATOSHI_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_OF_PROCESS_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFERABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAVEL_RULE_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMonetaryUnit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"recordLegalNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unitCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"name()":{"details":"Returns the name of the token."},"owner()":{"details":"Returns the address of the current owner."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"recordLegalNotice(string)":{"params":{"message":"The legal notice message"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"CompliantBTC","version":1},"userdoc":{"kind":"user","methods":{"recordLegalNotice(string)":{"notice":"Record a legal notice"}},"notice":"Canonical Chain 138 Bitcoin monetary-unit token.","version":1}},"settings":{"compilationTarget":{"contracts/tokens/CompliantBTC.sol":"CompliantBTC"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/compliance/LegallyCompliantBase.sol":{"keccak256":"0x60b62492c7ad1f613a6070f38b3e6849d7a52d63dd68254bd95f96e733f74bb1","license":"MIT","urls":["bzz-raw://abcea0d6b1835eaccbd2b9eceaa1f04e3665fbdf3f2a61bcc52709e783a8ba51","dweb:/ipfs/Qmc8M9VQ2k2QP4UBXcjGfWQAojbmxNYUBVwNBfHSLFRorw"]},"contracts/tokens/CompliantBTC.sol":{"keccak256":"0x8e76114dfcc7defe729b004c0e5cb77907f23ba4765ab6ce5ab5e0c71302da14","license":"MIT","urls":["bzz-raw://5fdd7824590b8447fd7e43a86746ad1b06c19dc9c84c1f4737a92da32110f680","dweb:/ipfs/QmUARzHDMeyMwic95krnMR1t2ygkuqJUqC3novHte2b7o4"]},"contracts/tokens/CompliantMonetaryUnitToken.sol":{"keccak256":"0x3107f1bac72b114e549db31c36cc56496d70455595ccb9c5258d4f8e72599510","license":"MIT","urls":["bzz-raw://136c706a21e92bf76a75133e19097e806208490fb7139b934b531d55f6793bd1","dweb:/ipfs/QmWiigCEJjf7hpebqFHhVtKNh12TAoZBsuyqMeqrbRDbFM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcDd9y5tgePVQEQp6DCt37TArM18U4JaS6snm4YFNX1tY/archive-info.json b/verification-sources/chain138-metadata-archive/QmcDd9y5tgePVQEQp6DCt37TArM18U4JaS6snm4YFNX1tY/archive-info.json new file mode 100644 index 0000000..8abae33 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcDd9y5tgePVQEQp6DCt37TArM18U4JaS6snm4YFNX1tY/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcDd9y5tgePVQEQp6DCt37TArM18U4JaS6snm4YFNX1tY", + "metadata_digest": "ce36cb476984a1e1243cb9205742108272f7ee3807ac18a0dc180ca698b0fcad", + "source_path": "contracts/vault/tokens/DebtToken.sol", + "contract_name": "DebtToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcDd9y5tgePVQEQp6DCt37TArM18U4JaS6snm4YFNX1tY/metadata.json b/verification-sources/chain138-metadata-archive/QmcDd9y5tgePVQEQp6DCt37TArM18U4JaS6snm4YFNX1tY/metadata.json new file mode 100644 index 0000000..dc32d76 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcDd9y5tgePVQEQp6DCt37TArM18U4JaS6snm4YFNX1tY/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"vault_","type":"address"},{"internalType":"address","name":"currency_","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"vault_","type":"address"},{"internalType":"address","name":"currency_","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"bool","name":"transferable_","type":"bool"}],"name":"initializeFull","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isTransferable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Minted when borrow occurs, burned on repayment Interest-accruing, non-freely transferable Extends eMoneyToken pattern","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"burn(address,uint256)":{"params":{"amount":"Amount to burn","from":"Source address"}},"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"initializeFull(string,string,address,address,address,uint8,bool)":{"params":{"decimals_":"Token decimals (e.g. 6 for stablecoins; 0 = use 18)","transferable_":"If true, full ERC-20 transfers allowed (DEX-ready)"}},"mint(address,uint256)":{"params":{"amount":"Amount to mint","to":"Recipient address"}},"name()":{"details":"Returns the name of the token."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Skips emitting an {Approval} event indicating an allowance update. This is not required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"title":"DebtToken","version":1},"userdoc":{"kind":"user","methods":{"burn(address,uint256)":{"notice":"Burn debt tokens (only by vault)"},"decimals()":{"notice":"Returns token decimals (matches underlying for DEX compatibility)"},"initialize(string,string,address,address,address)":{"notice":"Initialize the debt token (5-arg for backward compatibility; decimals=18, not transferable)"},"initializeFull(string,string,address,address,address,uint8,bool)":{"notice":"Initialize with decimals and transferability (ERC-20; optionally DEX-transferable)"},"mint(address,uint256)":{"notice":"Mint debt tokens (only by vault)"}},"notice":"Token representing outstanding debt obligation (dToken equivalent)","version":1}},"settings":{"compilationTarget":{"contracts/vault/tokens/DebtToken.sol":"DebtToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol":{"keccak256":"0xd518def45c722a6e803e1e26e625db25e01497f672ca566cca585d234ec903b0","license":"MIT","urls":["bzz-raw://6e7de3fccd96783244790cde282435ce0fd3a44ab4ccb10f17005c743202882f","dweb:/ipfs/QmYSepstTqs5UPJvjeJXkWU5R659yReqrSgSGGh65hkbdK"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/vault/tokens/DebtToken.sol":{"keccak256":"0xb791a91845fa03b3b69fb92165dd8c716a270920171ff63de7b17489eb4871da","license":"MIT","urls":["bzz-raw://84a630592b68a85070e26195cc5a24ed085078f5bf04d4b2b35037e6295c1e45","dweb:/ipfs/QmTXHxwdnPZKMKNyvgXtKh8AYvqSPKxMBL6eR5KzsJRs1T"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcERWw6rdu4xAZpepj1JCpofU1nqEQXpzd1isJgWYFLzq/archive-info.json b/verification-sources/chain138-metadata-archive/QmcERWw6rdu4xAZpepj1JCpofU1nqEQXpzd1isJgWYFLzq/archive-info.json new file mode 100644 index 0000000..7f598cb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcERWw6rdu4xAZpepj1JCpofU1nqEQXpzd1isJgWYFLzq/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcERWw6rdu4xAZpepj1JCpofU1nqEQXpzd1isJgWYFLzq", + "metadata_digest": "ce6b3714168922fcc36267f169ac8d8dd751ce722475bedb820b975ee8ad6f46", + "source_path": "@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol", + "contract_name": "IERC3156FlashBorrower", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcERWw6rdu4xAZpepj1JCpofU1nqEQXpzd1isJgWYFLzq/metadata.json b/verification-sources/chain138-metadata-archive/QmcERWw6rdu4xAZpepj1JCpofU1nqEQXpzd1isJgWYFLzq/metadata.json new file mode 100644 index 0000000..a951a21 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcERWw6rdu4xAZpepj1JCpofU1nqEQXpzd1isJgWYFLzq/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"initiator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onFlashLoan","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface of the ERC3156 FlashBorrower, as defined in https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].","kind":"dev","methods":{"onFlashLoan(address,address,uint256,uint256,bytes)":{"details":"Receive a flash loan.","params":{"amount":"The amount of tokens lent.","data":"Arbitrary data structure, intended to contain user-defined parameters.","fee":"The additional amount of tokens to repay.","initiator":"The initiator of the loan.","token":"The loan currency."},"returns":{"_0":"The keccak256 hash of \"ERC3156FlashBorrower.onFlashLoan\""}}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":"IERC3156FlashBorrower"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":{"keccak256":"0x9f9e6dba43fe0775c400aa384375f1f503efaf733a40187169fdfc195f5ea6fa","license":"MIT","urls":["bzz-raw://ff5fe5fac5e4ecbf9fcd34c42b6d58d1af150263dfe07bc6785a59329dd1e475","dweb:/ipfs/QmX1EhNKKL6n6RFrLLAYh6Uf3itkozjSHyGFs9DqwW4Rzy"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcKu76FzBqn9rmDuarSiyEKeEDdyi19AAH9hZaKoPGVwx/archive-info.json b/verification-sources/chain138-metadata-archive/QmcKu76FzBqn9rmDuarSiyEKeEDdyi19AAH9hZaKoPGVwx/archive-info.json new file mode 100644 index 0000000..6863cae --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcKu76FzBqn9rmDuarSiyEKeEDdyi19AAH9hZaKoPGVwx/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcKu76FzBqn9rmDuarSiyEKeEDdyi19AAH9hZaKoPGVwx", + "metadata_digest": "cfd25068ac9f91e6eba1d1dfa56b57619ccdce0d94fead6582de3fb4593151db", + "source_path": "contracts/bridge/UniversalCCIPBridge.sol", + "contract_name": "UniversalCCIPBridge", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcKu76FzBqn9rmDuarSiyEKeEDdyi19AAH9hZaKoPGVwx/metadata.json b/verification-sources/chain138-metadata-archive/QmcKu76FzBqn9rmDuarSiyEKeEDdyi19AAH9hZaKoPGVwx/metadata.json new file mode 100644 index 0000000..06bb800 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcKu76FzBqn9rmDuarSiyEKeEDdyi19AAH9hZaKoPGVwx/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"destinationChain","type":"uint64"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"bool","name":"usedPMM","type":"bool"}],"name":"BridgeExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiverBridge","type":"address"}],"name":"DestinationAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"DestinationRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiverBridge","type":"address"}],"name":"addDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetRegistry","outputs":[{"internalType":"contract UniversalAssetRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"destinationChain","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32","name":"assetType","type":"bytes32"},{"internalType":"bool","name":"usePMM","type":"bool"},{"internalType":"bool","name":"useVault","type":"bool"},{"internalType":"bytes","name":"complianceProof","type":"bytes"},{"internalType":"bytes","name":"vaultInstructions","type":"bytes"}],"internalType":"struct UniversalCCIPBridge.BridgeOperation","name":"op","type":"tuple"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ccipRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"destinations","outputs":[{"internalType":"address","name":"receiverBridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"addedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"getDestination","outputs":[{"components":[{"internalType":"address","name":"receiverBridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"addedAt","type":"uint256"}],"internalType":"struct UniversalCCIPBridge.Destination","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_assetRegistry","type":"address"},{"internalType":"address","name":"_ccipRouter","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"removeDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ccipRouter","type":"address"}],"name":"setCCIPRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityManager","type":"address"}],"name":"setLiquidityManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultFactory","type":"address"}],"name":"setVaultFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userVaults","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Extends CCIP infrastructure with dynamic asset routing and PMM integration","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"title":"UniversalCCIPBridge","version":1},"userdoc":{"kind":"user","methods":{"addDestination(address,uint64,address)":{"notice":"Add destination for token"},"bridge((address,uint256,uint64,address,bytes32,bool,bool,bytes,bytes))":{"notice":"Main bridge function with asset type routing"},"removeDestination(address,uint64)":{"notice":"Remove destination"},"setCCIPRouter(address)":{"notice":"Set CCIP router (for deterministic deployment: initialize with router=0, then set per chain)"},"setLiquidityManager(address)":{"notice":"Set liquidity manager"},"setVaultFactory(address)":{"notice":"Set vault factory"},"withdraw()":{"notice":"Withdraw native tokens"}},"notice":"Main bridge contract supporting all asset types via CCIP","version":1}},"settings":{"compilationTarget":{"contracts/bridge/UniversalCCIPBridge.sol":"UniversalCCIPBridge"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/UniversalCCIPBridge.sol":{"keccak256":"0xcdbe2bad1997db39d23990cc77a7e304ff228d4de878b0a897285e9eaf1f39ca","license":"MIT","urls":["bzz-raw://fe0c40c17b7869587ecacd0fe72f880a3e1e8a836d7f93650d52123bbc9efce2","dweb:/ipfs/QmXqoeHhNAJqJqA7NHw4WjpqWW8SXwVJ7TosQkTp74NiDY"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcN7GP5JZo9pzBbrQLm7tSAAj7ryVGhQASzVfmxH9A9QH/archive-info.json b/verification-sources/chain138-metadata-archive/QmcN7GP5JZo9pzBbrQLm7tSAAj7ryVGhQASzVfmxH9A9QH/archive-info.json new file mode 100644 index 0000000..eb6b49d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcN7GP5JZo9pzBbrQLm7tSAAj7ryVGhQASzVfmxH9A9QH/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcN7GP5JZo9pzBbrQLm7tSAAj7ryVGhQASzVfmxH9A9QH", + "metadata_digest": "d06339aaf2faee3cb4cf691cadc78c45d1b396f7398cd3ee2ef107db005b9c0e", + "source_path": "contracts/bridge/integration/CWReserveVerifier.sol", + "contract_name": "IStablecoinReserveVaultLike", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcN7GP5JZo9pzBbrQLm7tSAAj7ryVGhQASzVfmxH9A9QH/metadata.json b/verification-sources/chain138-metadata-archive/QmcN7GP5JZo9pzBbrQLm7tSAAj7ryVGhQASzVfmxH9A9QH/metadata.json new file mode 100644 index 0000000..a6170d2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcN7GP5JZo9pzBbrQLm7tSAAj7ryVGhQASzVfmxH9A9QH/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"checkReserveAdequacy","outputs":[{"internalType":"bool","name":"usdtAdequate","type":"bool"},{"internalType":"bool","name":"usdcAdequate","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compliantUSDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compliantUSDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBackingRatio","outputs":[{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint256","name":"tokenSupply","type":"uint256"},{"internalType":"uint256","name":"backingRatio","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/CWReserveVerifier.sol":"IStablecoinReserveVaultLike"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/CWReserveVerifier.sol":{"keccak256":"0xb0fb3977b950390981f5b4e884042a1817f777f09ae626eaa9cbbc617e190dd1","license":"MIT","urls":["bzz-raw://0512dbc999a0683944d1b9a51b2e96a490fc4e7f6d6abca35050717aa979829c","dweb:/ipfs/QmR1WwkrRRBzFuHq4hWVzHZgBkjs3usumrBjg9BYnMwskR"]},"contracts/bridge/integration/ICWReserveVerifier.sol":{"keccak256":"0x4fc7b6b8f10d5ec64517fc31559a2b7ac52c7496a7effaac7d29fbfc64f44528","license":"MIT","urls":["bzz-raw://7ef5196aefc98a7d6b295118500062ec62c05d786e3f9ad1ae8414d48279605d","dweb:/ipfs/QmU6cE1rZA99DygbUECyCoQwc5t2g1aJrcs3BiZ4SPoksa"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcNjKggnGNrhELcsDM76ftDXfnkZCYEvcbaMa9WeRiRLs/archive-info.json b/verification-sources/chain138-metadata-archive/QmcNjKggnGNrhELcsDM76ftDXfnkZCYEvcbaMa9WeRiRLs/archive-info.json new file mode 100644 index 0000000..d39d7ed --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcNjKggnGNrhELcsDM76ftDXfnkZCYEvcbaMa9WeRiRLs/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmcNjKggnGNrhELcsDM76ftDXfnkZCYEvcbaMa9WeRiRLs", + "metadata_digest": "d08bfeb83d85985b88d623abe013e323201427d6d9dc888188fef2820c5cc028", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Callee.sol", + "contract_name": "IUniswapV2Callee", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcNjKggnGNrhELcsDM76ftDXfnkZCYEvcbaMa9WeRiRLs/metadata.json b/verification-sources/chain138-metadata-archive/QmcNjKggnGNrhELcsDM76ftDXfnkZCYEvcbaMa9WeRiRLs/metadata.json new file mode 100644 index 0000000..ec5c5e2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcNjKggnGNrhELcsDM76ftDXfnkZCYEvcbaMa9WeRiRLs/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"uniswapV2Call","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Callee.sol":"IUniswapV2Callee"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Callee.sol":{"keccak256":"0xdb17a1fb73e261e736ae8862be2d9a32964fc4b3741f48980f5cdc9d92b99a96","urls":["bzz-raw://468dab23a95d9d9b7d6ce74008d45eef3de2f137ede604e6be6c5e7d0121c5e9","dweb:/ipfs/QmcXwjTfp6tCRgf1KsNQyUAtrqKhiaN6fbaHVGr22eficP"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcXqj4fyrxH5rUKv7Rgsjc38GYkxbRyJ6MbhPTsQpZoTC/archive-info.json b/verification-sources/chain138-metadata-archive/QmcXqj4fyrxH5rUKv7Rgsjc38GYkxbRyJ6MbhPTsQpZoTC/archive-info.json new file mode 100644 index 0000000..63165d5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcXqj4fyrxH5rUKv7Rgsjc38GYkxbRyJ6MbhPTsQpZoTC/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcXqj4fyrxH5rUKv7Rgsjc38GYkxbRyJ6MbhPTsQpZoTC", + "metadata_digest": "d2e176579f9eeb60f0bf49d0b08062f487bd3d68ad2a2b9d82e8d054e684c637", + "source_path": "contracts/tokens/OfficialStableMirrorToken.sol", + "contract_name": "OfficialStableMirrorToken", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcXqj4fyrxH5rUKv7Rgsjc38GYkxbRyJ6MbhPTsQpZoTC/metadata.json b/verification-sources/chain138-metadata-archive/QmcXqj4fyrxH5rUKv7Rgsjc38GYkxbRyJ6MbhPTsQpZoTC/metadata.json new file mode 100644 index 0000000..b1e48ac --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcXqj4fyrxH5rUKv7Rgsjc38GYkxbRyJ6MbhPTsQpZoTC/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"uint256","name":"initialSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This token exists only to provide a live ERC-20 quote-side asset for local PMM pools. It is intentionally separate from the compliant token contracts.","errors":{"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"name()":{"details":"Returns the name of the token."},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"OfficialStableMirrorToken","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Lightweight ERC-20 used as the local Chain 138 \"official\" stable mirror.","version":1}},"settings":{"compilationTarget":{"contracts/tokens/OfficialStableMirrorToken.sol":"OfficialStableMirrorToken"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/tokens/OfficialStableMirrorToken.sol":{"keccak256":"0xfd7392879ec643063650d16fc81f0d2d8ea637282624981531240ee9c98a0547","license":"MIT","urls":["bzz-raw://89d14ff09c766a2eb517d2bf328587d2704ef9c5ccfe2d4b25eab31609353959","dweb:/ipfs/QmXyk3e5trnuAaC5xwZ3vqpFoGSf5iV8G6oz9iLAXXf55x"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcbQX3HizNgoWRbt99BsCysGK2BijTpXzm3fmrbXeufqK/archive-info.json b/verification-sources/chain138-metadata-archive/QmcbQX3HizNgoWRbt99BsCysGK2BijTpXzm3fmrbXeufqK/archive-info.json new file mode 100644 index 0000000..9911ee0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcbQX3HizNgoWRbt99BsCysGK2BijTpXzm3fmrbXeufqK/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcbQX3HizNgoWRbt99BsCysGK2BijTpXzm3fmrbXeufqK", + "metadata_digest": "d3cb489490ddb7573c420b95166295a2b4492962aa7b3590822dff3e24add17a", + "source_path": "contracts/sync/TokenlistGovernanceSync.sol", + "contract_name": "TokenlistGovernanceSync", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcbQX3HizNgoWRbt99BsCysGK2BijTpXzm3fmrbXeufqK/metadata.json b/verification-sources/chain138-metadata-archive/QmcbQX3HizNgoWRbt99BsCysGK2BijTpXzm3fmrbXeufqK/metadata.json new file mode 100644 index 0000000..c506b24 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcbQX3HizNgoWRbt99BsCysGK2BijTpXzm3fmrbXeufqK/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"enum TokenlistGovernanceSync.ChangeType","name":"changeType","type":"uint8"}],"name":"AutoProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"versionHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"major","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"patch","type":"uint256"},{"indexed":false,"internalType":"string","name":"ipfsHash","type":"string"}],"name":"TokenlistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"versionHash","type":"bytes32"}],"name":"VersionSynced","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKENLIST_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetRegistry","outputs":[{"internalType":"contract UniversalAssetRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"internalType":"enum UniversalAssetRegistry.ComplianceLevel","name":"complianceLevel","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"uint8","name":"volatilityScore","type":"uint8"},{"internalType":"uint256","name":"minBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"maxBridgeAmount","type":"uint256"}],"internalType":"struct TokenlistGovernanceSync.AssetMetadata[]","name":"metadata","type":"tuple[]"}],"name":"batchCreateProposals","outputs":[{"internalType":"bytes32[]","name":"proposalIds","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentVersion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"oldVersionHash","type":"bytes32"},{"internalType":"bytes32","name":"newVersionHash","type":"bytes32"},{"internalType":"address[]","name":"oldTokens","type":"address[]"},{"internalType":"address[]","name":"newTokens","type":"address[]"}],"name":"detectChanges","outputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum TokenlistGovernanceSync.ChangeType","name":"changeType","type":"uint8"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"internalType":"enum UniversalAssetRegistry.ComplianceLevel","name":"complianceLevel","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"uint8","name":"volatilityScore","type":"uint8"},{"internalType":"uint256","name":"minBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"maxBridgeAmount","type":"uint256"}],"internalType":"struct TokenlistGovernanceSync.AssetMetadata","name":"metadata","type":"tuple"}],"internalType":"struct TokenlistGovernanceSync.TokenChange[]","name":"changes","type":"tuple[]"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getCurrentVersion","outputs":[{"components":[{"internalType":"uint256","name":"major","type":"uint256"},{"internalType":"uint256","name":"minor","type":"uint256"},{"internalType":"uint256","name":"patch","type":"uint256"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"synced","type":"bool"}],"internalType":"struct TokenlistGovernanceSync.TokenlistVersion","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"versionHash","type":"bytes32"}],"name":"getVersion","outputs":[{"components":[{"internalType":"uint256","name":"major","type":"uint256"},{"internalType":"uint256","name":"minor","type":"uint256"},{"internalType":"uint256","name":"patch","type":"uint256"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"synced","type":"bool"}],"internalType":"struct TokenlistGovernanceSync.TokenlistVersion","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVersionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVersionHistory","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_assetRegistry","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"versionHash","type":"bytes32"}],"name":"isVersionSynced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"versionHash","type":"bytes32"}],"name":"markVersionSynced","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"major","type":"uint256"},{"internalType":"uint256","name":"minor","type":"uint256"},{"internalType":"uint256","name":"patch","type":"uint256"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"address[]","name":"newTokens","type":"address[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"internalType":"enum UniversalAssetRegistry.ComplianceLevel","name":"complianceLevel","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"uint8","name":"volatilityScore","type":"uint8"},{"internalType":"uint256","name":"minBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"maxBridgeAmount","type":"uint256"}],"internalType":"struct TokenlistGovernanceSync.AssetMetadata[]","name":"metadata","type":"tuple[]"}],"name":"submitTokenlistVersion","outputs":[{"internalType":"bytes32[]","name":"proposalIds","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"versionHistory","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"versions","outputs":[{"internalType":"uint256","name":"major","type":"uint256"},{"internalType":"uint256","name":"minor","type":"uint256"},{"internalType":"uint256","name":"patch","type":"uint256"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"synced","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Monitors tokenlist versions and creates proposals for changes","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"title":"TokenlistGovernanceSync","version":1},"userdoc":{"kind":"user","methods":{"batchCreateProposals(address[],(address,uint8,uint8,string,string,uint8,string,uint8,uint256,uint256)[])":{"notice":"Batch create proposals for multiple tokens"},"detectChanges(bytes32,bytes32,address[],address[])":{"notice":"Detect changes between versions"},"markVersionSynced(bytes32)":{"notice":"Mark version as synced"},"submitTokenlistVersion(uint256,uint256,uint256,string,address[],(address,uint8,uint8,string,string,uint8,string,uint8,uint256,uint256)[])":{"notice":"Submit new tokenlist version and auto-create proposals"}},"notice":"Automatically syncs tokenlist.json changes to on-chain governance","version":1}},"settings":{"compilationTarget":{"contracts/sync/TokenlistGovernanceSync.sol":"TokenlistGovernanceSync"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/sync/TokenlistGovernanceSync.sol":{"keccak256":"0xe169289d512cae9c00cc577358726b9e0d3ce81b27d6b107ff42a7d12d547641","license":"MIT","urls":["bzz-raw://fab0aa0fd07147ad4ef75fc3f71db048699ecfcd556f61937d77ced13216cc4f","dweb:/ipfs/QmbBvafG9SkUCSF2xKkpEKN5RtzhWBVjv5UbuAwizhB6Yk"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcdUCSdeeQJQc7nUCncVk9MdffmCYr5tZL9zpnSJ64Uqq/archive-info.json b/verification-sources/chain138-metadata-archive/QmcdUCSdeeQJQc7nUCncVk9MdffmCYr5tZL9zpnSJ64Uqq/archive-info.json new file mode 100644 index 0000000..008a5ed --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcdUCSdeeQJQc7nUCncVk9MdffmCYr5tZL9zpnSJ64Uqq/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcdUCSdeeQJQc7nUCncVk9MdffmCYr5tZL9zpnSJ64Uqq", + "metadata_digest": "d4529afb05c7e236eba515a446e2f084b308a0ba68a00e2c8fc8424fdf553304", + "source_path": "contracts/bridge/trustless/interfaces/IWETH.sol", + "contract_name": "IWETH", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcdUCSdeeQJQc7nUCncVk9MdffmCYr5tZL9zpnSJ64Uqq/metadata.json b/verification-sources/chain138-metadata-archive/QmcdUCSdeeQJQc7nUCncVk9MdffmCYr5tZL9zpnSJ64Uqq/metadata.json new file mode 100644 index 0000000..384a12b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcdUCSdeeQJQc7nUCncVk9MdffmCYr5tZL9zpnSJ64Uqq/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"title":"IWETH","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Minimal WETH interface for bridge contracts","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/interfaces/IWETH.sol":"IWETH"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/interfaces/IWETH.sol":{"keccak256":"0x2797f22d48c59542f0c7eb5d4405c7c5c2156c764faf9798de2493e5f6487977","license":"MIT","urls":["bzz-raw://e876c569dce230e2eaf208885fa3df05879363b80df005bbe1841f404c789202","dweb:/ipfs/QmTMEUjEVx2ZvKKe7L6uuEWZYbFaTUYAkabF91189J5wMf"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmcframk7C9K1HvFC52AeB245Wi8Mk3PEPV99a3gMyEU2V/archive-info.json b/verification-sources/chain138-metadata-archive/Qmcframk7C9K1HvFC52AeB245Wi8Mk3PEPV99a3gMyEU2V/archive-info.json new file mode 100644 index 0000000..1456f80 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmcframk7C9K1HvFC52AeB245Wi8Mk3PEPV99a3gMyEU2V/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmcframk7C9K1HvFC52AeB245Wi8Mk3PEPV99a3gMyEU2V", + "metadata_digest": "d4ef13eaccbb783dd2ebc363a80f55bf5098cb9c6002a8131d2940befc655cea", + "source_path": "contracts/bridge/trustless/adapters/OneInchRouteExecutorAdapter.sol", + "contract_name": "OneInchRouteExecutorAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmcframk7C9K1HvFC52AeB245Wi8Mk3PEPV99a3gMyEU2V/metadata.json b/verification-sources/chain138-metadata-archive/Qmcframk7C9K1HvFC52AeB245Wi8Mk3PEPV99a3gMyEU2V/metadata.json new file mode 100644 index 0000000..87d986d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmcframk7C9K1HvFC52AeB245Wi8Mk3PEPV99a3gMyEU2V/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"execute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"","type":"tuple"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"}],"name":"validate","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"pure","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/adapters/OneInchRouteExecutorAdapter.sol":"OneInchRouteExecutorAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/adapters/OneInchRouteExecutorAdapter.sol":{"keccak256":"0x01f19d0ccd94b154f13040fef6b073d992345904bb910f2a5c92f69586ab800d","license":"MIT","urls":["bzz-raw://80d439d21223ccfa18b7f10b4746e02b159c807a60632cb2b3a28c1df23b7bb2","dweb:/ipfs/QmQw9DR76SD97vMtsG5LXKVJD4MVnHqtXj8ApqevXoVxVj"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmcm3fEaZcQnE1dYjJphsEJs7WqGFtZPTaSvVnvrGBsYj5/archive-info.json b/verification-sources/chain138-metadata-archive/Qmcm3fEaZcQnE1dYjJphsEJs7WqGFtZPTaSvVnvrGBsYj5/archive-info.json new file mode 100644 index 0000000..02000a3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmcm3fEaZcQnE1dYjJphsEJs7WqGFtZPTaSvVnvrGBsYj5/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmcm3fEaZcQnE1dYjJphsEJs7WqGFtZPTaSvVnvrGBsYj5", + "metadata_digest": "d64381af9e997fcc72c17de671d262e80f4baaa81d5771975625b8caa4515374", + "source_path": "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol", + "contract_name": "ERC20Burnable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmcm3fEaZcQnE1dYjJphsEJs7WqGFtZPTaSvVnvrGBsYj5/metadata.json b/verification-sources/chain138-metadata-archive/Qmcm3fEaZcQnE1dYjJphsEJs7WqGFtZPTaSvVnvrGBsYj5/metadata.json new file mode 100644 index 0000000..b14b814 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmcm3fEaZcQnE1dYjJphsEJs7WqGFtZPTaSvVnvrGBsYj5/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Extension of {ERC20} that allows token holders to destroy both their own tokens and those that they have an allowance for, in a way that can be recognized off-chain (via event analysis).","errors":{"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"burn(uint256)":{"details":"Destroys a `value` amount of tokens from the caller. See {ERC20-_burn}."},"burnFrom(address,uint256)":{"details":"Destroys a `value` amount of tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `value`."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol":"ERC20Burnable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol":{"keccak256":"0x2659248df25e34000ed214b3dc8da2160bc39874c992b477d9e2b1b3283dc073","license":"MIT","urls":["bzz-raw://c345af1b0e7ea28d1216d6a04ab28f5534a5229b9edf9ca3cd0e84950ae58d26","dweb:/ipfs/QmY63jtSrYpLRe8Gj1ep2vMDCKxGNNG3hnNVKBVnrs2nmA"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcmYaHf9ga6QeSPUWqcDKaB2TbDCj1oo1tBTRPbuiAsrw/archive-info.json b/verification-sources/chain138-metadata-archive/QmcmYaHf9ga6QeSPUWqcDKaB2TbDCj1oo1tBTRPbuiAsrw/archive-info.json new file mode 100644 index 0000000..cef68d7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcmYaHf9ga6QeSPUWqcDKaB2TbDCj1oo1tBTRPbuiAsrw/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcmYaHf9ga6QeSPUWqcDKaB2TbDCj1oo1tBTRPbuiAsrw", + "metadata_digest": "d66433574fce7cc630ea55ed4096fcc2b916345afe45d824ebae15687b8edb50", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IWETH.sol", + "contract_name": "IWETH", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcmYaHf9ga6QeSPUWqcDKaB2TbDCj1oo1tBTRPbuiAsrw/metadata.json b/verification-sources/chain138-metadata-archive/QmcmYaHf9ga6QeSPUWqcDKaB2TbDCj1oo1tBTRPbuiAsrw/metadata.json new file mode 100644 index 0000000..2a930aa --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcmYaHf9ga6QeSPUWqcDKaB2TbDCj1oo1tBTRPbuiAsrw/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IWETH.sol":"IWETH"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IWETH.sol":{"keccak256":"0x680172744962444cd2f8470d50991336b431fe4e29dd835018ac2f36e53344be","license":"GPL-3.0","urls":["bzz-raw://4eaabf44a03be36934e7102e102434350a866ba6f129cfa49ff842c8de73bf40","dweb:/ipfs/QmVXsCsEUeMXk4cJGYJ9toqw4V5T2XDuwaHWERdHA1SeDP"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcqJqk57nnYGTMZoPSh1EJZET3HLgoLVpnCLBSu2QkyYT/archive-info.json b/verification-sources/chain138-metadata-archive/QmcqJqk57nnYGTMZoPSh1EJZET3HLgoLVpnCLBSu2QkyYT/archive-info.json new file mode 100644 index 0000000..2f85212 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcqJqk57nnYGTMZoPSh1EJZET3HLgoLVpnCLBSu2QkyYT/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcqJqk57nnYGTMZoPSh1EJZET3HLgoLVpnCLBSu2QkyYT", + "metadata_digest": "d75afec7edfd70df22ccad9bef0a92f3883cd1e8afb56da8e42afbc9a38bb548", + "source_path": "contracts/bridge/adapters/non-evm/TronAdapter.sol", + "contract_name": "TronAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcqJqk57nnYGTMZoPSh1EJZET3HLgoLVpnCLBSu2QkyYT/metadata.json b/verification-sources/chain138-metadata-archive/QmcqJqk57nnYGTMZoPSh1EJZET3HLgoLVpnCLBSu2QkyYT/metadata.json new file mode 100644 index 0000000..31e2b62 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcqJqk57nnYGTMZoPSh1EJZET3HLgoLVpnCLBSu2QkyYT/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"txHash","type":"string"},{"indexed":false,"internalType":"uint256","name":"finalizedBlock","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"fulfillmentId","type":"bytes32"}],"name":"TronBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"destination","type":"string"}],"name":"TronBridgeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"TronBridgeMarkedFailed","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"string","name":"txHash","type":"string"},{"internalType":"uint256","name":"finalizedBlock","type":"uint256"},{"internalType":"bytes32","name":"fulfillmentId","type":"bytes32"}],"name":"confirmTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"finalizedBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"fulfillmentIdsByRequest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"string","name":"reason","type":"string"}],"name":"markFailed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minFinalityBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks_","type":"uint256"}],"name":"setMinFinalityBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"txHashes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedFulfillmentIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"details":"Keeps fulfillment ids to make relay retries idempotent.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"TronAdapter","version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"}},"notice":"Bridge adapter for Tron using an off-chain relay/oracle path","version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/non-evm/TronAdapter.sol":"TronAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/adapters/non-evm/TronAdapter.sol":{"keccak256":"0xbba93da9c896077042a279cfbc05714595086a4b2151baef85ba15ad4d23ffb5","license":"MIT","urls":["bzz-raw://55c1388e10a22ae7f644051c9d62d0a76a0ceb124b1ebd808bd0f347fe4c4bb7","dweb:/ipfs/QmRuS71uGrNqbdKWnzDCz6tRTL9fUjkVN54ENmL6LY9jK5"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcsTdeLis1UHNtuG2BFzEBe2uy4VsjABhL7SfNVu5cD7x/archive-info.json b/verification-sources/chain138-metadata-archive/QmcsTdeLis1UHNtuG2BFzEBe2uy4VsjABhL7SfNVu5cD7x/archive-info.json new file mode 100644 index 0000000..9842214 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcsTdeLis1UHNtuG2BFzEBe2uy4VsjABhL7SfNVu5cD7x/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcsTdeLis1UHNtuG2BFzEBe2uy4VsjABhL7SfNVu5cD7x", + "metadata_digest": "d7e818ea36bc553e09d1a07dcd8464d18c095e424eecef82e3c3d7133a3c36fb", + "source_path": "contracts/bridge/TwoWayTokenBridgeL2.sol", + "contract_name": "IMintableERC20", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcsTdeLis1UHNtuG2BFzEBe2uy4VsjABhL7SfNVu5cD7x/metadata.json b/verification-sources/chain138-metadata-archive/QmcsTdeLis1UHNtuG2BFzEBe2uy4VsjABhL7SfNVu5cD7x/metadata.json new file mode 100644 index 0000000..826c29e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcsTdeLis1UHNtuG2BFzEBe2uy4VsjABhL7SfNVu5cD7x/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/TwoWayTokenBridgeL2.sol":"IMintableERC20"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"contracts/bridge/TwoWayTokenBridgeL2.sol":{"keccak256":"0x56e39c374784a2f0d35f81bcdb7bb7ef5b80768b7040ec0bc3cb2dd8a7ca11b5","license":"MIT","urls":["bzz-raw://ac20517f2c00438d581b3c3dceed4649b8d712176a1ffefc47831db519334395","dweb:/ipfs/QmRr5Tm1B3Jfx17EkGnQ8aYJSCpiHpQY5mhdJW3hQDjtpg"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmcu7yzKeshLDfiJ27LpbGsYzGFcj4rpZ161WAJD2pM1W1/archive-info.json b/verification-sources/chain138-metadata-archive/Qmcu7yzKeshLDfiJ27LpbGsYzGFcj4rpZ161WAJD2pM1W1/archive-info.json new file mode 100644 index 0000000..9a4e2ed --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmcu7yzKeshLDfiJ27LpbGsYzGFcj4rpZ161WAJD2pM1W1/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmcu7yzKeshLDfiJ27LpbGsYzGFcj4rpZ161WAJD2pM1W1", + "metadata_digest": "d8550a9eaf887741dbb89b4c7200b6d04a682bc3d138aa585d6f43c108882dc2", + "source_path": "contracts/bridge/integration/WTokenComplianceEnforcer.sol", + "contract_name": "WTokenComplianceEnforcer", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmcu7yzKeshLDfiJ27LpbGsYzGFcj4rpZ161WAJD2pM1W1/metadata.json b/verification-sources/chain138-metadata-archive/Qmcu7yzKeshLDfiJ27LpbGsYzGFcj4rpZ161WAJD2pM1W1/metadata.json new file mode 100644 index 0000000..11bc433 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmcu7yzKeshLDfiJ27LpbGsYzGFcj4rpZ161WAJD2pM1W1/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"bridgeEscrowVault_","type":"address"},{"internalType":"address","name":"complianceGuard_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"bytes32","name":"reasonCode","type":"bytes32"}],"name":"ComplianceViolation","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"TokenNotEnabled","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bytes32","name":"reasonCode","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"compliant","type":"bool"}],"name":"ComplianceChecked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TokenEnabled","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ENFORCER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeEscrowVault","outputs":[{"internalType":"contract BridgeEscrowVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"bridgeAmount","type":"uint256"}],"name":"checkComplianceBeforeBridge","outputs":[{"internalType":"bool","name":"compliant","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"internalType":"uint256","name":"destinationReserve","type":"uint256"},{"internalType":"uint256","name":"destinationSupply","type":"uint256"}],"name":"checkDestinationCompliance","outputs":[{"internalType":"bool","name":"compliant","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"complianceGuard","outputs":[{"internalType":"contract ComplianceGuard","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"disableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"enableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"enabledTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isTokenEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Ensures money multiplier = 1.0 and GRU isolation on bridge","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"checkComplianceBeforeBridge(address,uint256)":{"params":{"bridgeAmount":"Amount to bridge","token":"W token address"},"returns":{"compliant":"True if compliant"}},"checkDestinationCompliance(string,uint256,uint256,uint256)":{"params":{"bridgeAmount":"Amount to mint on destination","currencyCode":"ISO-4217 currency code","destinationReserve":"Reserve on destination chain","destinationSupply":"Supply on destination chain (before mint)"},"returns":{"compliant":"True if compliant"}},"disableToken(address)":{"params":{"token":"W token address"}},"enableToken(address)":{"params":{"token":"W token address"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"WTokenComplianceEnforcer","version":1},"userdoc":{"kind":"user","methods":{"checkComplianceBeforeBridge(address,uint256)":{"notice":"Check compliance before bridge operation"},"checkDestinationCompliance(string,uint256,uint256,uint256)":{"notice":"Check compliance on destination chain (before minting bridged amount)"},"disableToken(address)":{"notice":"Disable a W token"},"enableToken(address)":{"notice":"Enable a W token for compliance checking"},"isTokenEnabled(address)":{"notice":"Check if token is enabled"}},"notice":"Enforces W token compliance rules on bridge operations","version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/WTokenComplianceEnforcer.sol":"WTokenComplianceEnforcer"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/bridge/integration/WTokenComplianceEnforcer.sol":{"keccak256":"0x9939ecd5122795e3743bc07f2e9c0f7458a5854cbda400f4c570860282dc99aa","license":"MIT","urls":["bzz-raw://3528cef7248d44963c724263ebe665c5505bb23da0684184299a3e1127a99508","dweb:/ipfs/QmYzKGwyHFSg9kcuE2VDdUjiWgKKSutYJ6v7FtjUugTjeK"]},"contracts/bridge/interop/BridgeEscrowVault.sol":{"keccak256":"0x4411967c78a32fc800fd88c7875c4552e247579659899621e6b0dbe7d1cffd98","license":"MIT","urls":["bzz-raw://e1ccca6d988e95a0255160c5908691a99744f7f988653765d42e9d1b7019e357","dweb:/ipfs/QmUy33pNSkMciFLkoQpbP7kBSDcwLHiNS48xzeEvdktRmF"]},"contracts/iso4217w/ComplianceGuard.sol":{"keccak256":"0x9d81d88d06c317a64b6d3de7b7d6df332c87dd2ad29d4f980157fbb1cf64808e","license":"MIT","urls":["bzz-raw://418c04b27cb494e52b7f39ad726d9b0302caf867600118ddb889366bb37dc18c","dweb:/ipfs/QmQuQRfkhseQexQHBHSucVKp2bvJnqPwRm4DEQYrgVXNTP"]},"contracts/iso4217w/interfaces/IComplianceGuard.sol":{"keccak256":"0x2f812514f56778c271667c97288de5d8c8b4c3745491a4e787abf4ff02dc74a6","license":"MIT","urls":["bzz-raw://97e6607a8262c270d90c9497df31259e7bb616e2e4d934a1c26c556b5e7e0f9e","dweb:/ipfs/Qmcsy2CjBZVh88yktxpRKawK1xrjMCQMqosPr78HxQWFzZ"]},"contracts/iso4217w/interfaces/IISO4217WToken.sol":{"keccak256":"0xd583b83e8598f54e2f3cc5e8bf954441fa73e959a0b816522eb66528b248d412","license":"MIT","urls":["bzz-raw://103a3010d1805dc5e1bbda03ce9338e03aa0ca36a914677cd45ece3ec8868ae3","dweb:/ipfs/QmQDnC1kxKbtedmyjMN4W8oonbGQ4y6LARWWqn7jK4V8W9"]},"contracts/iso4217w/libraries/ISO4217WCompliance.sol":{"keccak256":"0xdfef8ded2a1d1fd8303a05b6846270a0bb882386c2da513260cc19a20c7a8b68","license":"MIT","urls":["bzz-raw://e1107bd7d443a2ef6995fbaceab0e4d06b6c36e72cf5f1b08e9fc64f8a4dc256","dweb:/ipfs/QmNter36BUWZnPHsLZWbQTeDdMiVKQNxWoBHLDoQ74B8JA"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmcvFdsVDWtT1rQGV3jJaLAhsUssj48jrGuz4YkDPb7bZU/archive-info.json b/verification-sources/chain138-metadata-archive/QmcvFdsVDWtT1rQGV3jJaLAhsUssj48jrGuz4YkDPb7bZU/archive-info.json new file mode 100644 index 0000000..af91afb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcvFdsVDWtT1rQGV3jJaLAhsUssj48jrGuz4YkDPb7bZU/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmcvFdsVDWtT1rQGV3jJaLAhsUssj48jrGuz4YkDPb7bZU", + "metadata_digest": "d89f469603fb8635f2b2394480ab16d2ec68fc6967e47a622c0d4fee30eeca73", + "source_path": "contracts/flash/CrossChainFlashVaultCreditReceiver.sol", + "contract_name": "CrossChainFlashVaultCreditReceiver", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmcvFdsVDWtT1rQGV3jJaLAhsUssj48jrGuz4YkDPb7bZU/metadata.json b/verification-sources/chain138-metadata-archive/QmcvFdsVDWtT1rQGV3jJaLAhsUssj48jrGuz4YkDPb7bZU/metadata.json new file mode 100644 index 0000000..b55e125 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmcvFdsVDWtT1rQGV3jJaLAhsUssj48jrGuz4YkDPb7bZU/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ccipRouter_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadData","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"NoTokens","type":"error"},{"inputs":[],"name":"OnlyRouter","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityCredited","type":"event"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ccipRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Use to **restore flash vault balance** after off-chain or destination-chain settlement. This is not an ERC-3156 repayment (that must still happen in the flash callback on the borrow chain). `data` = `abi.encode(address vault)`.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"CrossChainFlashVaultCreditReceiver","version":1},"userdoc":{"kind":"user","methods":{},"notice":"**Source-chain** (or same-chain) CCIP receiver: forwards the first ERC-20 leg to a vault address encoded in `message.data`.","version":1}},"settings":{"compilationTarget":{"contracts/flash/CrossChainFlashVaultCreditReceiver.sol":"CrossChainFlashVaultCreditReceiver"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]},"contracts/flash/CrossChainFlashVaultCreditReceiver.sol":{"keccak256":"0x71405855d762d84ef19117f9d1ee26b783692d165fb039df773ad8fabf53e745","license":"MIT","urls":["bzz-raw://cb2252deef8a42a2d437f5418d3e681c8895ac48e826516821e6971848405697","dweb:/ipfs/QmRcmXuKBzeMC4qyjDSVoccaTs3f5CTRj16SZ86icCRPbb"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmd1nJ73kt82v47LV1nsispupv4Fj9TLAKxDUiiTR3huUL/archive-info.json b/verification-sources/chain138-metadata-archive/Qmd1nJ73kt82v47LV1nsispupv4Fj9TLAKxDUiiTR3huUL/archive-info.json new file mode 100644 index 0000000..4dd28e8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmd1nJ73kt82v47LV1nsispupv4Fj9TLAKxDUiiTR3huUL/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmd1nJ73kt82v47LV1nsispupv4Fj9TLAKxDUiiTR3huUL", + "metadata_digest": "da09d8a3727b79c8a4d5058b0bb28aaf4ded492a91af509b1fb53de5355ec8e1", + "source_path": "contracts/bridge/integration/ICWReserveVerifier.sol", + "contract_name": "ICWReserveVerifier", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmd1nJ73kt82v47LV1nsispupv4Fj9TLAKxDUiiTR3huUL/metadata.json b/verification-sources/chain138-metadata-archive/Qmd1nJ73kt82v47LV1nsispupv4Fj9TLAKxDUiiTR3huUL/metadata.json new file mode 100644 index 0000000..56668d9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmd1nJ73kt82v47LV1nsispupv4Fj9TLAKxDUiiTR3huUL/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"verifyLock","outputs":[{"internalType":"bool","name":"verified","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"verifyLock(address,uint64,uint256)":{"params":{"amount":"Amount being wrapped","canonicalToken":"Canonical token locked on Chain 138","destinationChainSelector":"Destination chain selector for the wrapped mint"},"returns":{"verified":"True when the outbound lock satisfies all configured reserve checks"}}},"title":"ICWReserveVerifier","version":1},"userdoc":{"kind":"user","methods":{"verifyLock(address,uint64,uint256)":{"notice":"Verify that a new outbound c* -> cW* lock is still safe after bridge accounting is applied."}},"notice":"Interface for canonical reserve verification used by the cW hard-peg bridge path.","version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/ICWReserveVerifier.sol":"ICWReserveVerifier"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/integration/ICWReserveVerifier.sol":{"keccak256":"0x4fc7b6b8f10d5ec64517fc31559a2b7ac52c7496a7effaac7d29fbfc64f44528","license":"MIT","urls":["bzz-raw://7ef5196aefc98a7d6b295118500062ec62c05d786e3f9ad1ae8414d48279605d","dweb:/ipfs/QmU6cE1rZA99DygbUECyCoQwc5t2g1aJrcs3BiZ4SPoksa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmd3LhPqCWX1ubP885CWV2CK4DBzb3tPWMhzEmHv1NAxeF/archive-info.json b/verification-sources/chain138-metadata-archive/Qmd3LhPqCWX1ubP885CWV2CK4DBzb3tPWMhzEmHv1NAxeF/archive-info.json new file mode 100644 index 0000000..cf638e8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmd3LhPqCWX1ubP885CWV2CK4DBzb3tPWMhzEmHv1NAxeF/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmd3LhPqCWX1ubP885CWV2CK4DBzb3tPWMhzEmHv1NAxeF", + "metadata_digest": "da7010479311eb615edf62ea8cb2807e882fbd573cd6130b35375c6b51736e24", + "source_path": "contracts/flash/CrossChainFlashBorrower.sol", + "contract_name": "CrossChainFlashBorrower", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmd3LhPqCWX1ubP885CWV2CK4DBzb3tPWMhzEmHv1NAxeF/metadata.json b/verification-sources/chain138-metadata-archive/Qmd3LhPqCWX1ubP885CWV2CK4DBzb3tPWMhzEmHv1NAxeF/metadata.json new file mode 100644 index 0000000..0c42642 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmd3LhPqCWX1ubP885CWV2CK4DBzb3tPWMhzEmHv1NAxeF/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"trustedLender_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"BadParams","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientToRepay","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UntrustedLender","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onFlashLoan","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedLender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"**Atomicity is single-chain only.** CCIP / bridge finality is asynchronous; destination delivery cannot complete inside this callback. **Prefunding:** before `flashLoan`, this contract should hold at least `bridgeAmount + fee` of `token` (or `amount + fee` if `bridgeAmount == amount`) so repayment succeeds after the bridge pulls `bridgeAmount`. Encode `CrossChainFlashParams` in `data`.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"CrossChainFlashBorrower","version":1},"userdoc":{"kind":"user","methods":{},"notice":"ERC-3156 borrower: flash `token` on **this** chain \u2192 bridge `bridgeAmount` out \u2192 repay `amount + fee` to the flash vault from **on-hand** balance.","version":1}},"settings":{"compilationTarget":{"contracts/flash/CrossChainFlashBorrower.sol":"CrossChainFlashBorrower"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol":{"keccak256":"0x9f9e6dba43fe0775c400aa384375f1f503efaf733a40187169fdfc195f5ea6fa","license":"MIT","urls":["bzz-raw://ff5fe5fac5e4ecbf9fcd34c42b6d58d1af150263dfe07bc6785a59329dd1e475","dweb:/ipfs/QmX1EhNKKL6n6RFrLLAYh6Uf3itkozjSHyGFs9DqwW4Rzy"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/flash/CrossChainFlashBorrower.sol":{"keccak256":"0x832c2c106b459a5900c3c5b540ba3339d1f6b0c815a15c02981ef3629f5387bf","license":"MIT","urls":["bzz-raw://f6223958d1ee5667a56dbf6a031dbea9261d2c732ffc24b174ebd559a483f708","dweb:/ipfs/QmRFmxHmhw6gaNrhtHrTivUE8HWxq1cQNT88rb7wAJPuKH"]},"contracts/flash/interfaces/ICrossChainFlashBridge.sol":{"keccak256":"0xe27559ab0d9cb3fd2b733cbfabb857970baebd16e81a2ba0358e826050e9b3e8","license":"MIT","urls":["bzz-raw://da208d8e6dcc07c3fa09ee53bb679fc8213f476612335df1991700bce4e1404e","dweb:/ipfs/QmeT6KD6LwwgEEnQdLC1dyZP5iHHaysm3waWoNC3sxyj5P"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmd3WmgoVNxWtWEv8mrpWyos1Rh8aohHAowSummDf7iC5S/archive-info.json b/verification-sources/chain138-metadata-archive/Qmd3WmgoVNxWtWEv8mrpWyos1Rh8aohHAowSummDf7iC5S/archive-info.json new file mode 100644 index 0000000..c3c30ee --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmd3WmgoVNxWtWEv8mrpWyos1Rh8aohHAowSummDf7iC5S/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmd3WmgoVNxWtWEv8mrpWyos1Rh8aohHAowSummDf7iC5S", + "metadata_digest": "da7b744dc839a0bdcae75e5e15e134ea4c88474229a771c0d0fc1b0eb2e12715", + "source_path": "contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router01.sol", + "contract_name": "IUniswapV2Router01", + "compiler": "0.6.6", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/fafa493132a3d2f65cdfc44051edfddd.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmd3WmgoVNxWtWEv8mrpWyos1Rh8aohHAowSummDf7iC5S/metadata.json b/verification-sources/chain138-metadata-archive/Qmd3WmgoVNxWtWEv8mrpWyos1Rh8aohHAowSummDf7iC5S/metadata.json new file mode 100644 index 0000000..e16471f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmd3WmgoVNxWtWEv8mrpWyos1Rh8aohHAowSummDf7iC5S/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.6+commit.6c089d02"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router01.sol":"IUniswapV2Router01"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-periphery/interfaces/IUniswapV2Router01.sol":{"keccak256":"0x8a3c5c449d4b7cd76513ed6995f4b86e4a86f222c770f8442f5fc128ce29b4d2","urls":["bzz-raw://1df63ca373dafae3bd0ee7fe70f890a1dc7c45ed869c01de68413e0e97ff9deb","dweb:/ipfs/QmefJgEYGUL8KX7kQKYTrDweF8GB7yjy3nw5Bmqzryg7PG"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmd5grhnnjFkXo1d6oQyxuxebVHZuYLynn2oVGLUrKNYAX/archive-info.json b/verification-sources/chain138-metadata-archive/Qmd5grhnnjFkXo1d6oQyxuxebVHZuYLynn2oVGLUrKNYAX/archive-info.json new file mode 100644 index 0000000..5a2db32 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmd5grhnnjFkXo1d6oQyxuxebVHZuYLynn2oVGLUrKNYAX/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmd5grhnnjFkXo1d6oQyxuxebVHZuYLynn2oVGLUrKNYAX", + "metadata_digest": "db0a055159cd11621e9433c51b863bccf736459673d659c783236a1646c714cc", + "source_path": "contracts/flash/QuotePushTreasuryManager.sol", + "contract_name": "IQuotePushSweepableReceiver", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmd5grhnnjFkXo1d6oQyxuxebVHZuYLynn2oVGLUrKNYAX/metadata.json b/verification-sources/chain138-metadata-archive/Qmd5grhnnjFkXo1d6oQyxuxebVHZuYLynn2oVGLUrKNYAX/metadata.json new file mode 100644 index 0000000..bd1e19c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmd5grhnnjFkXo1d6oQyxuxebVHZuYLynn2oVGLUrKNYAX/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"reserveRetained","type":"uint256"}],"name":"quoteSurplusBalance","outputs":[{"internalType":"uint256","name":"surplus","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"reserveRetained","type":"uint256"}],"name":"sweepQuoteSurplus","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/QuotePushTreasuryManager.sol":"IQuotePushSweepableReceiver"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/flash/AaveQuotePushFlashReceiver.sol":{"keccak256":"0x9648a35f371bb79c4782933d66237ee759ab4d546950bf79489c87091ff5d7e5","license":"MIT","urls":["bzz-raw://e4360e49daf3f2ac0a7f0299d0083479909f5ae30de80ad647b37421f4d871c8","dweb:/ipfs/QmVAkMWwMEJwFQ5ELSLJhhoxM6oSPUpkrjTzEZkMH5cdh7"]},"contracts/flash/QuotePushTreasuryManager.sol":{"keccak256":"0x0e847c7ee84b23113ea9675f0a7a936404f58cee468cad0c5d51181e4c5b2b7f","license":"MIT","urls":["bzz-raw://67d5e9e122e27e26dad1eadf2c45f95776da694b290378cc1d11f77790e51862","dweb:/ipfs/QmfRYnYKU6v4ZeNrzifw1mZFW6c1fwAnr2oEV3sfx2LS6o"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmd9gM6TcTcNoqL6ofks3PVdxxxgxu8aenddHipnPNRg2n/archive-info.json b/verification-sources/chain138-metadata-archive/Qmd9gM6TcTcNoqL6ofks3PVdxxxgxu8aenddHipnPNRg2n/archive-info.json new file mode 100644 index 0000000..8b567b0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmd9gM6TcTcNoqL6ofks3PVdxxxgxu8aenddHipnPNRg2n/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmd9gM6TcTcNoqL6ofks3PVdxxxgxu8aenddHipnPNRg2n", + "metadata_digest": "dc0fc44bcf64357f2ae15e85936f4ff0d03ea23ddb1814ae8d2bb0e68d7a1273", + "source_path": "contracts/iso4217w/interfaces/IBurnController.sol", + "contract_name": "IBurnController", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmd9gM6TcTcNoqL6ofks3PVdxxxgxu8aenddHipnPNRg2n/metadata.json b/verification-sources/chain138-metadata-archive/Qmd9gM6TcTcNoqL6ofks3PVdxxxgxu8aenddHipnPNRg2n/metadata.json new file mode 100644 index 0000000..5ca970a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmd9gM6TcTcNoqL6ofks3PVdxxxgxu8aenddHipnPNRg2n/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"redemptionId","type":"bytes32"}],"name":"Redeemed","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"canRedeem","outputs":[{"internalType":"bool","name":"redeemable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"bytes32","name":"redemptionId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Burn-before-release sequence for on-demand redemption at par","kind":"dev","methods":{"burn(address,address,uint256)":{"params":{"amount":"Amount to burn","from":"Source address","token":"Token address"}},"canRedeem(address,uint256)":{"params":{"amount":"Amount to redeem","token":"Token address"},"returns":{"redeemable":"True if redemption is allowed"}},"redeem(address,address,uint256)":{"params":{"amount":"Amount to redeem (in token decimals)","from":"Redeemer address","token":"Token address"},"returns":{"redemptionId":"Redemption ID for tracking"}}},"title":"IBurnController","version":1},"userdoc":{"kind":"user","methods":{"burn(address,address,uint256)":{"notice":"Burn tokens without redemption (emergency/transfer)"},"canRedeem(address,uint256)":{"notice":"Check if redemption is allowed"},"redeem(address,address,uint256)":{"notice":"Redeem tokens (burn and release fiat)"}},"notice":"Interface for burning ISO-4217 W tokens on redemption","version":1}},"settings":{"compilationTarget":{"contracts/iso4217w/interfaces/IBurnController.sol":"IBurnController"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/iso4217w/interfaces/IBurnController.sol":{"keccak256":"0x7c6f7b3e0ff3c98e810f99158e599ca024906696ff5c0859054cd387d3dd2ce5","license":"MIT","urls":["bzz-raw://c3b9554ee7a2c2b8c30ddb263ccffe3d2eabebbbdf370643bb34831f6f53abd8","dweb:/ipfs/QmSnALVSFPn8wviNbNquY7HciW9etseM5A6QKsYu13N9rM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmdCXDBthmVKve1yUQADz91CAygFT9AsS6Z1VboNiZNDad/archive-info.json b/verification-sources/chain138-metadata-archive/QmdCXDBthmVKve1yUQADz91CAygFT9AsS6Z1VboNiZNDad/archive-info.json new file mode 100644 index 0000000..0667c93 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdCXDBthmVKve1yUQADz91CAygFT9AsS6Z1VboNiZNDad/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmdCXDBthmVKve1yUQADz91CAygFT9AsS6Z1VboNiZNDad", + "metadata_digest": "dcca2dc22146049a12ad827d43d8716163c613075c43cfb4378b69e83c22d376", + "source_path": "contracts/dbis/IDBISTypes.sol", + "contract_name": "IDBISTypes", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmdCXDBthmVKve1yUQADz91CAygFT9AsS6Z1VboNiZNDad/metadata.json b/verification-sources/chain138-metadata-archive/QmdCXDBthmVKve1yUQADz91CAygFT9AsS6Z1VboNiZNDad/metadata.json new file mode 100644 index 0000000..92c8022 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdCXDBthmVKve1yUQADz91CAygFT9AsS6Z1VboNiZNDad/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/IDBISTypes.sol":"IDBISTypes"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/dbis/IDBISTypes.sol":{"keccak256":"0x1bb363bec4bd479a62db2e2e52b9420b0544be3c7e09dcc88b1b4061c23b7731","license":"MIT","urls":["bzz-raw://f6160b4aa259c5b5a716194b884b4612e6f9627ab8283657ab2476fd3188dc1d","dweb:/ipfs/QmX8xSb3kMuWr7WZdWFJUrAFVZQQKs6vedJYZPNF43DjgX"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmdEGWcJEkLV6K47zGTNKT1sJmfrCLdTDPq5Mn5XJNX6LF/archive-info.json b/verification-sources/chain138-metadata-archive/QmdEGWcJEkLV6K47zGTNKT1sJmfrCLdTDPq5Mn5XJNX6LF/archive-info.json new file mode 100644 index 0000000..c1aa015 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdEGWcJEkLV6K47zGTNKT1sJmfrCLdTDPq5Mn5XJNX6LF/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmdEGWcJEkLV6K47zGTNKT1sJmfrCLdTDPq5Mn5XJNX6LF", + "metadata_digest": "dd3cb82c29ca73bc644fdd5d0d85865b75838d1fd6b04a2d9024e556645bc330", + "source_path": "contracts/vault/interfaces/IXAUOracle.sol", + "contract_name": "IXAUOracle", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmdEGWcJEkLV6K47zGTNKT1sJmfrCLdTDPq5Mn5XJNX6LF/metadata.json b/verification-sources/chain138-metadata-archive/QmdEGWcJEkLV6K47zGTNKT1sJmfrCLdTDPq5Mn5XJNX6LF/metadata.json new file mode 100644 index 0000000..37beae6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdEGWcJEkLV6K47zGTNKT1sJmfrCLdTDPq5Mn5XJNX6LF/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feed","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWeight","type":"uint256"}],"name":"FeedWeightUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OracleFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OracleUnfrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feed","type":"address"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"PriceFeedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feed","type":"address"}],"name":"PriceFeedRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"feed","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"addPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getETHPriceInXAU","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"getLiquidationPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feed","type":"address"}],"name":"removePriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unfreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feed","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"updateFeedWeight","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Multi-source oracle aggregator for ETH/XAU pricing","kind":"dev","methods":{"addPriceFeed(address,uint256)":{"params":{"feed":"Price feed address (must implement Aggregator interface)","weight":"Weight for this feed (sum of all weights should be 10000)"}},"getETHPriceInXAU()":{"returns":{"price":"ETH price in XAU (18 decimals)","timestamp":"Last update timestamp"}},"getLiquidationPrice(address)":{"params":{"vault":"Vault address"},"returns":{"price":"Liquidation threshold price in XAU"}},"isFrozen()":{"returns":{"_0":"frozen True if frozen"}},"removePriceFeed(address)":{"params":{"feed":"Price feed address to remove"}},"updateFeedWeight(address,uint256)":{"params":{"feed":"Price feed address","weight":"New weight"}}},"title":"IXAUOracle","version":1},"userdoc":{"kind":"user","methods":{"addPriceFeed(address,uint256)":{"notice":"Add a price feed source"},"freeze()":{"notice":"Freeze oracle (emergency)"},"getETHPriceInXAU()":{"notice":"Get ETH price in XAU"},"getLiquidationPrice(address)":{"notice":"Get liquidation price for a vault"},"isFrozen()":{"notice":"Check if oracle is frozen"},"removePriceFeed(address)":{"notice":"Remove a price feed source"},"unfreeze()":{"notice":"Unfreeze oracle"},"updateFeedWeight(address,uint256)":{"notice":"Update feed weight"}},"notice":"Interface for XAU Oracle Module","version":1}},"settings":{"compilationTarget":{"contracts/vault/interfaces/IXAUOracle.sol":"IXAUOracle"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vault/interfaces/IXAUOracle.sol":{"keccak256":"0x9528a73e4bd18924061930989c3998a5be210e4f99a6faeeec2406b28dadc3d5","license":"MIT","urls":["bzz-raw://e678ef9becfd63bf5fcfb60176b4995263b2dc3ac01032af89e90378c4c6355a","dweb:/ipfs/QmRoFpA94eqZp5CvCysCFMRfjRuHdCzucYZcVYNnyfgrQS"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmdK2TfCHAebxiGFoS42i7qnAX1haanaRFLoNhMq6CG61R/archive-info.json b/verification-sources/chain138-metadata-archive/QmdK2TfCHAebxiGFoS42i7qnAX1haanaRFLoNhMq6CG61R/archive-info.json new file mode 100644 index 0000000..7c7d2b9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdK2TfCHAebxiGFoS42i7qnAX1haanaRFLoNhMq6CG61R/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmdK2TfCHAebxiGFoS42i7qnAX1haanaRFLoNhMq6CG61R", + "metadata_digest": "de74bc7191fb9fb06ae3cecc5f18e9341725f984d4c771c5d9710be3b3531df4", + "source_path": "contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol", + "contract_name": "Chain138PilotOwned", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmdK2TfCHAebxiGFoS42i7qnAX1haanaRFLoNhMq6CG61R/metadata.json b/verification-sources/chain138-metadata-archive/QmdK2TfCHAebxiGFoS42i7qnAX1haanaRFLoNhMq6CG61R/metadata.json new file mode 100644 index 0000000..83cac8e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdK2TfCHAebxiGFoS42i7qnAX1haanaRFLoNhMq6CG61R/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":"Chain138PilotOwned"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":{"keccak256":"0x679c5ae8c6afb2de2dd20a67ea44b52fc119eff657a797f66b3c9822dded9dcf","license":"MIT","urls":["bzz-raw://927fc1104662d51150305ce34d60ff0856f22de1dc508eff188106970342f2f6","dweb:/ipfs/QmQZCZ5vF91AyGEToPuKvvdzLfkxWgrMQ3P2BAA4FzanoF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmdQswm4kiQwXCmpUhd5f9aRkVHAzsELse3cUXpXdzNAdx/archive-info.json b/verification-sources/chain138-metadata-archive/QmdQswm4kiQwXCmpUhd5f9aRkVHAzsELse3cUXpXdzNAdx/archive-info.json new file mode 100644 index 0000000..a4aecbb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdQswm4kiQwXCmpUhd5f9aRkVHAzsELse3cUXpXdzNAdx/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmdQswm4kiQwXCmpUhd5f9aRkVHAzsELse3cUXpXdzNAdx", + "metadata_digest": "dff497ab74dd5b3e19f9c54270e5e7cb0a21df8e7cc76c1c86f56a5c041827fb", + "source_path": "@openzeppelin/contracts/interfaces/draft-IERC6093.sol", + "contract_name": "IERC20Errors", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmdQswm4kiQwXCmpUhd5f9aRkVHAzsELse3cUXpXdzNAdx/metadata.json b/verification-sources/chain138-metadata-archive/QmdQswm4kiQwXCmpUhd5f9aRkVHAzsELse3cUXpXdzNAdx/metadata.json new file mode 100644 index 0000000..e7fd074 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdQswm4kiQwXCmpUhd5f9aRkVHAzsELse3cUXpXdzNAdx/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"}],"devdoc":{"details":"Standard ERC20 Errors Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.","errors":{"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":"IERC20Errors"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmdSghZ6GERSuyNQnNwaMpms1XbtUxPvwKtQB8yVjx5Dhc/archive-info.json b/verification-sources/chain138-metadata-archive/QmdSghZ6GERSuyNQnNwaMpms1XbtUxPvwKtQB8yVjx5Dhc/archive-info.json new file mode 100644 index 0000000..494047f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdSghZ6GERSuyNQnNwaMpms1XbtUxPvwKtQB8yVjx5Dhc/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmdSghZ6GERSuyNQnNwaMpms1XbtUxPvwKtQB8yVjx5Dhc", + "metadata_digest": "e06b0a15282cb98a09a83f4c7e66f5c8607cd315a7b192fbad40a0dd16900433", + "source_path": "contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol", + "contract_name": "Chain138PilotVenueMath", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmdSghZ6GERSuyNQnNwaMpms1XbtUxPvwKtQB8yVjx5Dhc/metadata.json b/verification-sources/chain138-metadata-archive/QmdSghZ6GERSuyNQnNwaMpms1XbtUxPvwKtQB8yVjx5Dhc/metadata.json new file mode 100644 index 0000000..b67f99a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdSghZ6GERSuyNQnNwaMpms1XbtUxPvwKtQB8yVjx5Dhc/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":"Chain138PilotVenueMath"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol":{"keccak256":"0x679c5ae8c6afb2de2dd20a67ea44b52fc119eff657a797f66b3c9822dded9dcf","license":"MIT","urls":["bzz-raw://927fc1104662d51150305ce34d60ff0856f22de1dc508eff188106970342f2f6","dweb:/ipfs/QmQZCZ5vF91AyGEToPuKvvdzLfkxWgrMQ3P2BAA4FzanoF"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmdTyuWpEBdFp3jANnVR4QjkcgaJL5Kd5J3T3hChMA2YNK/archive-info.json b/verification-sources/chain138-metadata-archive/QmdTyuWpEBdFp3jANnVR4QjkcgaJL5Kd5J3T3hChMA2YNK/archive-info.json new file mode 100644 index 0000000..c9eadc9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdTyuWpEBdFp3jANnVR4QjkcgaJL5Kd5J3T3hChMA2YNK/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmdTyuWpEBdFp3jANnVR4QjkcgaJL5Kd5J3T3hChMA2YNK", + "metadata_digest": "e0c01348c6359f8586c6a70c5aff9ce3f4ba23e7ee1f0544a5d43bb556f1cde8", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2ERC20.sol", + "contract_name": "IUniswapV2ERC20", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmdTyuWpEBdFp3jANnVR4QjkcgaJL5Kd5J3T3hChMA2YNK/metadata.json b/verification-sources/chain138-metadata-archive/QmdTyuWpEBdFp3jANnVR4QjkcgaJL5Kd5J3T3hChMA2YNK/metadata.json new file mode 100644 index 0000000..c4ba134 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdTyuWpEBdFp3jANnVR4QjkcgaJL5Kd5J3T3hChMA2YNK/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2ERC20.sol":"IUniswapV2ERC20"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2ERC20.sol":{"keccak256":"0x9e433765e9ef7b4ff5e406b260b222c47c2aa27d36df756db708064fcb239ae7","urls":["bzz-raw://5b67c24a5e1652b51ad2f37adad2905519f0e05e7c8b2b4d8b3e00b429bb9213","dweb:/ipfs/QmarJq43GabAGGSqtMUb87ACYQt73mSFbXKyFAPDXpbFNM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmdkLCfZ3SoBtV5cSuKs1y54CWLitoNfYZLPWjZroLthwD/archive-info.json b/verification-sources/chain138-metadata-archive/QmdkLCfZ3SoBtV5cSuKs1y54CWLitoNfYZLPWjZroLthwD/archive-info.json new file mode 100644 index 0000000..7ddd83f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdkLCfZ3SoBtV5cSuKs1y54CWLitoNfYZLPWjZroLthwD/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmdkLCfZ3SoBtV5cSuKs1y54CWLitoNfYZLPWjZroLthwD", + "metadata_digest": "e4f0511308b9144a5b4bbf555439059862e361171ee4ed133c28b962d423b910", + "source_path": "contracts/bridge/trustless/integration/BridgeReserveCoordinator.sol", + "contract_name": "BridgeReserveCoordinator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmdkLCfZ3SoBtV5cSuKs1y54CWLitoNfYZLPWjZroLthwD/metadata.json b/verification-sources/chain138-metadata-archive/QmdkLCfZ3SoBtV5cSuKs1y54CWLitoNfYZLPWjZroLthwD/metadata.json new file mode 100644 index 0000000..6baab21 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdkLCfZ3SoBtV5cSuKs1y54CWLitoNfYZLPWjZroLthwD/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_bridgeSwapCoordinator","type":"address"},{"internalType":"address","name":"_reserveSystem","type":"address"},{"internalType":"address","name":"_stablecoinPegManager","type":"address"},{"internalType":"address","name":"_commodityPegManager","type":"address"},{"internalType":"address","name":"_isoCurrencyManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientReserve","type":"error"},{"inputs":[],"name":"InvalidReserveThreshold","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"RebalancingCooldownActive","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"ReserveVerificationFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"RebalancingTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"ReserveThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isSufficient","type":"bool"}],"name":"ReserveVerified","type":"event"},{"inputs":[],"name":"MAX_RESERVE_THRESHOLD_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeSwapCoordinator","outputs":[{"internalType":"contract BridgeSwapCoordinator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"enum LiquidityPoolETH.AssetType","name":"outputAsset","type":"uint8"},{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"bytes","name":"routeData","type":"bytes"}],"name":"bridgeWithReserveBacking","outputs":[{"internalType":"uint256","name":"stablecoinAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commodityPegManager","outputs":[{"internalType":"contract ICommodityPegManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"bridgeAmount","type":"uint256"}],"name":"getReserveStatus","outputs":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint256","name":"reserveRatio","type":"uint256"},{"internalType":"bool","name":"isSufficient","type":"bool"},{"internalType":"uint256","name":"lastVerified","type":"uint256"}],"internalType":"struct BridgeReserveCoordinator.ReserveStatus","name":"status","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isoCurrencyManager","outputs":[{"internalType":"contract IISOCurrencyManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastRebalancingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalancingCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveSystem","outputs":[{"internalType":"contract IReserveSystem","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveVerificationThresholdBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCooldown","type":"uint256"}],"name":"setRebalancingCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setReserveThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stablecoinPegManager","outputs":[{"internalType":"contract IStablecoinPegManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"triggerRebalancing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifyPegStatus","outputs":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"currentPrice","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"},{"internalType":"int256","name":"deviationBps","type":"int256"},{"internalType":"bool","name":"isMaintained","type":"bool"}],"internalType":"struct BridgeReserveCoordinator.PegStatus[]","name":"pegStatuses","type":"tuple[]"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Connects trustless bridge to ReserveSystem for reserve verification and peg maintenance","errors":{"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{"bridgeWithReserveBacking(uint256,address,uint8,address,uint256,bytes)":{"params":{"amountOutMin":"Minimum output amount","depositId":"Deposit ID from bridge","outputAsset":"Asset type (ETH or WETH)","recipient":"Recipient address","routeData":"Optional route data for swap","stablecoinToken":"Target stablecoin"},"returns":{"stablecoinAmount":"Amount of stablecoin received"}},"constructor":{"params":{"_bridgeSwapCoordinator":"BridgeSwapCoordinator contract address","_commodityPegManager":"CommodityPegManager contract address","_isoCurrencyManager":"ISOCurrencyManager contract address","_reserveSystem":"ReserveSystem contract address","_stablecoinPegManager":"StablecoinPegManager contract address"}},"getReserveStatus(address,uint256)":{"params":{"asset":"Asset address","bridgeAmount":"Amount bridged/required"},"returns":{"status":"Reserve status"}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"setRebalancingCooldown(uint256)":{"params":{"newCooldown":"New cooldown in seconds"}},"setReserveThreshold(uint256)":{"params":{"newThreshold":"New threshold in basis points"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"triggerRebalancing(address,uint256)":{"params":{"amount":"Amount that needs backing","asset":"Asset address to rebalance"}},"verifyPegStatus()":{"returns":{"pegStatuses":"Array of peg statuses"}}},"title":"BridgeReserveCoordinator","version":1},"userdoc":{"kind":"user","methods":{"bridgeWithReserveBacking(uint256,address,uint8,address,uint256,bytes)":{"notice":"Bridge transfer with automatic reserve verification"},"constructor":{"notice":"Constructor"},"getReserveStatus(address,uint256)":{"notice":"Get reserve status for an asset"},"setRebalancingCooldown(uint256)":{"notice":"Set rebalancing cooldown period"},"setReserveThreshold(uint256)":{"notice":"Set reserve verification threshold"},"triggerRebalancing(address,uint256)":{"notice":"Trigger rebalancing if peg deviates"},"verifyPegStatus()":{"notice":"Verify peg status for all assets"}},"notice":"Orchestrates bridge operations with ReserveSystem, ensuring peg maintenance and asset backing","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/integration/BridgeReserveCoordinator.sol":"BridgeReserveCoordinator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/BondManager.sol":{"keccak256":"0xd9c903ba88cae86f3477b282c24308a3e8da48885518337e551f747576edab8f","license":"MIT","urls":["bzz-raw://77b72abe65c34dbe450d7bef2be8bf49ce2e188fb18955143cae39d1318ed510","dweb:/ipfs/QmTZXXgixwpjzcsGuqRS6X9JWwaFawg2g6ptHWLNoGzeN2"]},"contracts/bridge/trustless/BridgeSwapCoordinator.sol":{"keccak256":"0xe766302f2344fd63a4dc24f0965abf436ea5a7bc7436f1285f3518c4ed0b63d3","license":"MIT","urls":["bzz-raw://3de02116f6754206178aea890b2fb91f184f5689c75405adfe83396d5bbf70e0","dweb:/ipfs/QmZdziWiWwXBJNyY3cdSie2LGTfiMmAJQBPoL5awRfau35"]},"contracts/bridge/trustless/ChallengeManager.sol":{"keccak256":"0x1b78e36725fc1d8e0fc8f93ad6b6fb7c41205df7db81bc790338c9dbfbf9da5f","license":"MIT","urls":["bzz-raw://c6f8aa8fbf2996df80a4d8f97107c4dabebf1bd16da5c1a2c2267f67b421517f","dweb:/ipfs/QmSwYZ2mFi6fbtbZAqPerQVjuqov3QL7ramtrafS8cqijq"]},"contracts/bridge/trustless/InboxETH.sol":{"keccak256":"0x17dc0c5a4dcbd345fe0828cf41149098d5966e25235964a247da1623ce63d8ff","license":"MIT","urls":["bzz-raw://059d14196f2f160f38db2713d562975086b6be688e50553d6e90b03c3de95e4a","dweb:/ipfs/QmXm7uTYvKMmsPoahi7G17tz1ZkWnG2WzSC6NUe3Lh7MCW"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]},"contracts/bridge/trustless/SwapRouter.sol":{"keccak256":"0x46c48469998ef933a26e9a8276fe5183987664c0f0972de7fccc0489dd1d7a03","license":"MIT","urls":["bzz-raw://81fcbbe09707082aaa4a8125b69200979cbbaf56d190ffa0795fb5d5f561f84c","dweb:/ipfs/QmbJxRppS5zvoYSfdRDxhujEnEGYDdzmedZq8CarP5x5db"]},"contracts/bridge/trustless/integration/BridgeReserveCoordinator.sol":{"keccak256":"0x2de1707cd45f154612ba96d4e0e95ed0f09ada4fd6aa010602795fdfa7ee5301","license":"MIT","urls":["bzz-raw://4dc6ca91b4917466f92eece7a9f9929023812d2e918499fc1db3130f3307abd4","dweb:/ipfs/QmZaWGEpskm5K6LjvQb9912utYTqdBqX3gShzDtuQ4KxJP"]},"contracts/bridge/trustless/integration/ICommodityPegManager.sol":{"keccak256":"0xac6ea4e0e063e63248f9e45c67cf6e73c7a9fe78cecd6dfd653fa639a4d19523","license":"MIT","urls":["bzz-raw://283095df7e58b829bf90fe4d4a790ab407d4d0c17cb175f7f82abc0d678890e5","dweb:/ipfs/QmZ97YmiFv8KFMkZX7CALQCvdwxPcdw673HCaZe2EQMxDY"]},"contracts/bridge/trustless/integration/IISOCurrencyManager.sol":{"keccak256":"0x86621efe39480253f7b4036ab06c9e2b5beb6e4232a837e9935148c2f4ff484b","license":"MIT","urls":["bzz-raw://95a7d0837173661744d191570b1b27dd3351f1b8e74d446a80aed044e1e37391","dweb:/ipfs/QmcXXu9chU9Ame3gC215y3QSAd3ujX1XEJ7pof8A5dRQ1G"]},"contracts/bridge/trustless/integration/IStablecoinPegManager.sol":{"keccak256":"0x781bb48403013454143b4b539427949ded1f2627475a4d9fef6d95e070f31017","license":"MIT","urls":["bzz-raw://df35bbad3d7a6fcabfc9d543b750e8c2f6736c2fc69bcd3b7f8f22f98e5d395c","dweb:/ipfs/QmQjnE74iygDFtQmXKNuHmjdf1LKekiWcrW1UxW4r1oXrG"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/interfaces/IWETH.sol":{"keccak256":"0x2797f22d48c59542f0c7eb5d4405c7c5c2156c764faf9798de2493e5f6487977","license":"MIT","urls":["bzz-raw://e876c569dce230e2eaf208885fa3df05879363b80df005bbe1841f404c789202","dweb:/ipfs/QmTMEUjEVx2ZvKKe7L6uuEWZYbFaTUYAkabF91189J5wMf"]},"contracts/bridge/trustless/libraries/FraudProofTypes.sol":{"keccak256":"0x15e2c59fc46db2ddb33eda2bcd632392564d859942fb1e0026622201f45fe9ab","license":"MIT","urls":["bzz-raw://81e5b0e23122f0d1bccab7d8470987e3aaa787c2d02e140631ff70a83567ae2c","dweb:/ipfs/QmbxNW8tY3FnyFM5GKrEj9Vtr9kLSX6X78xKQGjPdbfd46"]},"contracts/bridge/trustless/libraries/MerkleProofVerifier.sol":{"keccak256":"0x8d92e319d3f83a0e4218d89b598ed86c478a446b4e9271fa1d284842a1aca82b","license":"MIT","urls":["bzz-raw://2aad9a1e47f6e7177b8e7f77ebbb4f9bb32df02f43d07edbd76b7442d49f4e87","dweb:/ipfs/QmXdaJGiAXHqAW9d1zEyBY1vzJhoUaFhzFdPGsxFRrnCLi"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmdkNBuXFQFVwcgAeVpqZZe4EANwbDJeTTaqa9VMqcJo3i/archive-info.json b/verification-sources/chain138-metadata-archive/QmdkNBuXFQFVwcgAeVpqZZe4EANwbDJeTTaqa9VMqcJo3i/archive-info.json new file mode 100644 index 0000000..a8660ec --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdkNBuXFQFVwcgAeVpqZZe4EANwbDJeTTaqa9VMqcJo3i/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmdkNBuXFQFVwcgAeVpqZZe4EANwbDJeTTaqa9VMqcJo3i", + "metadata_digest": "e4f29034b57a985dbf6875a9ce0cc79ea92aaaee3ee88022d0eb796f84779ded", + "source_path": "contracts/bridge/CWMultiTokenBridgeL2.sol", + "contract_name": "CWMultiTokenBridgeL2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmdkNBuXFQFVwcgAeVpqZZe4EANwbDJeTTaqa9VMqcJo3i/metadata.json b/verification-sources/chain138-metadata-archive/QmdkNBuXFQFVwcgAeVpqZZe4EANwbDJeTTaqa9VMqcJo3i/metadata.json new file mode 100644 index 0000000..e81a311 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdkNBuXFQFVwcgAeVpqZZe4EANwbDJeTTaqa9VMqcJo3i/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_sendRouter","type":"address"},{"internalType":"address","name":"_receiveRouter","type":"address"},{"internalType":"address","name":"_feeToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"address","name":"mirroredToken","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiverBridge","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"DestinationConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiverBridge","type":"address"}],"name":"DestinationFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newFeeToken","type":"address"}],"name":"FeeTokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"address","name":"mirroredToken","type":"address"},{"indexed":false,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MessageSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"address","name":"mirroredToken","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mirroredToken","type":"address"},{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"MirroredTokenPauseUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRouter","type":"address"}],"name":"ReceiveRouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRouter","type":"address"}],"name":"SendRouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"address","name":"mirroredToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintedTotalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnedTotalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liveSupply","type":"uint256"}],"name":"SupplyAccountingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"address","name":"mirroredToken","type":"address"}],"name":"TokenPairConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"address","name":"mirroredToken","type":"address"}],"name":"TokenPairFrozen","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mirroredToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnAndSend","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burnedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mirroredToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canonicalToMirrored","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mirroredToken","type":"address"}],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiverBridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"configureDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"address","name":"mirroredToken","type":"address"}],"name":"configureTokenPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destinationFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destinations","outputs":[{"internalType":"address","name":"receiverBridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"}],"name":"freezeDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"}],"name":"freezeTokenPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mirroredToCanonical","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sendRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeToken","type":"address"}],"name":"setFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setReceiveRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setSendRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mirroredToken","type":"address"},{"internalType":"bool","name":"isPaused","type":"bool"}],"name":"setTokenPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenPairFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Supports multiple canonical -> mirrored token pairs behind one bridge address.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"CWMultiTokenBridgeL2","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Destination/public-chain bridge for minting and burning cW* assets without prefunding.","version":1}},"settings":{"compilationTarget":{"contracts/bridge/CWMultiTokenBridgeL2.sol":"CWMultiTokenBridgeL2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/CWMultiTokenBridgeL2.sol":{"keccak256":"0x7f988f285cb5797bb9a1e25812f15d9cce1526cf0edccbc22ec3053b69bee991","license":"MIT","urls":["bzz-raw://4cdc3d5c0c8b00914c5f1d127dbdb6ec3a64492128f6a8b3ca50eba4e7e08078","dweb:/ipfs/QmXqdaWFfL9kKSZZv5gP3qRdDXgSmfzwateDDtxybEQkej"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmdp21njcaEdTTDFo4JedXxWNvch1qqESeNphuNucfa3dK/archive-info.json b/verification-sources/chain138-metadata-archive/Qmdp21njcaEdTTDFo4JedXxWNvch1qqESeNphuNucfa3dK/archive-info.json new file mode 100644 index 0000000..8850260 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmdp21njcaEdTTDFo4JedXxWNvch1qqESeNphuNucfa3dK/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmdp21njcaEdTTDFo4JedXxWNvch1qqESeNphuNucfa3dK", + "metadata_digest": "e5e21342d304876ee4ec5aae5c8674f9de286470816ca3a85e0d05f78212806a", + "source_path": "contracts/bridge/trustless/adapters/BalancerRouteExecutorAdapter.sol", + "contract_name": "BalancerRouteExecutorAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmdp21njcaEdTTDFo4JedXxWNvch1qqESeNphuNucfa3dK/metadata.json b/verification-sources/chain138-metadata-archive/Qmdp21njcaEdTTDFo4JedXxWNvch1qqESeNphuNucfa3dK/metadata.json new file mode 100644 index 0000000..15c0ddc --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmdp21njcaEdTTDFo4JedXxWNvch1qqESeNphuNucfa3dK/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"execute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum RouteTypesV2.Provider","name":"provider","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"enum RouteTypesV2.AmountSource","name":"amountSource","type":"uint8"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"providerData","type":"bytes"}],"internalType":"struct RouteTypesV2.RouteLeg","name":"leg","type":"tuple"}],"name":"validate","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"pure","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/adapters/BalancerRouteExecutorAdapter.sol":"BalancerRouteExecutorAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/adapters/BalancerRouteExecutorAdapter.sol":{"keccak256":"0x9fc1cf935b0ce23520d18228e046f8f62ebf854515ee67879ded81367af5c061","license":"MIT","urls":["bzz-raw://f54ea2464184ebc293e2c8f1dc64def3f53a00bcef3cfd15068925256be593e0","dweb:/ipfs/QmYwtU3hnQj7J1xBp7hKb4PHk1EDCmLm4nuDtAz14HMtDy"]},"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmdufGx2ZyB72jCxxesLxZqkBn8GCTCBq7XnjETgZ5eATV/archive-info.json b/verification-sources/chain138-metadata-archive/QmdufGx2ZyB72jCxxesLxZqkBn8GCTCBq7XnjETgZ5eATV/archive-info.json new file mode 100644 index 0000000..9959e57 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdufGx2ZyB72jCxxesLxZqkBn8GCTCBq7XnjETgZ5eATV/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmdufGx2ZyB72jCxxesLxZqkBn8GCTCBq7XnjETgZ5eATV", + "metadata_digest": "e7541c61926fe52d86741d67fd4312e6a5fccc9a280538bf0b7dc8a8a678460c", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol", + "contract_name": "IUniswapV2Pair", + "compiler": "0.6.6", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/fafa493132a3d2f65cdfc44051edfddd.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmdufGx2ZyB72jCxxesLxZqkBn8GCTCBq7XnjETgZ5eATV/metadata.json b/verification-sources/chain138-metadata-archive/QmdufGx2ZyB72jCxxesLxZqkBn8GCTCBq7XnjETgZ5eATV/metadata.json new file mode 100644 index 0000000..36f35f5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdufGx2ZyB72jCxxesLxZqkBn8GCTCBq7XnjETgZ5eATV/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.6+commit.6c089d02"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"reserve0","type":"uint112"},{"internalType":"uint112","name":"reserve1","type":"uint112"},{"internalType":"uint32","name":"blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol":"IUniswapV2Pair"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x7c9bc70e5996c763e02ff38905282bc24fb242b0ef2519a003b36824fc524a4b","urls":["bzz-raw://85d5ad2dd23ee127f40907a12865a1e8cb5828814f6f2480285e1827dd72dedf","dweb:/ipfs/QmayKQWJgWmr46DqWseADyUanmqxh662hPNdAkdHRjiQQH"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmdwJVN9teBM4n3yuBTcowJPpmwu9YQdTepTu3UuTNHngv/archive-info.json b/verification-sources/chain138-metadata-archive/QmdwJVN9teBM4n3yuBTcowJPpmwu9YQdTepTu3UuTNHngv/archive-info.json new file mode 100644 index 0000000..5ccc364 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdwJVN9teBM4n3yuBTcowJPpmwu9YQdTepTu3UuTNHngv/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmdwJVN9teBM4n3yuBTcowJPpmwu9YQdTepTu3UuTNHngv", + "metadata_digest": "e7bfc50e9d2a8f179cbfc7b4572075c65b5a18f25dd37ec08b3815c215d779ef", + "source_path": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol", + "contract_name": "ERC1967Proxy", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmdwJVN9teBM4n3yuBTcowJPpmwu9YQdTepTu3UuTNHngv/metadata.json b/verification-sources/chain138-metadata-archive/QmdwJVN9teBM4n3yuBTcowJPpmwu9YQdTepTu3UuTNHngv/metadata.json new file mode 100644 index 0000000..280e921 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmdwJVN9teBM4n3yuBTcowJPpmwu9YQdTepTu3UuTNHngv/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"}],"devdoc":{"details":"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}]},"events":{"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"constructor":{"details":"Initializes the upgradeable proxy with an initial implementation specified by `implementation`. If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an encoded function call, and allows initializing the storage of the proxy like a Solidity constructor. Requirements: - If `data` is empty, `msg.value` must be zero."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":"ERC1967Proxy"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"keccak256":"0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec","license":"MIT","urls":["bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c","dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/Proxy.sol":{"keccak256":"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd","license":"MIT","urls":["bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac","dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qme1ByYE4nVUcfUxixcaNGwSLdRBJiqEPw3BNL5GkVPDsF/archive-info.json b/verification-sources/chain138-metadata-archive/Qme1ByYE4nVUcfUxixcaNGwSLdRBJiqEPw3BNL5GkVPDsF/archive-info.json new file mode 100644 index 0000000..c418a26 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qme1ByYE4nVUcfUxixcaNGwSLdRBJiqEPw3BNL5GkVPDsF/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qme1ByYE4nVUcfUxixcaNGwSLdRBJiqEPw3BNL5GkVPDsF", + "metadata_digest": "e8beba30d4beb78206007cbb7525eeaa5261a223226662de85e866aac62e0ce2", + "source_path": "contracts/dbis/DBIS_SettlementRouter.sol", + "contract_name": "DBIS_SettlementRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qme1ByYE4nVUcfUxixcaNGwSLdRBJiqEPw3BNL5GkVPDsF/metadata.json b/verification-sources/chain138-metadata-archive/Qme1ByYE4nVUcfUxixcaNGwSLdRBJiqEPw3BNL5GkVPDsF/metadata.json new file mode 100644 index 0000000..754e1d0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qme1ByYE4nVUcfUxixcaNGwSLdRBJiqEPw3BNL5GkVPDsF/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"_rootRegistry","type":"address"},{"internalType":"address","name":"_eip712Lib","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"MessageIdConsumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"assetClass","type":"uint8"}],"name":"MintExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"RouterPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"isoType","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"isoHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"accountingRef","type":"bytes32"},{"indexed":false,"internalType":"uint8","name":"fundsStatus","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"corridor","type":"bytes32"},{"indexed":false,"internalType":"uint8","name":"assetClass","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"SettlementRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CHAIN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRU_MINT_CONTROLLER_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARTICIPANT_REGISTRY_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNER_REGISTRY_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"corridorDailyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"corridorUsedToday","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Lib","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"bytes32","name":"isoType","type":"bytes32"},{"internalType":"bytes32","name":"isoHash","type":"bytes32"},{"internalType":"bytes32","name":"accountingRef","type":"bytes32"},{"internalType":"enum IDBISTypes.FundsStatus","name":"fundsStatus","type":"uint8"},{"internalType":"bytes32","name":"corridor","type":"bytes32"},{"internalType":"enum IDBISTypes.AssetClass","name":"assetClass","type":"uint8"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint64","name":"notBefore","type":"uint64"},{"internalType":"uint64","name":"expiresAt","type":"uint64"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"}],"internalType":"struct IDBISTypes.MintAuth","name":"auth","type":"tuple"}],"name":"getMintAuthDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmountPerMessage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootRegistry","outputs":[{"internalType":"contract DBIS_RootRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridor","type":"bytes32"},{"internalType":"uint256","name":"cap","type":"uint256"}],"name":"setCorridorDailyCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"}],"name":"setMaxAmountPerMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"bytes32","name":"isoType","type":"bytes32"},{"internalType":"bytes32","name":"isoHash","type":"bytes32"},{"internalType":"bytes32","name":"accountingRef","type":"bytes32"},{"internalType":"enum IDBISTypes.FundsStatus","name":"fundsStatus","type":"uint8"},{"internalType":"bytes32","name":"corridor","type":"bytes32"},{"internalType":"enum IDBISTypes.AssetClass","name":"assetClass","type":"uint8"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint64","name":"notBefore","type":"uint64"},{"internalType":"uint64","name":"expiresAt","type":"uint64"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"}],"internalType":"struct IDBISTypes.MintAuth","name":"auth","type":"tuple"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"submitMintAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedMessageIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/DBIS_SettlementRouter.sol":"DBIS_SettlementRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dbis/DBIS_GRU_MintController.sol":{"keccak256":"0xaf4335354ffcd7dbd347dfdee11844b30c3c41f0146ea364fefee5c423859d2a","license":"MIT","urls":["bzz-raw://973464f81ca10982aa6e88c5e51f649418d69329ce3cc14978fe2a261d346557","dweb:/ipfs/QmXgBMbsCx5J24j1Hsma7QrVdpXYWLmTmUy3Rqup1vDNaz"]},"contracts/dbis/DBIS_ParticipantRegistry.sol":{"keccak256":"0xa11f0a3b715e551ba0450ec718284084a64ea1469734f5607e27d75b03a39dd7","license":"MIT","urls":["bzz-raw://958bfbf38f5af48679d869f9e7386f8cc3eba284c5a99314f3da75f30a46e652","dweb:/ipfs/QmaRSybCjAS8fY6NpbV1BiVMKarn5pxbsj5i39UJjfmVYU"]},"contracts/dbis/DBIS_RootRegistry.sol":{"keccak256":"0x8363d9754d5d068b8551d61ad589496faae637714bf383ba5463e1b321b42a4b","license":"MIT","urls":["bzz-raw://407f94c0fb1229bff4d5cbf4c3728757d4bb970dd731bfddf5cbb1bfa1924505","dweb:/ipfs/QmPVzxWWUmkZpS6RLn5VXjSQbr5gwP6uXUobWGTbcw2Pvg"]},"contracts/dbis/DBIS_SettlementRouter.sol":{"keccak256":"0xfa6159a97d1296049e3cff46d15142bfaaf7f1fec77f45540a072f7a691ef003","license":"MIT","urls":["bzz-raw://c56faf539f23bd62a248110ab1c6354cee3245211b00127769162b200480f594","dweb:/ipfs/QmY4GnCVBqrPsoq7WoWx7eRTX5bDFAjXbUsLw1sUXdXLNe"]},"contracts/dbis/DBIS_SignerRegistry.sol":{"keccak256":"0xc75d67d4d75d78ab582560b19b6a93f7ea2dc0e958678aed6bc41e25d763fa6e","license":"MIT","urls":["bzz-raw://4edfce11bd6cfe501e7d7662b39f910076aa064277af47ded14927fe3634c5ae","dweb:/ipfs/QmbjMn6pDzYx5CHvLxXePQNEVtxLeDXxG9GZ5GKDtgoojr"]},"contracts/dbis/IDBISTypes.sol":{"keccak256":"0x1bb363bec4bd479a62db2e2e52b9420b0544be3c7e09dcc88b1b4061c23b7731","license":"MIT","urls":["bzz-raw://f6160b4aa259c5b5a716194b884b4612e6f9627ab8283657ab2476fd3188dc1d","dweb:/ipfs/QmX8xSb3kMuWr7WZdWFJUrAFVZQQKs6vedJYZPNF43DjgX"]},"contracts/dbis/IDBIS_EIP712Helper.sol":{"keccak256":"0xbf68a20c4148ff149ea88a24855664287126597c95ddf6523f6747045a85ecae","license":"MIT","urls":["bzz-raw://38c3425f4a22875b835659f5928d39a308aec5017b0e44576aa882cdeaa9a2fa","dweb:/ipfs/QmSfFwR5GZ3kad4SYMda2akmvVGHPzNxei2fLcNDUjpbWd"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qme7VHL5Pon9fKUmtuL9HXjVLLX8LAvJNdSDGXV3fdH5fV/archive-info.json b/verification-sources/chain138-metadata-archive/Qme7VHL5Pon9fKUmtuL9HXjVLLX8LAvJNdSDGXV3fdH5fV/archive-info.json new file mode 100644 index 0000000..e3d43cf --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qme7VHL5Pon9fKUmtuL9HXjVLLX8LAvJNdSDGXV3fdH5fV/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qme7VHL5Pon9fKUmtuL9HXjVLLX8LAvJNdSDGXV3fdH5fV", + "metadata_digest": "ea5bc7ec2fb357b547065341d278179ef35e2ab3b1f186ad068a4011e3c3da48", + "source_path": "contracts/registry/GRUAssetRegistryFacet.sol", + "contract_name": "GRUAssetRegistryFacet", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qme7VHL5Pon9fKUmtuL9HXjVLLX8LAvJNdSDGXV3fdH5fV/metadata.json b/verification-sources/chain138-metadata-archive/Qme7VHL5Pon9fKUmtuL9HXjVLLX8LAvJNdSDGXV3fdH5fV/metadata.json new file mode 100644 index 0000000..5b55d0c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qme7VHL5Pon9fKUmtuL9HXjVLLX8LAvJNdSDGXV3fdH5fV/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registry","type":"address"}],"name":"RegistrySet","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getAsset","outputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"},{"internalType":"enum UniversalAssetRegistry.ComplianceLevel","name":"complianceLevel","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"jurisdiction","type":"string"},{"internalType":"uint8","name":"volatilityScore","type":"uint8"},{"internalType":"uint256","name":"minBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"maxBridgeAmount","type":"uint256"},{"internalType":"uint256","name":"dailyVolumeLimit","type":"uint256"},{"internalType":"address","name":"pmmPool","type":"address"},{"internalType":"bool","name":"hasLiquidity","type":"bool"},{"internalType":"uint256","name":"liquidityReserveUSD","type":"uint256"},{"internalType":"bool","name":"requiresGovernance","type":"bool"},{"internalType":"address[]","name":"validators","type":"address[]"},{"internalType":"uint256","name":"validationThreshold","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"registeredAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"},{"internalType":"bytes32","name":"assetId","type":"bytes32"},{"internalType":"bytes32","name":"assetVersionId","type":"bytes32"},{"internalType":"bytes32","name":"governanceProfileId","type":"bytes32"},{"internalType":"bytes32","name":"supervisionProfileId","type":"bytes32"},{"internalType":"bytes32","name":"storageNamespace","type":"bytes32"},{"internalType":"address","name":"canonicalUnderlyingAsset","type":"address"},{"internalType":"bool","name":"isWrappedTransport","type":"bool"},{"internalType":"bool","name":"supervisionRequired","type":"bool"},{"internalType":"bool","name":"governmentApprovalRequired","type":"bool"},{"internalType":"uint256","name":"minimumUpgradeNoticePeriod","type":"uint256"},{"internalType":"string","name":"regulatoryDisclosureURI","type":"string"},{"internalType":"string","name":"reportingURI","type":"string"}],"internalType":"struct UniversalAssetRegistry.UniversalAsset","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getAssetType","outputs":[{"internalType":"enum UniversalAssetRegistry.AssetType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum UniversalAssetRegistry.AssetType","name":"assetType","type":"uint8"}],"name":"getAssetsByType","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isAssetActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"contract UniversalAssetRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Attach to M00 Diamond; set registry via setRegistry. All c* registered via registerGRUCompliantAsset are then queryable via this facet.","kind":"dev","methods":{},"title":"GRUAssetRegistryFacet","version":1},"userdoc":{"kind":"user","methods":{"setRegistry(address)":{"notice":"Set the UniversalAssetRegistry to delegate to. Call from Diamond cut init (only Diamond owner can execute cut)."}},"notice":"ERC-2535 Diamond facet adapter: delegates to UniversalAssetRegistry so M00 Diamond exposes GRU/c* asset registry.","version":1}},"settings":{"compilationTarget":{"contracts/registry/GRUAssetRegistryFacet.sol":"GRUAssetRegistryFacet"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/interfaces/IRegulatedAssetMetadata.sol":{"keccak256":"0xadd3375c386bdcba265f8c86af44abba61c16273ab010d4d387ac5de99e00774","license":"MIT","urls":["bzz-raw://476c112fe4549ef958365e0206f474e994e871842c66d86d7abefe76bf779ba9","dweb:/ipfs/QmPBbRBXzy1hryRQyVJ85do79cRqGJZjvuU4JBqmWCdTUP"]},"contracts/registry/GRUAssetRegistryFacet.sol":{"keccak256":"0xffc6f3e953a47bee32d4a2fc6207517120315e61ea95e7ce9c718cb0f626b273","license":"MIT","urls":["bzz-raw://792db9dda68986b862a9986a7ac5e5f6f038fd5d00b300f138c4e76fd26ad1f1","dweb:/ipfs/Qmd3VqFhq5puXL3pNW2DRbPVB3xP2x82H5CxtKJjaKy2bR"]},"contracts/registry/UniversalAssetRegistry.sol":{"keccak256":"0xabca6e992555c7ebb7a1721daa4b3b2183704098f406ad4dfe8f485d67f348bd","license":"MIT","urls":["bzz-raw://71fb9b629b6a81b70d8b0d3ace5145bd6180a6159c5f3cdde96264489005c93b","dweb:/ipfs/QmSvrSi3GBsepJwghZbWmoud8BgtunroGKghrnhNi5wvbu"]},"contracts/vendor/openzeppelin/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x13abc6a676d96786968c09d5e2a8825d9d335bbc82e3253d24afad9ee74b7e0e","license":"MIT","urls":["bzz-raw://ed5b50e4663591a5f70e5f844984f76ae803cf632928867fdc44e2631d1319b0","dweb:/ipfs/QmeRbnUsqNNZtz755HWDvTM2fz27T4s8N7EivL3sy7hi2V"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qme98KYMYGwTPbv6T3K1pEfDsEd9U5L8sJjE15d67G2sVU/archive-info.json b/verification-sources/chain138-metadata-archive/Qme98KYMYGwTPbv6T3K1pEfDsEd9U5L8sJjE15d67G2sVU/archive-info.json new file mode 100644 index 0000000..2a68ab9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qme98KYMYGwTPbv6T3K1pEfDsEd9U5L8sJjE15d67G2sVU/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qme98KYMYGwTPbv6T3K1pEfDsEd9U5L8sJjE15d67G2sVU", + "metadata_digest": "eac73dac12f3d4343f1aaa9cfeb8677d3294c15e50dae048931eee31031ea893", + "source_path": "contracts/bridge/CWMultiTokenBridgeL1.sol", + "contract_name": "CWMultiTokenBridgeL1", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qme98KYMYGwTPbv6T3K1pEfDsEd9U5L8sJjE15d67G2sVU/metadata.json b/verification-sources/chain138-metadata-archive/Qme98KYMYGwTPbv6T3K1pEfDsEd9U5L8sJjE15d67G2sVU/metadata.json new file mode 100644 index 0000000..6bfa4ef --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qme98KYMYGwTPbv6T3K1pEfDsEd9U5L8sJjE15d67G2sVU/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_sendRouter","type":"address"},{"internalType":"address","name":"_receiveRouter","type":"address"},{"internalType":"address","name":"_feeToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiverBridge","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"DestinationConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newFeeToken","type":"address"}],"name":"FeeTokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"maxOutstandingAmount","type":"uint256"}],"name":"MaxOutstandingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MessageSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"chainOutstanding","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalOutstandingAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockedBalanceAmount","type":"uint256"}],"name":"OutstandingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRouter","type":"address"}],"name":"ReceiveRouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newVerifier","type":"address"}],"name":"ReserveVerifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRouter","type":"address"}],"name":"SendRouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SupportedCanonicalTokenConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"TokenPauseUpdated","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"}],"name":"availableToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum IRouterClient.TokenAmountType","name":"amountType","type":"uint8"}],"internalType":"struct IRouterClient.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct IRouterClient.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"address","name":"receiverBridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"configureDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"configureSupportedCanonicalToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"destinations","outputs":[{"internalType":"address","name":"receiverBridge","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockAndSend","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"maxOutstanding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"outstandingMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveVerifier","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sendRouter","outputs":[{"internalType":"contract IRouterClient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeToken","type":"address"}],"name":"setFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxOutstanding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setReceiveRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"}],"name":"setReserveVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setSendRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"bool","name":"isPaused","type":"bool"}],"name":"setTokenPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supportedCanonicalToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalOutstanding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Locks canonical c* tokens on send and releases them on return messages.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{},"title":"CWMultiTokenBridgeL1","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Chain 138 side escrow bridge for non-prefunded c* -> cW* routing.","version":1}},"settings":{"compilationTarget":{"contracts/bridge/CWMultiTokenBridgeL1.sol":"CWMultiTokenBridgeL1"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/CWMultiTokenBridgeL1.sol":{"keccak256":"0x6f840f61fb0d40f358961020a9cf610ce3e99fcb47e5f09a50bfd3170e98a25e","license":"MIT","urls":["bzz-raw://460e72f06d1d5b408b5a563d8a5e9d262e079aeebeeda5632495f46ee685f53b","dweb:/ipfs/QmPvwsgKXEEhUdRokGxbU41cEt3pb89qb7qdbqjPpR3hz7"]},"contracts/bridge/integration/ICWReserveVerifier.sol":{"keccak256":"0x4fc7b6b8f10d5ec64517fc31559a2b7ac52c7496a7effaac7d29fbfc64f44528","license":"MIT","urls":["bzz-raw://7ef5196aefc98a7d6b295118500062ec62c05d786e3f9ad1ae8414d48279605d","dweb:/ipfs/QmU6cE1rZA99DygbUECyCoQwc5t2g1aJrcs3BiZ4SPoksa"]},"contracts/ccip/IRouterClient.sol":{"keccak256":"0x31dcbbb924a1875c183d5129d29a4216ba449644017258b96c6a03d206190103","license":"MIT","urls":["bzz-raw://d4d5412c95ec310eef5f5f6042f8342838951945b06d816169d725f196eede66","dweb:/ipfs/QmemNGPDRVt2NX1u3vjYnSUFmHkBCF9NEfaxqzUXiSzxmM"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qme9uJiLKHscCUnLJVtnSfrdDvVjhLAnHNYD7jViqWhffK/archive-info.json b/verification-sources/chain138-metadata-archive/Qme9uJiLKHscCUnLJVtnSfrdDvVjhLAnHNYD7jViqWhffK/archive-info.json new file mode 100644 index 0000000..e85d870 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qme9uJiLKHscCUnLJVtnSfrdDvVjhLAnHNYD7jViqWhffK/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qme9uJiLKHscCUnLJVtnSfrdDvVjhLAnHNYD7jViqWhffK", + "metadata_digest": "eafa1b3ee2c0caa9a137e8d26d3829ae68d570546b1f1645d6ff1f77c42d5f56", + "source_path": "contracts/bridge/integration/eMoneyPolicyEnforcer.sol", + "contract_name": "eMoneyPolicyEnforcer", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qme9uJiLKHscCUnLJVtnSfrdDvVjhLAnHNYD7jViqWhffK/metadata.json b/verification-sources/chain138-metadata-archive/Qme9uJiLKHscCUnLJVtnSfrdDvVjhLAnHNYD7jViqWhffK/metadata.json new file mode 100644 index 0000000..03370e1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qme9uJiLKHscCUnLJVtnSfrdDvVjhLAnHNYD7jViqWhffK/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"bridgeEscrowVault_","type":"address"},{"internalType":"address","name":"policyManager_","type":"address"},{"internalType":"address","name":"complianceRegistry_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"TokenNotEnabled","type":"error"},{"inputs":[],"name":"TransferNotAuthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TokenEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"}],"name":"TransferAuthorized","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ENFORCER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeEscrowVault","outputs":[{"internalType":"contract BridgeEscrowVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"checkTransferAuthorization","outputs":[{"internalType":"bool","name":"authorized","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"context","type":"bytes"}],"name":"checkTransferAuthorizationWithContext","outputs":[{"internalType":"bool","name":"authorized","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"complianceRegistry","outputs":[{"internalType":"contract ComplianceRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"disableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"enableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"enabledTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isTokenEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policyManager","outputs":[{"internalType":"contract PolicyManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Integrates PolicyManager and ComplianceRegistry with bridge","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"checkTransferAuthorization(address,address,address,uint256)":{"params":{"amount":"Amount to bridge","from":"Source address","to":"Destination address (bridge escrow)","token":"eMoney token address"},"returns":{"authorized":"True if transfer is authorized"}},"checkTransferAuthorizationWithContext(address,address,address,uint256,bytes)":{"params":{"amount":"Amount to transfer","context":"Additional context data","from":"Source address","to":"Destination address","token":"eMoney token address"},"returns":{"authorized":"True if transfer is authorized"}},"disableToken(address)":{"params":{"token":"eMoney token address"}},"enableToken(address)":{"params":{"token":"eMoney token address"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"eMoneyPolicyEnforcer","version":1},"userdoc":{"kind":"user","methods":{"checkTransferAuthorization(address,address,address,uint256)":{"notice":"Check if transfer is authorized before bridge operation"},"checkTransferAuthorizationWithContext(address,address,address,uint256,bytes)":{"notice":"Check transfer authorization with additional context"},"disableToken(address)":{"notice":"Disable an eMoney token"},"enableToken(address)":{"notice":"Enable an eMoney token for policy enforcement"},"isTokenEnabled(address)":{"notice":"Check if token is enabled"}},"notice":"Enforces eMoney transfer restrictions on bridge operations","version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/eMoneyPolicyEnforcer.sol":"eMoneyPolicyEnforcer"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/bridge/integration/eMoneyPolicyEnforcer.sol":{"keccak256":"0x2d379f421dc3d8cfc2839967b070966c1b8e5ff3cb4914b092970797599fe774","license":"MIT","urls":["bzz-raw://06954c2c63f82b67bb003a47f6cfb6ccd0f429b8a44e068a04cd4a0a51bf48ea","dweb:/ipfs/QmZ8mrwLkzsJuA4sz75wbh43n9SXoPF2hxfWsaQjjQft1T"]},"contracts/bridge/interop/BridgeEscrowVault.sol":{"keccak256":"0x4411967c78a32fc800fd88c7875c4552e247579659899621e6b0dbe7d1cffd98","license":"MIT","urls":["bzz-raw://e1ccca6d988e95a0255160c5908691a99744f7f988653765d42e9d1b7019e357","dweb:/ipfs/QmUy33pNSkMciFLkoQpbP7kBSDcwLHiNS48xzeEvdktRmF"]},"contracts/emoney/ComplianceRegistry.sol":{"keccak256":"0xc1477127bf8e7bfa2749793336a288bf2747002a4041291ce6fbb42d2fdfb0fc","license":"MIT","urls":["bzz-raw://fe9f4f299de6f9ba0a48bcd122266d26c4101684d5127512c0d9ee86db7f93cf","dweb:/ipfs/QmXWrGHhjCmBWkdoHtSHwqxY8JVAo8MBEvmLN4WyGkVUPx"]},"contracts/emoney/PolicyManager.sol":{"keccak256":"0x6fc3ce5719a36a6c7eba0b4ed0528218c2086196c914d8f20e498d79edbe83f6","license":"MIT","urls":["bzz-raw://311f13e5161def51d2ba3ff760a8be61a5dd8bec028ad1046432893a892257ec","dweb:/ipfs/QmVAZccBs3CPBaE6ChiYTfqF5anDUyJEjvnLyV6U5oqqSi"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeA22quxCn85UmPXQbb2b15NiiTn2iWL7DBdZZFuhm8wQ/archive-info.json b/verification-sources/chain138-metadata-archive/QmeA22quxCn85UmPXQbb2b15NiiTn2iWL7DBdZZFuhm8wQ/archive-info.json new file mode 100644 index 0000000..cb42c35 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeA22quxCn85UmPXQbb2b15NiiTn2iWL7DBdZZFuhm8wQ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeA22quxCn85UmPXQbb2b15NiiTn2iWL7DBdZZFuhm8wQ", + "metadata_digest": "eb01b64485b647559b0ef9b7e96ee73ad4d80366b27738c92684922b04884daf", + "source_path": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol", + "contract_name": "ERC165Upgradeable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeA22quxCn85UmPXQbb2b15NiiTn2iWL7DBdZZFuhm8wQ/metadata.json b/verification-sources/chain138-metadata-archive/QmeA22quxCn85UmPXQbb2b15NiiTn2iWL7DBdZZFuhm8wQ/metadata.json new file mode 100644 index 0000000..e87a5d8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeA22quxCn85UmPXQbb2b15NiiTn2iWL7DBdZZFuhm8wQ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Implementation of the {IERC165} interface. Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check for the additional interface id that will be supported. For example: ```solidity function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); } ```","errors":{"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":"ERC165Upgradeable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeB6xXkVbM89v6MTfPjLxuiLC3MUjjNHZscRS4e9vbY6e/archive-info.json b/verification-sources/chain138-metadata-archive/QmeB6xXkVbM89v6MTfPjLxuiLC3MUjjNHZscRS4e9vbY6e/archive-info.json new file mode 100644 index 0000000..ce0e4c1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeB6xXkVbM89v6MTfPjLxuiLC3MUjjNHZscRS4e9vbY6e/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeB6xXkVbM89v6MTfPjLxuiLC3MUjjNHZscRS4e9vbY6e", + "metadata_digest": "eb48dcbad20941c6e27398d795d1d8c2a8d52fa98786936b0028eef8f1fc7f03", + "source_path": "contracts/bridge/trustless/integration/ISOCurrencyManager.sol", + "contract_name": "ISOCurrencyManager", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeB6xXkVbM89v6MTfPjLxuiLC3MUjjNHZscRS4e9vbY6e/metadata.json b/verification-sources/chain138-metadata-archive/QmeB6xXkVbM89v6MTfPjLxuiLC3MUjjNHZscRS4e9vbY6e/metadata.json new file mode 100644 index 0000000..b96d81e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeB6xXkVbM89v6MTfPjLxuiLC3MUjjNHZscRS4e9vbY6e/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_reserveSystem","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CurrencyNotRegistered","type":"error"},{"inputs":[],"name":"InvalidCurrencyCode","type":"error"},{"inputs":[],"name":"InvalidXauRate","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"XauNotSet","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"fromCurrency","type":"string"},{"indexed":false,"internalType":"string","name":"toCurrency","type":"string"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"}],"name":"CurrencyConverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"currencyCode","type":"string"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"xauRate","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isTokenized","type":"bool"}],"name":"CurrencyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"string[]","name":"currencyCodes","type":"string[]"},{"internalType":"address[]","name":"tokenAddresses","type":"address[]"},{"internalType":"uint256[]","name":"xauRates","type":"uint256[]"}],"name":"batchRegisterCurrencies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fromCurrency","type":"string"},{"internalType":"string","name":"toCurrency","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"convertViaXAU","outputs":[{"internalType":"uint256","name":"targetAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"currencies","outputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"xauRate","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"isTokenized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllSupportedCurrencies","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getCurrencyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"}],"name":"getCurrencyInfo","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"xauRate","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"isTokenized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fromCurrency","type":"string"},{"internalType":"string","name":"toCurrency","type":"string"}],"name":"getCurrencyRate","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"xauRate","type":"uint256"}],"name":"registerCurrency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveSystem","outputs":[{"internalType":"contract IReserveSystem","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_xauAddress","type":"address"}],"name":"setXAUAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedCurrencies","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currencyCode","type":"string"},{"internalType":"uint256","name":"newXauRate","type":"uint256"}],"name":"updateXauRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xauAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"All currency conversions go through XAU: CurrencyA \u2192 XAU \u2192 CurrencyB","errors":{"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{"batchRegisterCurrencies(string[],address[],uint256[])":{"params":{"currencyCodes":"Array of currency codes","tokenAddresses":"Array of token addresses","xauRates":"Array of XAU rates"}},"constructor":{"params":{"_reserveSystem":"ReserveSystem contract address"}},"convertViaXAU(string,string,uint256)":{"params":{"amount":"Amount to convert","fromCurrency":"Source currency code","toCurrency":"Target currency code"},"returns":{"targetAmount":"Amount in target currency"}},"getAllSupportedCurrencies()":{"returns":{"_0":"Array of currency codes"}},"getCurrencyAddress(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"_0":"Token address (address(0) if not tokenized)"}},"getCurrencyInfo(string)":{"params":{"currencyCode":"ISO-4217 currency code"},"returns":{"isActive":"Whether currency is active","isTokenized":"Whether currency is tokenized","tokenAddress":"Token address","xauRate":"XAU rate"}},"getCurrencyRate(string,string)":{"params":{"fromCurrency":"Source currency code","toCurrency":"Target currency code"},"returns":{"rate":"Exchange rate (toCurrency per fromCurrency, in 18 decimals)"}},"owner()":{"details":"Returns the address of the current owner."},"registerCurrency(string,address,uint256)":{"params":{"currencyCode":"ISO-4217 currency code (USD, EUR, GBP, JPY, etc.)","tokenAddress":"Token contract address (address(0) if not tokenized)","xauRate":"Rate: 1 oz XAU = xauRate units of currency (in 18 decimals)"},"returns":{"_0":"success Whether registration was successful"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"setXAUAddress(address)":{"params":{"_xauAddress":"XAU token address"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"updateXauRate(string,uint256)":{"params":{"currencyCode":"ISO-4217 currency code","newXauRate":"New XAU rate"}}},"title":"ISOCurrencyManager","version":1},"userdoc":{"kind":"user","methods":{"batchRegisterCurrencies(string[],address[],uint256[])":{"notice":"Batch register currencies"},"constructor":{"notice":"Constructor"},"convertViaXAU(string,string,uint256)":{"notice":"Convert between currencies via XAU triangulation"},"getAllSupportedCurrencies()":{"notice":"Get all supported currencies"},"getCurrencyAddress(string)":{"notice":"Get token address for a currency code"},"getCurrencyInfo(string)":{"notice":"Get currency info"},"getCurrencyRate(string,string)":{"notice":"Get exchange rate for currency pair"},"registerCurrency(string,address,uint256)":{"notice":"Register ISO-4217 currency"},"setXAUAddress(address)":{"notice":"Set XAU (gold) address"},"updateXauRate(string,uint256)":{"notice":"Update XAU rate for a currency"}},"notice":"Manages all ISO-4217 currencies with XAU triangulation support","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/integration/ISOCurrencyManager.sol":"ISOCurrencyManager"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"contracts/bridge/trustless/integration/IISOCurrencyManager.sol":{"keccak256":"0x86621efe39480253f7b4036ab06c9e2b5beb6e4232a837e9935148c2f4ff484b","license":"MIT","urls":["bzz-raw://95a7d0837173661744d191570b1b27dd3351f1b8e74d446a80aed044e1e37391","dweb:/ipfs/QmcXXu9chU9Ame3gC215y3QSAd3ujX1XEJ7pof8A5dRQ1G"]},"contracts/bridge/trustless/integration/ISOCurrencyManager.sol":{"keccak256":"0x60e371736f6f287cc65df500cc993774e0069d98e1e5109f34722a400255011a","license":"MIT","urls":["bzz-raw://65382255bdaf180fb37ca93855638acc7ae0c6ec286aa278b855d9dcd1c41aa5","dweb:/ipfs/QmRLnt9xfGpcKUPo41QCrRWXLZcMFPhAHFqRzSSFWgGwF5"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeH6dKvVxT1Qps9H5jAsMQ3j7rs48eM52PxMnn1PFtNcQ/archive-info.json b/verification-sources/chain138-metadata-archive/QmeH6dKvVxT1Qps9H5jAsMQ3j7rs48eM52PxMnn1PFtNcQ/archive-info.json new file mode 100644 index 0000000..58270d3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeH6dKvVxT1Qps9H5jAsMQ3j7rs48eM52PxMnn1PFtNcQ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeH6dKvVxT1Qps9H5jAsMQ3j7rs48eM52PxMnn1PFtNcQ", + "metadata_digest": "ecd1f902fb8e9816ddccbd1b29fc69326ee9dfc2642a8c778d84fd07e5988e11", + "source_path": "@openzeppelin/contracts/utils/StorageSlot.sol", + "contract_name": "StorageSlot", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeH6dKvVxT1Qps9H5jAsMQ3j7rs48eM52PxMnn1PFtNcQ/metadata.json b/verification-sources/chain138-metadata-archive/QmeH6dKvVxT1Qps9H5jAsMQ3j7rs48eM52PxMnn1PFtNcQ/metadata.json new file mode 100644 index 0000000..b4e5352 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeH6dKvVxT1Qps9H5jAsMQ3j7rs48eM52PxMnn1PFtNcQ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[],"devdoc":{"details":"Library for reading and writing primitive types to specific storage slots. Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. This library helps with reading and writing to such slots without the need for inline assembly. The functions in this library return Slot structs that contain a `value` member that can be used to read or write. Example usage to set ERC1967 implementation slot: ```solidity contract ERC1967 { bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } function _setImplementation(address newImplementation) internal { require(newImplementation.code.length > 0); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } } ```","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/StorageSlot.sol":"StorageSlot"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeHUZspEyVhoNKyP8gqZaYvdyuskC5e7V1Ap19wGMB4wy/archive-info.json b/verification-sources/chain138-metadata-archive/QmeHUZspEyVhoNKyP8gqZaYvdyuskC5e7V1Ap19wGMB4wy/archive-info.json new file mode 100644 index 0000000..6a3f8f0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeHUZspEyVhoNKyP8gqZaYvdyuskC5e7V1Ap19wGMB4wy/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeHUZspEyVhoNKyP8gqZaYvdyuskC5e7V1Ap19wGMB4wy", + "metadata_digest": "eceac7ea70f8dd49524ef7934044bde2f194b0b6627ba0f4708959faf6b1f290", + "source_path": "contracts/vault/Liquidation.sol", + "contract_name": "Liquidation", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeHUZspEyVhoNKyP8gqZaYvdyuskC5e7V1Ap19wGMB4wy/metadata.json b/verification-sources/chain138-metadata-archive/QmeHUZspEyVhoNKyP8gqZaYvdyuskC5e7V1Ap19wGMB4wy/metadata.json new file mode 100644 index 0000000..7b94be2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeHUZspEyVhoNKyP8gqZaYvdyuskC5e7V1Ap19wGMB4wy/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"ledger_","type":"address"},{"internalType":"address","name":"collateralAdapter_","type":"address"},{"internalType":"address","name":"eMoneyJoin_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"uint256","name":"seizedCollateral","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repaidDebt","type":"uint256"},{"indexed":true,"internalType":"address","name":"liquidator","type":"address"}],"name":"VaultLiquidated","type":"event"},{"inputs":[],"name":"BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"canLiquidate","outputs":[{"internalType":"bool","name":"liquidatable","type":"bool"},{"internalType":"uint256","name":"healthRatio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralAdapter","outputs":[{"internalType":"contract ICollateralAdapter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eMoneyJoin","outputs":[{"internalType":"contract IeMoneyJoin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ledger","outputs":[{"internalType":"contract ILedger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"maxDebt","type":"uint256"}],"name":"liquidate","outputs":[{"internalType":"uint256","name":"seizedCollateral","type":"uint256"},{"internalType":"uint256","name":"repaidDebt","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidationBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collateralAdapter_","type":"address"}],"name":"setCollateralAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"eMoneyJoin_","type":"address"}],"name":"setEMoneyJoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ledger_","type":"address"}],"name":"setLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"setLiquidationBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Permissioned liquidators only, no public auctions","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"canLiquidate(address)":{"params":{"vault":"Vault address"},"returns":{"healthRatio":"Current health ratio in basis points","liquidatable":"True if vault can be liquidated"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"liquidate(address,address,uint256)":{"params":{"currency":"Debt currency address","maxDebt":"Maximum debt to liquidate","vault":"Vault address to liquidate"},"returns":{"repaidDebt":"Amount of debt repaid","seizedCollateral":"Amount of collateral seized"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setCollateralAdapter(address)":{"params":{"collateralAdapter_":"New adapter address"}},"setEMoneyJoin(address)":{"params":{"eMoneyJoin_":"New join address"}},"setLedger(address)":{"params":{"ledger_":"New ledger address"}},"setLiquidationBonus(uint256)":{"params":{"bonus":"New liquidation bonus in basis points"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"stateVariables":{"liquidationBonus":{"return":"bonus Liquidation bonus in basis points","returns":{"_0":"bonus Liquidation bonus in basis points"}}},"title":"Liquidation","version":1},"userdoc":{"kind":"user","methods":{"canLiquidate(address)":{"notice":"Check if a vault can be liquidated"},"liquidate(address,address,uint256)":{"notice":"Liquidate an undercollateralized vault"},"liquidationBonus()":{"notice":"Get liquidation bonus (penalty)"},"setCollateralAdapter(address)":{"notice":"Set collateral adapter address"},"setEMoneyJoin(address)":{"notice":"Set eMoney join address"},"setLedger(address)":{"notice":"Set ledger address"},"setLiquidationBonus(uint256)":{"notice":"Set liquidation bonus"}},"notice":"Handles liquidation of undercollateralized vaults","version":1}},"settings":{"compilationTarget":{"contracts/vault/Liquidation.sol":"Liquidation"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/vault/Liquidation.sol":{"keccak256":"0x4a63ab16ddc96d2690a00197a55952f5f747551e748bd446b119c1ed143c86b5","license":"MIT","urls":["bzz-raw://a85981149e7f94ff1e08476f5d6f69895962afe9b4203b3c9ce1ceb2e71756b8","dweb:/ipfs/QmWADHmP2j98AcqYMq7GPybGeURxZtb2GjH8gmdLC9jhH2"]},"contracts/vault/interfaces/ICollateralAdapter.sol":{"keccak256":"0x45c2214f58500a3ad92ea1ea2c018bb0e71e1dd441e6c293cfbb88ffa5629efc","license":"MIT","urls":["bzz-raw://92e981007a82373da7f08bd7ec4de0b92126091b73356e641adaaf3d46531a1b","dweb:/ipfs/QmbcB6qSdN9imJEEdQQngBkokhtXNMK5eTUyjccpjyLSVd"]},"contracts/vault/interfaces/ILedger.sol":{"keccak256":"0x3a8e8a2d48458202fffe065e691c1abeae50ccb8fc2af8971af7e94ae23d9273","license":"MIT","urls":["bzz-raw://6214e1b92f519cb100b315b2eb64b61e21479f75ebecd3a2e74524806347a5d4","dweb:/ipfs/QmRzswWJmFPa5BAy2npMN2WwrdmNd8pymySMHo1EdSZXED"]},"contracts/vault/interfaces/ILiquidation.sol":{"keccak256":"0xd2ee5b5fbb37cd8bc3f161ea91712ba127bb707b8e80bfd5d2a427e8a77bef25","license":"MIT","urls":["bzz-raw://45b557aeee05915ad1e7323791310255ffd7d9299ba1933b901e822cb9ce4d77","dweb:/ipfs/QmZu4UC3G6S4fRgKANyBNDvEUJvagEJEwyX6j3sNVS7VJ4"]},"contracts/vault/interfaces/IeMoneyJoin.sol":{"keccak256":"0x61df69d6ee9f5966c1b3bfb9bdf938506af7895b0afa8543d73588fb6470ca49","license":"MIT","urls":["bzz-raw://063843b2dfc41802c80bb808e1783701273ce23ef773aa08827f3b923d7102d3","dweb:/ipfs/QmXwc26Y1yAgetLapiUGPLCPoxkp3tAHf5cuSfPBC4PPLw"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeJkbH7qTnFm45iNLuvEzAeRVvjQZN4nbAs1uMzGQUZm6/archive-info.json b/verification-sources/chain138-metadata-archive/QmeJkbH7qTnFm45iNLuvEzAeRVvjQZN4nbAs1uMzGQUZm6/archive-info.json new file mode 100644 index 0000000..f4be606 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeJkbH7qTnFm45iNLuvEzAeRVvjQZN4nbAs1uMzGQUZm6/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeJkbH7qTnFm45iNLuvEzAeRVvjQZN4nbAs1uMzGQUZm6", + "metadata_digest": "ed3e7af5f2d20fef061bb70d1972967ee152be280cbd23b9090dc3d1409b3bc5", + "source_path": "contracts/vault/adapters/eMoneyJoin.sol", + "contract_name": "eMoneyJoin", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeJkbH7qTnFm45iNLuvEzAeRVvjQZN4nbAs1uMzGQUZm6/metadata.json b/verification-sources/chain138-metadata-archive/QmeJkbH7qTnFm45iNLuvEzAeRVvjQZN4nbAs1uMzGQUZm6/metadata.json new file mode 100644 index 0000000..8c5ea12 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeJkbH7qTnFm45iNLuvEzAeRVvjQZN4nbAs1uMzGQUZm6/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"eMoneyBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"eMoneyMinted","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"}],"name":"approveCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedCurrencies","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"}],"name":"revokeCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Mint/burn restricted to this adapter, transfer restricted via Compliance Registry","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"approveCurrency(address)":{"params":{"currency":"Currency address"}},"burn(address,address,uint256)":{"params":{"amount":"Amount to burn","currency":"eMoney currency address","from":"Source address"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"mint(address,address,uint256)":{"params":{"amount":"Amount to mint","currency":"eMoney currency address","to":"Recipient address"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeCurrency(address)":{"params":{"currency":"Currency address"}},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"eMoneyJoin","version":1},"userdoc":{"kind":"user","methods":{"approveCurrency(address)":{"notice":"Approve a currency for eMoney operations"},"burn(address,address,uint256)":{"notice":"Burn eMoney from a repayer"},"mint(address,address,uint256)":{"notice":"Mint eMoney to a borrower"},"revokeCurrency(address)":{"notice":"Revoke currency approval"}},"notice":"Adapter for minting and burning eMoney tokens","version":1}},"settings":{"compilationTarget":{"contracts/vault/adapters/eMoneyJoin.sol":"eMoneyJoin"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/interfaces/IeMoneyToken.sol":{"keccak256":"0x8d3cf1363659e699865278e2ab9908e89e4544c68cbee50f4505b315bc5d0300","license":"MIT","urls":["bzz-raw://71859853a4e5c3e80e7bb089243330be8815e0ca9a4963f11d0387ba5fc7a9ef","dweb:/ipfs/QmP2GPTym9ut99SvAzJygTqp6HGpNbYUdbVTFusnfEdgdS"]},"contracts/vault/adapters/eMoneyJoin.sol":{"keccak256":"0x1171cb52676110707745e3134e773643eaf7c7087d28809fa7f80339f962c645","license":"MIT","urls":["bzz-raw://e4760e8989b9036c408c55d121506909666552a3e097b01baad64b07e6b7e312","dweb:/ipfs/QmXQFA8NPWf9qeeDjbfjhbJGtwA1SsSWbgS2dCKnGXYpdt"]},"contracts/vault/interfaces/IeMoneyJoin.sol":{"keccak256":"0x61df69d6ee9f5966c1b3bfb9bdf938506af7895b0afa8543d73588fb6470ca49","license":"MIT","urls":["bzz-raw://063843b2dfc41802c80bb808e1783701273ce23ef773aa08827f3b923d7102d3","dweb:/ipfs/QmXwc26Y1yAgetLapiUGPLCPoxkp3tAHf5cuSfPBC4PPLw"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeKVgWukLgsD6HW2jFgS3v6fHHTv3G5Ey3Y2a2msAiyos/archive-info.json b/verification-sources/chain138-metadata-archive/QmeKVgWukLgsD6HW2jFgS3v6fHHTv3G5Ey3Y2a2msAiyos/archive-info.json new file mode 100644 index 0000000..79ed6ea --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeKVgWukLgsD6HW2jFgS3v6fHHTv3G5Ey3Y2a2msAiyos/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeKVgWukLgsD6HW2jFgS3v6fHHTv3G5Ey3Y2a2msAiyos", + "metadata_digest": "ed6f33e2dd7f30908e9e679207f518df38c1a6cc8e1fd516a91ef88024f04e36", + "source_path": "contracts/tokens/WETH10.sol", + "contract_name": "IERC3156FlashLender", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeKVgWukLgsD6HW2jFgS3v6fHHTv3G5Ey3Y2a2msAiyos/metadata.json b/verification-sources/chain138-metadata-archive/QmeKVgWukLgsD6HW2jFgS3v6fHHTv3G5Ey3Y2a2msAiyos/metadata.json new file mode 100644 index 0000000..98c9c96 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeKVgWukLgsD6HW2jFgS3v6fHHTv3G5Ey3Y2a2msAiyos/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC3156FlashBorrower","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"maxFlashLoan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/tokens/WETH10.sol":"IERC3156FlashLender"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/tokens/WETH10.sol":{"keccak256":"0xdb94dafe131a1ecde041c9830f89e5c82f48a338b8b0f44b64e2c2fa8267d3fe","license":"MIT","urls":["bzz-raw://acf422bdefa787500f16dfce819d41194ee9bbaec119d664274c110101e7f15a","dweb:/ipfs/QmUZswCiwKNzk7P5iZdvw9m7Cw22znaDFwCH2Yrf987CLv"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeLfvovM7inyHi9LBvDyXZQRiqfnUx6hwApS3P82hSJNU/archive-info.json b/verification-sources/chain138-metadata-archive/QmeLfvovM7inyHi9LBvDyXZQRiqfnUx6hwApS3P82hSJNU/archive-info.json new file mode 100644 index 0000000..f0c879a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeLfvovM7inyHi9LBvDyXZQRiqfnUx6hwApS3P82hSJNU/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeLfvovM7inyHi9LBvDyXZQRiqfnUx6hwApS3P82hSJNU", + "metadata_digest": "edbc5e82063075ff9bc5fdcc412dd7aa60d4013911ba790626822de638901509", + "source_path": "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol", + "contract_name": "UUPSUpgradeable", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeLfvovM7inyHi9LBvDyXZQRiqfnUx6hwApS3P82hSJNU/metadata.json b/verification-sources/chain138-metadata-archive/QmeLfvovM7inyHi9LBvDyXZQRiqfnUx6hwApS3P82hSJNU/metadata.json new file mode 100644 index 0000000..599ece0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeLfvovM7inyHi9LBvDyXZQRiqfnUx6hwApS3P82hSJNU/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing `UUPSUpgradeable` with a custom implementation of upgrades. The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"stateVariables":{"UPGRADE_INTERFACE_VERSION":{"details":"The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)` and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called, while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string. If the getter returns `\"5.0.0\"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must be the empty byte string if no function should be called, making it impossible to invoke the `receive` function during an upgrade."},"__self":{"custom:oz-upgrades-unsafe-allow":"state-variable-immutable"}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":"UUPSUpgradeable"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeMJGanS5P89PN6geEdi5ZpfLKajrQCLdk3SUfj6VPCQR/archive-info.json b/verification-sources/chain138-metadata-archive/QmeMJGanS5P89PN6geEdi5ZpfLKajrQCLdk3SUfj6VPCQR/archive-info.json new file mode 100644 index 0000000..4bee70d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeMJGanS5P89PN6geEdi5ZpfLKajrQCLdk3SUfj6VPCQR/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeMJGanS5P89PN6geEdi5ZpfLKajrQCLdk3SUfj6VPCQR", + "metadata_digest": "ede575c17d56987099425d46aae495171f8b47e14fbc9278e5a7d4efdb4ee9aa", + "source_path": "contracts/bridge/atomic/interfaces/IAtomicQuoteEngine.sol", + "contract_name": "IAtomicQuoteEngine", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeMJGanS5P89PN6geEdi5ZpfLKajrQCLdk3SUfj6VPCQR/metadata.json b/verification-sources/chain138-metadata-archive/QmeMJGanS5P89PN6geEdi5ZpfLKajrQCLdk3SUfj6VPCQR/metadata.json new file mode 100644 index 0000000..a8ab968 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeMJGanS5P89PN6geEdi5ZpfLKajrQCLdk3SUfj6VPCQR/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"fulfiller","type":"address"}],"name":"quote","outputs":[{"components":[{"internalType":"enum AtomicTypes.RouteClass","name":"routeClass","type":"uint8"},{"internalType":"uint256","name":"availableLiquidity","type":"uint256"},{"internalType":"uint256","name":"freeLiquidity","type":"uint256"},{"internalType":"uint256","name":"fulfillerFee","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"uint256","name":"requiredBond","type":"uint256"},{"internalType":"uint256","name":"settlementBacklog","type":"uint256"},{"internalType":"uint256","name":"deadlineWindow","type":"uint256"},{"internalType":"bool","name":"corridorEnabled","type":"bool"},{"internalType":"bool","name":"corridorDegraded","type":"bool"},{"internalType":"bool","name":"fulfillerAuthorized","type":"bool"},{"internalType":"bool","name":"fulfillerBondSufficient","type":"bool"}],"internalType":"struct AtomicTypes.AtomicQuote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/interfaces/IAtomicQuoteEngine.sol":"IAtomicQuoteEngine"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/atomic/AtomicTypes.sol":{"keccak256":"0x85a1bdb93368582a1dea40790269ee2eda65047cd8812b88efdee02eebd343c1","license":"MIT","urls":["bzz-raw://ace009c17e8b2d13ef3be8d1116d772fd5e2c4cc3483e17c63915e8d9fa00fba","dweb:/ipfs/Qmayj5VSpYsqftkgYnmTQahKXaBK9tiAivjjMHvyYwZoRM"]},"contracts/bridge/atomic/interfaces/IAtomicQuoteEngine.sol":{"keccak256":"0x60b57a6dfe09f280080ed21df346777a6de582cc9cac10a5bf67fe37318cca40","license":"MIT","urls":["bzz-raw://d2977c2294a2ba99120803456ea31347915b5295bbec445dd6b482979436bfd0","dweb:/ipfs/QmTxP19wPEF2RqhECU7TFCjzHt27gGXqkK4WY5zHwMRMFi"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeMq1jy5RQHF1oakn8qnGsLtTALSEBGZtoTsQ9G619cb4/archive-info.json b/verification-sources/chain138-metadata-archive/QmeMq1jy5RQHF1oakn8qnGsLtTALSEBGZtoTsQ9G619cb4/archive-info.json new file mode 100644 index 0000000..87b38b2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeMq1jy5RQHF1oakn8qnGsLtTALSEBGZtoTsQ9G619cb4/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeMq1jy5RQHF1oakn8qnGsLtTALSEBGZtoTsQ9G619cb4", + "metadata_digest": "ee0838f30fac906d8138a98238690b0620778dd29a0b549f8aec1441a5b955c3", + "source_path": "contracts/bridge/integration/CWReserveVerifier.sol", + "contract_name": "CWReserveVerifier", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeMq1jy5RQHF1oakn8qnGsLtTALSEBGZtoTsQ9G619cb4/metadata.json b/verification-sources/chain138-metadata-archive/QmeMq1jy5RQHF1oakn8qnGsLtTALSEBGZtoTsQ9G619cb4/metadata.json new file mode 100644 index 0000000..183415e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeMq1jy5RQHF1oakn8qnGsLtTALSEBGZtoTsQ9G619cb4/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"bridge_","type":"address"},{"internalType":"address","name":"stablecoinReserveVault_","type":"address"},{"internalType":"address","name":"reserveSystem_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"BridgeTokenPaused","type":"error"},{"inputs":[],"name":"ChainOutstandingCapExceeded","type":"error"},{"inputs":[],"name":"EscrowInvariantViolation","type":"error"},{"inputs":[],"name":"ReserveSystemBackingInsufficient","type":"error"},{"inputs":[],"name":"ReserveSystemRequired","type":"error"},{"inputs":[],"name":"TokenNotConfigured","type":"error"},{"inputs":[],"name":"TokenOwnerMismatch","type":"error"},{"inputs":[],"name":"UnsupportedCanonicalToken","type":"error"},{"inputs":[],"name":"VaultBackingInsufficient","type":"error"},{"inputs":[],"name":"VaultRequired","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newBridge","type":"address"}],"name":"BridgeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newReserveSystem","type":"address"}],"name":"ReserveSystemUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newVault","type":"address"}],"name":"StablecoinReserveVaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"},{"indexed":true,"internalType":"address","name":"reserveAsset","type":"address"},{"indexed":false,"internalType":"bool","name":"requireVaultBacking","type":"bool"},{"indexed":false,"internalType":"bool","name":"requireReserveSystemBalance","type":"bool"},{"indexed":false,"internalType":"bool","name":"requireTokenOwnerMatchVault","type":"bool"}],"name":"TokenConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"canonicalToken","type":"address"}],"name":"TokenDisabled","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HARD_THRESHOLD_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"contract ICWMultiTokenBridgeL1Accounting","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"address","name":"reserveAsset","type":"address"},{"internalType":"bool","name":"requireVaultBacking","type":"bool"},{"internalType":"bool","name":"requireReserveSystemBalance","type":"bool"},{"internalType":"bool","name":"requireTokenOwnerMatchVault","type":"bool"}],"name":"configureToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"}],"name":"disableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"}],"name":"getVerificationStatus","outputs":[{"components":[{"internalType":"bool","name":"supportedCanonicalToken","type":"bool"},{"internalType":"bool","name":"bridgePaused","type":"bool"},{"internalType":"bool","name":"escrowSufficient","type":"bool"},{"internalType":"bool","name":"chainCapSufficient","type":"bool"},{"internalType":"bool","name":"reserveSystemAdequate","type":"bool"},{"internalType":"bool","name":"vaultAdequate","type":"bool"},{"internalType":"bool","name":"tokenOwnerMatchesVault","type":"bool"},{"internalType":"bool","name":"passes","type":"bool"},{"internalType":"uint256","name":"lockedBalanceAmount","type":"uint256"},{"internalType":"uint256","name":"totalOutstandingAmount","type":"uint256"},{"internalType":"uint256","name":"chainOutstandingAmount","type":"uint256"},{"internalType":"uint256","name":"maxOutstandingAmount","type":"uint256"},{"internalType":"uint256","name":"canonicalTotalSupply","type":"uint256"},{"internalType":"uint256","name":"reserveSystemBalance","type":"uint256"},{"internalType":"uint256","name":"vaultReserveBalance","type":"uint256"},{"internalType":"uint256","name":"vaultBackingRatio","type":"uint256"}],"internalType":"struct CWReserveVerifier.VerificationStatus","name":"status","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveSystem","outputs":[{"internalType":"contract IReserveSystem","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bridge_","type":"address"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reserveSystem_","type":"address"}],"name":"setReserveSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stablecoinReserveVault_","type":"address"}],"name":"setStablecoinReserveVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stablecoinReserveVault","outputs":[{"internalType":"contract IStablecoinReserveVaultLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenConfigs","outputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address","name":"reserveAsset","type":"address"},{"internalType":"bool","name":"requireVaultBacking","type":"bool"},{"internalType":"bool","name":"requireReserveSystemBalance","type":"bool"},{"internalType":"bool","name":"requireTokenOwnerMatchVault","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalToken","type":"address"},{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"verifyLock","outputs":[{"internalType":"bool","name":"verified","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Intended for cUSDC/cUSDT -> cWUSDC/cWUSDT hard-peg flows on Chain 138.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"CWReserveVerifier","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Verifies bridge escrow and canonical reserve backing before allowing new cW minting.","version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/CWReserveVerifier.sol":"CWReserveVerifier"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/CWReserveVerifier.sol":{"keccak256":"0xb0fb3977b950390981f5b4e884042a1817f777f09ae626eaa9cbbc617e190dd1","license":"MIT","urls":["bzz-raw://0512dbc999a0683944d1b9a51b2e96a490fc4e7f6d6abca35050717aa979829c","dweb:/ipfs/QmR1WwkrRRBzFuHq4hWVzHZgBkjs3usumrBjg9BYnMwskR"]},"contracts/bridge/integration/ICWReserveVerifier.sol":{"keccak256":"0x4fc7b6b8f10d5ec64517fc31559a2b7ac52c7496a7effaac7d29fbfc64f44528","license":"MIT","urls":["bzz-raw://7ef5196aefc98a7d6b295118500062ec62c05d786e3f9ad1ae8414d48279605d","dweb:/ipfs/QmU6cE1rZA99DygbUECyCoQwc5t2g1aJrcs3BiZ4SPoksa"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeQ6xnonTP2mmGMoFJk3GCEYZUHngNbdwsScXDY8oLqGY/archive-info.json b/verification-sources/chain138-metadata-archive/QmeQ6xnonTP2mmGMoFJk3GCEYZUHngNbdwsScXDY8oLqGY/archive-info.json new file mode 100644 index 0000000..9f518f6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeQ6xnonTP2mmGMoFJk3GCEYZUHngNbdwsScXDY8oLqGY/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeQ6xnonTP2mmGMoFJk3GCEYZUHngNbdwsScXDY8oLqGY", + "metadata_digest": "ee9d6af53c0872aaa7376f36d8dd9c4406c124ab570e920f029e7d446c697b3d", + "source_path": "contracts/smart-accounts/AccountWalletRegistryExtended.sol", + "contract_name": "AccountWalletRegistryExtended", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeQ6xnonTP2mmGMoFJk3GCEYZUHngNbdwsScXDY8oLqGY/metadata.json b/verification-sources/chain138-metadata-archive/QmeQ6xnonTP2mmGMoFJk3GCEYZUHngNbdwsScXDY8oLqGY/metadata.json new file mode 100644 index 0000000..b242987 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeQ6xnonTP2mmGMoFJk3GCEYZUHngNbdwsScXDY8oLqGY/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"smartAccountFactory_","type":"address"},{"internalType":"address","name":"entryPoint_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"walletRefId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"provider","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"linkedAt","type":"uint64"}],"name":"AccountWalletLinked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"AccountWalletUnlinked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"smartAccount","type":"address"},{"indexed":false,"internalType":"bytes32","name":"provider","type":"bytes32"}],"name":"SmartAccountLinked","type":"event"},{"inputs":[],"name":"ACCOUNT_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"getAccounts","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"}],"name":"getWallets","outputs":[{"components":[{"internalType":"bytes32","name":"walletRefId","type":"bytes32"},{"internalType":"uint64","name":"linkedAt","type":"uint64"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"provider","type":"bytes32"}],"internalType":"struct WalletLink[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"isLinked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"isSmartAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSmartAccountAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"internalType":"bytes32","name":"walletRefId","type":"bytes32"},{"internalType":"bytes32","name":"provider","type":"bytes32"}],"name":"linkAccountToWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"internalType":"address","name":"smartAccount","type":"address"},{"internalType":"bytes32","name":"provider","type":"bytes32"}],"name":"linkSmartAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"entryPoint_","type":"address"}],"name":"setEntryPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"}],"name":"setSmartAccountFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"smartAccountFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"accountRefId","type":"bytes32"},{"internalType":"bytes32","name":"walletRefId","type":"bytes32"}],"name":"unlinkAccountFromWallet","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Links accountRefId to contract addresses (smart accounts); walletRefId = keccak256(abi.encodePacked(smartAccount))","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"AccountWalletRegistryExtended","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Extends account-wallet registry with Smart Account (contract) support","version":1}},"settings":{"compilationTarget":{"contracts/smart-accounts/AccountWalletRegistryExtended.sol":"AccountWalletRegistryExtended"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/emoney/interfaces/IAccountWalletRegistry.sol":{"keccak256":"0x86ba615b8d4f52f505cc59b276e36bbd501f65d4cf3fedb7758d86e7fb78e4df","license":"MIT","urls":["bzz-raw://2a18f0b6b1a8c44f516bd3ed7ed51665fc1f50c7dfe1b1711f2ed7125db60a89","dweb:/ipfs/QmeFDv2naXrzN2vQJQKszE9KmYb3HG88zLW4RqXJAFTo73"]},"contracts/smart-accounts/AccountWalletRegistryExtended.sol":{"keccak256":"0x9af79e1be382f2f4d3b42fad7d70df828fff1661e32f89fa2308469b3465258b","license":"MIT","urls":["bzz-raw://54d6588bc7a8b5a9ac7fb2fd2e4d4fcd97fa124fca831c333202e657be615363","dweb:/ipfs/QmTtf763KACrstGrVjYBBNsuUVnZRCYMbfKFgKZwVyJPTn"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeS9iGtVaWDzsu7kwoNY9wgdme3LoKxDZrasKjWcJjk1M/archive-info.json b/verification-sources/chain138-metadata-archive/QmeS9iGtVaWDzsu7kwoNY9wgdme3LoKxDZrasKjWcJjk1M/archive-info.json new file mode 100644 index 0000000..dbe9dcf --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeS9iGtVaWDzsu7kwoNY9wgdme3LoKxDZrasKjWcJjk1M/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeS9iGtVaWDzsu7kwoNY9wgdme3LoKxDZrasKjWcJjk1M", + "metadata_digest": "ef23b044ba8622fcdcf80eab3d5cd8a1b6994501006008eded4ee65afd3592e0", + "source_path": "contracts/compliance/LegallyCompliantBaseV2.sol", + "contract_name": "LegallyCompliantBaseV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeS9iGtVaWDzsu7kwoNY9wgdme3LoKxDZrasKjWcJjk1M/metadata.json b/verification-sources/chain138-metadata-archive/QmeS9iGtVaWDzsu7kwoNY9wgdme3LoKxDZrasKjWcJjk1M/metadata.json new file mode 100644 index 0000000..0256dbd --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeS9iGtVaWDzsu7kwoNY9wgdme3LoKxDZrasKjWcJjk1M/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"operationType","type":"bytes32"},{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"reasonHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"accountingRef","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"messageCorrelationId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"CompliantOperationDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mechanism","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisputeResolutionMechanismSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"JurisdictionDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LegalNotice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"ValueTransferDeclared","type":"event"},{"inputs":[],"name":"COMPLIANCE_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISPUTE_RESOLUTION_MECHANISM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_ARBITRATION_SUPPORT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_TRADE_TERMS_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_UNIFORM_RULES_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTRUMENT_CLASSIFICATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_20022_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_27001_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_3166_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_4217_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_8601_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_ENFORCEABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_FRAMEWORK_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_JURISDICTION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATORY_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_OF_PROCESS_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFERABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAVEL_RULE_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"recordLegalNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Replaces tx.origin-based attribution with explicit initiator/authorizer/executor fields.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"LegallyCompliantBaseV2","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Explicit-actor legal and audit metadata base for GRU c* V2 tokens.","version":1}},"settings":{"compilationTarget":{"contracts/compliance/LegallyCompliantBaseV2.sol":"LegallyCompliantBaseV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/compliance/LegallyCompliantBaseV2.sol":{"keccak256":"0x8097270ea1c6c78c9d39861536d19d01318a136d425c85d758105de4eeb0049c","license":"MIT","urls":["bzz-raw://4a629636fc02ed9cfd4134274d8a2125e440d0b024793c1ab0d12a96422596d9","dweb:/ipfs/QmdvmzFw21CJzKAL4Cf89dssoSFCPhurNGn1fCDkAS3bBN"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeSPZWdmE1QzjujpmmxjektE92c7WhNpzhiEm3d55fXQN/archive-info.json b/verification-sources/chain138-metadata-archive/QmeSPZWdmE1QzjujpmmxjektE92c7WhNpzhiEm3d55fXQN/archive-info.json new file mode 100644 index 0000000..07769e7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeSPZWdmE1QzjujpmmxjektE92c7WhNpzhiEm3d55fXQN/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeSPZWdmE1QzjujpmmxjektE92c7WhNpzhiEm3d55fXQN", + "metadata_digest": "ef3358fa0d04bba6464934aec345fb2b8c41abc7d32bcf4ea9499b37a7818433", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router01.sol", + "contract_name": "IUniswapV2Router01", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeSPZWdmE1QzjujpmmxjektE92c7WhNpzhiEm3d55fXQN/metadata.json b/verification-sources/chain138-metadata-archive/QmeSPZWdmE1QzjujpmmxjektE92c7WhNpzhiEm3d55fXQN/metadata.json new file mode 100644 index 0000000..7dda75f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeSPZWdmE1QzjujpmmxjektE92c7WhNpzhiEm3d55fXQN/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router01.sol":"IUniswapV2Router01"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Router01.sol":{"keccak256":"0x12091adc186fe351c639dc62aa0b691f78c7bea054c27bbb4b58acd02e1b2ce7","license":"GPL-3.0","urls":["bzz-raw://e7a3f1b86be061741f5483f0f153389aa9e89a24a1556c8784df44ce288b5183","dweb:/ipfs/QmejsqRXse45aoyDjccfKEnZ1uZzdqUtjsYbAS3ThAMesu"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeTTK71hS14E6zqBMWNePsu3eugLZyZBbwwAKpoUYzjyt/archive-info.json b/verification-sources/chain138-metadata-archive/QmeTTK71hS14E6zqBMWNePsu3eugLZyZBbwwAKpoUYzjyt/archive-info.json new file mode 100644 index 0000000..bf15706 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeTTK71hS14E6zqBMWNePsu3eugLZyZBbwwAKpoUYzjyt/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeTTK71hS14E6zqBMWNePsu3eugLZyZBbwwAKpoUYzjyt", + "metadata_digest": "ef792b9a246b8d65c8e1797496ead7e2e120b699a62c16edb7916916aefeb583", + "source_path": "contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol", + "contract_name": "ID3MMQuoter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeTTK71hS14E6zqBMWNePsu3eugLZyZBbwwAKpoUYzjyt/metadata.json b/verification-sources/chain138-metadata-archive/QmeTTK71hS14E6zqBMWNePsu3eugLZyZBbwwAKpoUYzjyt/metadata.json new file mode 100644 index 0000000..be1a4c9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeTTK71hS14E6zqBMWNePsu3eugLZyZBbwwAKpoUYzjyt/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"}],"name":"querySellTokens","outputs":[{"internalType":"uint256","name":"payFromAmount","type":"uint256"},{"internalType":"uint256","name":"receiveToAmount","type":"uint256"},{"internalType":"uint256","name":"vusdAmount","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"mtFee","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol":"ID3MMQuoter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/RouteTypesV2.sol":{"keccak256":"0x67ae4f3aff86cc97804b1155197aac3a1eb8ee5dbc59e95af385b7d6e378748d","license":"MIT","urls":["bzz-raw://215a136fd499bf193d7a2cad9d83c6da45ff72b1044f1ef548af810248c43356","dweb:/ipfs/QmXKLtFzQsaijTJpnAjakW6xCwL3AoNgSc6FKCBZ8YfR58"]},"contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol":{"keccak256":"0x214ca73ac7045c2085a8a9a9441da261be92b18fcbbf91ac5024d75e936f89ad","license":"MIT","urls":["bzz-raw://ed826e12e33f9b59a2022f889bb40862a912d4672811027c886f7017cb38bec7","dweb:/ipfs/QmWaVH9sq2W8qKcYGsJXJNi5uB6u1cFKC9whSFLTezVGYx"]},"contracts/bridge/trustless/interfaces/IRouteExecutorAdapter.sol":{"keccak256":"0x4cf4450b87473cdb4418b4857deec0a2ad9b741de95e4f21a9ddc9515875f988","license":"MIT","urls":["bzz-raw://702f585782941f058c1d82bd3b1dd1e04bce8866b897aa9473c4bf9eced2fa3e","dweb:/ipfs/QmY8PrE5XvHzY6StQX7xgzfEC3tdtY2oVv7yWFAM82P9wQ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeVByLT1WL5TyCxNno4wSjSdnhSB2KWyUsLyemnzx2Qu8/archive-info.json b/verification-sources/chain138-metadata-archive/QmeVByLT1WL5TyCxNno4wSjSdnhSB2KWyUsLyemnzx2Qu8/archive-info.json new file mode 100644 index 0000000..c8704f3 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeVByLT1WL5TyCxNno4wSjSdnhSB2KWyUsLyemnzx2Qu8/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeVByLT1WL5TyCxNno4wSjSdnhSB2KWyUsLyemnzx2Qu8", + "metadata_digest": "efeafc6ab621ad36b8a2c1ce4b5f39114166fa404c377bc8f78cbb42835e3b83", + "source_path": "@openzeppelin/contracts/utils/math/Math.sol", + "contract_name": "Math", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeVByLT1WL5TyCxNno4wSjSdnhSB2KWyUsLyemnzx2Qu8/metadata.json b/verification-sources/chain138-metadata-archive/QmeVByLT1WL5TyCxNno4wSjSdnhSB2KWyUsLyemnzx2Qu8/metadata.json new file mode 100644 index 0000000..a8d2816 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeVByLT1WL5TyCxNno4wSjSdnhSB2KWyUsLyemnzx2Qu8/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"MathOverflowedMulDiv","type":"error"}],"devdoc":{"details":"Standard math utilities missing in the Solidity language.","errors":{"MathOverflowedMulDiv()":[{"details":"Muldiv operation overflow."}]},"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"@openzeppelin/contracts/utils/math/Math.sol":"Math"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeWxZCyb3oqFYEByDvQRSUD6YVZxSvVUFnVBshMVGkQiE/archive-info.json b/verification-sources/chain138-metadata-archive/QmeWxZCyb3oqFYEByDvQRSUD6YVZxSvVUFnVBshMVGkQiE/archive-info.json new file mode 100644 index 0000000..84180cb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeWxZCyb3oqFYEByDvQRSUD6YVZxSvVUFnVBshMVGkQiE/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeWxZCyb3oqFYEByDvQRSUD6YVZxSvVUFnVBshMVGkQiE", + "metadata_digest": "f05efa63cf54a007ab5ae5630e77040c1652bd494b782a55314184c426e44cbb", + "source_path": "contracts/vendor/uniswap-v2-periphery/interfaces/IERC20.sol", + "contract_name": "IERC20", + "compiler": "0.6.6", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/fafa493132a3d2f65cdfc44051edfddd.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeWxZCyb3oqFYEByDvQRSUD6YVZxSvVUFnVBshMVGkQiE/metadata.json b/verification-sources/chain138-metadata-archive/QmeWxZCyb3oqFYEByDvQRSUD6YVZxSvVUFnVBshMVGkQiE/metadata.json new file mode 100644 index 0000000..f7bb76c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeWxZCyb3oqFYEByDvQRSUD6YVZxSvVUFnVBshMVGkQiE/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.6+commit.6c089d02"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-periphery/interfaces/IERC20.sol":"IERC20"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-periphery/interfaces/IERC20.sol":{"keccak256":"0x61db17aebc5d812c7002d15c1da954065e56abe49d64b14c034abe5604d70eb3","urls":["bzz-raw://b006685e753f9120469f10b09c159f222d4cb8b507a6c1f0c14ed50c883ebe66","dweb:/ipfs/QmSyY7iTugbczPwfGK67etiyPULenYGzzRYbt8aabwwkUb"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeZMvBgZyC5oGuFcPJaH7LcYG581wJ5sLW2WjchZrs1FH/archive-info.json b/verification-sources/chain138-metadata-archive/QmeZMvBgZyC5oGuFcPJaH7LcYG581wJ5sLW2WjchZrs1FH/archive-info.json new file mode 100644 index 0000000..0e0bf29 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeZMvBgZyC5oGuFcPJaH7LcYG581wJ5sLW2WjchZrs1FH/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeZMvBgZyC5oGuFcPJaH7LcYG581wJ5sLW2WjchZrs1FH", + "metadata_digest": "f0fc8e0a49a4afee1d9c0fc7245689eabd5c750090cf02a469fb30b691ba549c", + "source_path": "contracts/bridge/integration/CWAssetReserveVerifier.sol", + "contract_name": "IBalanceOfAsset", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeZMvBgZyC5oGuFcPJaH7LcYG581wJ5sLW2WjchZrs1FH/metadata.json b/verification-sources/chain138-metadata-archive/QmeZMvBgZyC5oGuFcPJaH7LcYG581wJ5sLW2WjchZrs1FH/metadata.json new file mode 100644 index 0000000..70abdca --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeZMvBgZyC5oGuFcPJaH7LcYG581wJ5sLW2WjchZrs1FH/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/CWAssetReserveVerifier.sol":"IBalanceOfAsset"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/CWAssetReserveVerifier.sol":{"keccak256":"0xcb55f1e9a1cf66ac3664c2b1aefe5fea606cb5cf49d6c1fe28d8a801a6304b26","license":"MIT","urls":["bzz-raw://cd2bdfc516e4e6ada08aea0e897acebdf9fbeca2fde3c4dc2141fcba100a31b3","dweb:/ipfs/QmQ7HiaLuE5x1tMZaMCiLrMMYwLx4ijeyBB9L9Cv7bci2y"]},"contracts/bridge/integration/ICWReserveVerifier.sol":{"keccak256":"0x4fc7b6b8f10d5ec64517fc31559a2b7ac52c7496a7effaac7d29fbfc64f44528","license":"MIT","urls":["bzz-raw://7ef5196aefc98a7d6b295118500062ec62c05d786e3f9ad1ae8414d48279605d","dweb:/ipfs/QmU6cE1rZA99DygbUECyCoQwc5t2g1aJrcs3BiZ4SPoksa"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmedrfVSMrhrV9BiHSixN8ab84RmvHZErcVVmUZ7eEuz9p/archive-info.json b/verification-sources/chain138-metadata-archive/QmedrfVSMrhrV9BiHSixN8ab84RmvHZErcVVmUZ7eEuz9p/archive-info.json new file mode 100644 index 0000000..f56461d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmedrfVSMrhrV9BiHSixN8ab84RmvHZErcVVmUZ7eEuz9p/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmedrfVSMrhrV9BiHSixN8ab84RmvHZErcVVmUZ7eEuz9p", + "metadata_digest": "f22361ccb3e25e3fc696afb5dc0a654e0cd8517541c63db3675190edaa5fd193", + "source_path": "contracts/flash/AaveQuotePushFlashReceiver.sol", + "contract_name": "IAavePoolLike", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmedrfVSMrhrV9BiHSixN8ab84RmvHZErcVVmUZ7eEuz9p/metadata.json b/verification-sources/chain138-metadata-archive/QmedrfVSMrhrV9BiHSixN8ab84RmvHZErcVVmUZ7eEuz9p/metadata.json new file mode 100644 index 0000000..97598c0 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmedrfVSMrhrV9BiHSixN8ab84RmvHZErcVVmUZ7eEuz9p/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"receiverAddress","type":"address"},{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"interestRateModes","type":"uint256[]"},{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"uint16","name":"referralCode","type":"uint16"}],"name":"flashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiverAddress","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"uint16","name":"referralCode","type":"uint16"}],"name":"flashLoanSimple","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"flashLoanSimple(address,address,uint256,bytes,uint16)":{"details":"Retained for compatibility with older pool deployments; prefer `flashLoan` for new integrations."}},"version":1},"userdoc":{"kind":"user","methods":{"flashLoan(address,address[],uint256[],uint256[],address,bytes,uint16)":{"notice":"Standard V3 flash loan (single-asset via length-1 arrays). Use this on Aave V3.2+ pools where `flashLoanSimple` may revert with `NotActivated()`."}},"version":1}},"settings":{"compilationTarget":{"contracts/flash/AaveQuotePushFlashReceiver.sol":"IAavePoolLike"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/flash/AaveQuotePushFlashReceiver.sol":{"keccak256":"0x9648a35f371bb79c4782933d66237ee759ab4d546950bf79489c87091ff5d7e5","license":"MIT","urls":["bzz-raw://e4360e49daf3f2ac0a7f0299d0083479909f5ae30de80ad647b37421f4d871c8","dweb:/ipfs/QmVAkMWwMEJwFQ5ELSLJhhoxM6oSPUpkrjTzEZkMH5cdh7"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeeQ4ro5HeDn2wasQmoYRLm72NYbQf9YtZaTDkvo2nUa4/archive-info.json b/verification-sources/chain138-metadata-archive/QmeeQ4ro5HeDn2wasQmoYRLm72NYbQf9YtZaTDkvo2nUa4/archive-info.json new file mode 100644 index 0000000..af1f78b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeeQ4ro5HeDn2wasQmoYRLm72NYbQf9YtZaTDkvo2nUa4/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeeQ4ro5HeDn2wasQmoYRLm72NYbQf9YtZaTDkvo2nUa4", + "metadata_digest": "f246e3afe2123d411fa81383a78225dc238fb680df9cc1fc35e2ec117fe5e5e1", + "source_path": "contracts/oracle/Proxy.sol", + "contract_name": "Proxy", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeeQ4ro5HeDn2wasQmoYRLm72NYbQf9YtZaTDkvo2nUa4/metadata.json b/verification-sources/chain138-metadata-archive/QmeeQ4ro5HeDn2wasQmoYRLm72NYbQf9YtZaTDkvo2nUa4/metadata.json new file mode 100644 index 0000000..4fdffe7 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeeQ4ro5HeDn2wasQmoYRLm72NYbQf9YtZaTDkvo2nUa4/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Based on OpenZeppelin's transparent proxy pattern","kind":"dev","methods":{},"title":"Transparent Proxy","version":1},"userdoc":{"kind":"user","methods":{"changeAdmin(address)":{"notice":"Change admin"},"upgrade(address)":{"notice":"Upgrade the implementation"}},"notice":"Transparent proxy pattern for upgradeable oracle contracts","version":1}},"settings":{"compilationTarget":{"contracts/oracle/Proxy.sol":"Proxy"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/oracle/Proxy.sol":{"keccak256":"0xd010c198cb7a296f95e535c5cd3f092a564cc84fd6072fde968c9109b50a3c71","license":"MIT","urls":["bzz-raw://6f347b63c2c0b1d08e6357fa09da6d96732458c2509b57bb7262eac587faeb37","dweb:/ipfs/QmdibMNiW4ur4REvM663VezLh1qJiLpHrmjCF8p294ifnD"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmehigzkiWH82LQkEtztXxdou4YkQyexcjc5aek7bsUBmb/archive-info.json b/verification-sources/chain138-metadata-archive/QmehigzkiWH82LQkEtztXxdou4YkQyexcjc5aek7bsUBmb/archive-info.json new file mode 100644 index 0000000..ee20e9f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmehigzkiWH82LQkEtztXxdou4YkQyexcjc5aek7bsUBmb/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmehigzkiWH82LQkEtztXxdou4YkQyexcjc5aek7bsUBmb", + "metadata_digest": "f320b06161e50f390f24b182e60d1ae1d3370e582285f6bd5c070fce33872c1a", + "source_path": "contracts/dex/recovered/RecoveredWave1PoolFamily668.sol", + "contract_name": "RecoveredWave1PoolFamily668", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmehigzkiWH82LQkEtztXxdou4YkQyexcjc5aek7bsUBmb/metadata.json b/verification-sources/chain138-metadata-archive/QmehigzkiWH82LQkEtztXxdou4YkQyexcjc5aek7bsUBmb/metadata.json new file mode 100644 index 0000000..7d9c02e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmehigzkiWH82LQkEtztXxdou4YkQyexcjc5aek7bsUBmb/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"}],"devdoc":{"details":"Generated by scripts/verify/recover-wave1-pool-source-families.py from live chain bytecode.","kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"notice":"Recovered verbatim Wave 1 runtime family artifact.","version":1}},"settings":{"compilationTarget":{"contracts/dex/recovered/RecoveredWave1PoolFamily668.sol":"RecoveredWave1PoolFamily668"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/dex/recovered/RecoveredWave1PoolFamily668.sol":{"keccak256":"0x5ac868322a6172e17ff09b3d21fe5894717c88ff1ca7200b3b0329d8be30f016","license":"MIT","urls":["bzz-raw://9af7494dced4fc39e3038c434a633be0c85a392a88c04ee1426428dd4ae1246f","dweb:/ipfs/QmRQvXkcfnBNBvKnMoDHSLa5qoagsQJVrS4ex8hNrcUMW2"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmekm3XFyjXxua2HGkcqLs2YAUA8P3CuAaQLWDNVhPXpBV/archive-info.json b/verification-sources/chain138-metadata-archive/Qmekm3XFyjXxua2HGkcqLs2YAUA8P3CuAaQLWDNVhPXpBV/archive-info.json new file mode 100644 index 0000000..d2c2e06 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmekm3XFyjXxua2HGkcqLs2YAUA8P3CuAaQLWDNVhPXpBV/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "Qmekm3XFyjXxua2HGkcqLs2YAUA8P3CuAaQLWDNVhPXpBV", + "metadata_digest": "f3e817ccf7c65c9a2f13917859aabe479dcc7ab185f3fe682f19802348067a8c", + "source_path": "contracts/vendor/uniswap-v2-core/UniswapV2Pair.sol", + "contract_name": "UniswapV2Pair", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmekm3XFyjXxua2HGkcqLs2YAUA8P3CuAaQLWDNVhPXpBV/metadata.json b/verification-sources/chain138-metadata-archive/Qmekm3XFyjXxua2HGkcqLs2YAUA8P3CuAaQLWDNVhPXpBV/metadata.json new file mode 100644 index 0000000..fcf2b16 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmekm3XFyjXxua2HGkcqLs2YAUA8P3CuAaQLWDNVhPXpBV/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sync","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/UniswapV2Pair.sol":"UniswapV2Pair"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/UniswapV2ERC20.sol":{"keccak256":"0x0599f3684aef3e5f1144e14df1ddd39be24948b7cff125af9c9beca4bc94e1a2","urls":["bzz-raw://962b5efd230c60ce591afed08be4f1def46222da230a527c98c92ee27cf64583","dweb:/ipfs/Qmf5wW4T7F9sNQ1eAgaj94KcFS3hrtU5tTZyPZr8QhgXr8"]},"contracts/vendor/uniswap-v2-core/UniswapV2Pair.sol":{"keccak256":"0xff7332962e80814ad2713d593794458d694a1133524ca393b77ef0912cfd0725","urls":["bzz-raw://6340a14c32430326637700bf79087de2e744fd78327177e7da757917baf5def8","dweb:/ipfs/QmaRygN869CLDx5mUYWmtFbt3MBtZqHVKasKMW5ukY4DX6"]},"contracts/vendor/uniswap-v2-core/interfaces/IERC20.sol":{"keccak256":"0x61db17aebc5d812c7002d15c1da954065e56abe49d64b14c034abe5604d70eb3","urls":["bzz-raw://b006685e753f9120469f10b09c159f222d4cb8b507a6c1f0c14ed50c883ebe66","dweb:/ipfs/QmSyY7iTugbczPwfGK67etiyPULenYGzzRYbt8aabwwkUb"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Callee.sol":{"keccak256":"0xdb17a1fb73e261e736ae8862be2d9a32964fc4b3741f48980f5cdc9d92b99a96","urls":["bzz-raw://468dab23a95d9d9b7d6ce74008d45eef3de2f137ede604e6be6c5e7d0121c5e9","dweb:/ipfs/QmcXwjTfp6tCRgf1KsNQyUAtrqKhiaN6fbaHVGr22eficP"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2ERC20.sol":{"keccak256":"0x9e433765e9ef7b4ff5e406b260b222c47c2aa27d36df756db708064fcb239ae7","urls":["bzz-raw://5b67c24a5e1652b51ad2f37adad2905519f0e05e7c8b2b4d8b3e00b429bb9213","dweb:/ipfs/QmarJq43GabAGGSqtMUb87ACYQt73mSFbXKyFAPDXpbFNM"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xe5905c0989cf5a865ed9bb7b9252536ca011c5b744017a82a7d4443b9c00a891","urls":["bzz-raw://5d2a90a0a796491507462a3da18c3f8819721d571572d765a2207c35bf0a0389","dweb:/ipfs/Qmf9ACYiT3qzjgsYuhm866FBdiBpRMXAPpQhSFbgqcyhHt"]},"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Pair.sol":{"keccak256":"0x7c9bc70e5996c763e02ff38905282bc24fb242b0ef2519a003b36824fc524a4b","urls":["bzz-raw://85d5ad2dd23ee127f40907a12865a1e8cb5828814f6f2480285e1827dd72dedf","dweb:/ipfs/QmayKQWJgWmr46DqWseADyUanmqxh662hPNdAkdHRjiQQH"]},"contracts/vendor/uniswap-v2-core/libraries/Math.sol":{"keccak256":"0x05927cb4aa14897bd567607522c18d2d518fa803ade6f870fac244c6f3702a3b","urls":["bzz-raw://b2805464c2d75cbdd726d6bd5c9b8d1f2c8566b606ec769ffa9a194a42248862","dweb:/ipfs/QmWBa9BsCH8gbncvDFXmfMJX1USTHvAREtc8C7nz6miQpw"]},"contracts/vendor/uniswap-v2-core/libraries/SafeMath.sol":{"keccak256":"0x9c8465de751317860b623cd77f7f53f41a84b6624c0580ee526dcf7a2b7cb80c","urls":["bzz-raw://9b371b3eb0649b486f76cd628cc060354d1ac11fa8baed1170567271655f05d7","dweb:/ipfs/QmTUg31wK9UyX6o1Q1mxE4DQhuc1rWGBanNTu1uagNVQB6"]},"contracts/vendor/uniswap-v2-core/libraries/UQ112x112.sol":{"keccak256":"0x2240694530251ab376ae468d0a2d3ee8b3109e56f2acadbc203cdf341506dd31","urls":["bzz-raw://56f55c411faa2924df0915ff77129b9d8c64d3e4d28554e7234f3774ac95958a","dweb:/ipfs/QmYrzUurXL8ijzS8EnLtQTVD7fKPReosg2DsEPXXCY7ec3"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmenpDkxYSitCmpAGoeuYxJVWPqpfmYUDL2QAe9KPr7LRS/archive-info.json b/verification-sources/chain138-metadata-archive/QmenpDkxYSitCmpAGoeuYxJVWPqpfmYUDL2QAe9KPr7LRS/archive-info.json new file mode 100644 index 0000000..d51f070 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmenpDkxYSitCmpAGoeuYxJVWPqpfmYUDL2QAe9KPr7LRS/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmenpDkxYSitCmpAGoeuYxJVWPqpfmYUDL2QAe9KPr7LRS", + "metadata_digest": "f46ed8a416a7c538b0a7e2b49ef4bcfb7d472ab11bfab9a569ff4931875eff75", + "source_path": "contracts/bridge/adapters/hyperledger/FabricAdapter.sol", + "contract_name": "FabricAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmenpDkxYSitCmpAGoeuYxJVWPqpfmYUDL2QAe9KPr7LRS/metadata.json b/verification-sources/chain138-metadata-archive/QmenpDkxYSitCmpAGoeuYxJVWPqpfmYUDL2QAe9KPr7LRS/metadata.json new file mode 100644 index 0000000..29ad2e1 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmenpDkxYSitCmpAGoeuYxJVWPqpfmYUDL2QAe9KPr7LRS/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"string","name":"_fabricChannel","type":"string"},{"internalType":"string","name":"_fabricChaincode","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"string","name":"fabricTxId","type":"string"},{"indexed":false,"internalType":"string","name":"fabricChannel","type":"string"}],"name":"FabricBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"fabricChannel","type":"string"},{"indexed":false,"internalType":"string","name":"fabricChaincode","type":"string"}],"name":"FabricBridgeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FABRIC_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"string","name":"fabricTxId","type":"string"}],"name":"confirmFabricOperation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fabricChaincode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fabricChannel","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"fabricTxIds","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"estimateFee(address,uint256,bytes)":{"notice":"Estimate bridge fee"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"}},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/hyperledger/FabricAdapter.sol":"FabricAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/adapters/hyperledger/FabricAdapter.sol":{"keccak256":"0x184e9f161378b856b53de39841c52e1faed997f656539f5353b15e37b41ddc34","license":"MIT","urls":["bzz-raw://0b96c533d0e1221097fcb314bf25d1b648e1f40890b0de7a39f2e561a83af437","dweb:/ipfs/QmXVRTWZb7W2y4f1K2jN8zTTBxANXDATnva39dA45n3xx3"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmeoukZ9wpkVHLnnHXCgb3cq5bWvtfydEhf3RXQvnRC8WJ/archive-info.json b/verification-sources/chain138-metadata-archive/QmeoukZ9wpkVHLnnHXCgb3cq5bWvtfydEhf3RXQvnRC8WJ/archive-info.json new file mode 100644 index 0000000..d6faa38 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeoukZ9wpkVHLnnHXCgb3cq5bWvtfydEhf3RXQvnRC8WJ/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmeoukZ9wpkVHLnnHXCgb3cq5bWvtfydEhf3RXQvnRC8WJ", + "metadata_digest": "f4b6ae53134ba78edff819bd32226c2ae9f3ebbf64f6408a18e4cb16c7592bb7", + "source_path": "contracts/tokenization/TokenizedEUR.sol", + "contract_name": "TokenizedEUR", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmeoukZ9wpkVHLnnHXCgb3cq5bWvtfydEhf3RXQvnRC8WJ/metadata.json b/verification-sources/chain138-metadata-archive/QmeoukZ9wpkVHLnnHXCgb3cq5bWvtfydEhf3RXQvnRC8WJ/metadata.json new file mode 100644 index 0000000..bfb9682 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmeoukZ9wpkVHLnnHXCgb3cq5bWvtfydEhf3RXQvnRC8WJ/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FabricTxAlreadyProcessed","type":"error"},{"inputs":[],"name":"InsufficientFabricBalance","type":"error"},{"inputs":[],"name":"InvalidFabricAttestation","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"fabricTxHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"tokenId","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FabricAttestationReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"string","name":"fabricTokenId","type":"string"},{"indexed":false,"internalType":"bytes32","name":"fabricTxHash","type":"bytes32"}],"name":"TokenizedEURBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"string","name":"fabricTokenId","type":"string"},{"indexed":false,"internalType":"bytes32","name":"fabricTxHash","type":"bytes32"}],"name":"TokenizedEURMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ATTESTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"fabricTokenId","type":"string"},{"internalType":"bytes32","name":"fabricTxHash","type":"bytes32"}],"name":"burnForFabric","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"fabricTokenBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fabricTokenId","type":"string"}],"name":"getFabricTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"fabricTxHash","type":"bytes32"}],"name":"isFabricTxProcessed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"fabricTokenId","type":"string"},{"internalType":"bytes32","name":"fabricTxHash","type":"bytes32"},{"components":[{"internalType":"bytes32","name":"fabricTxHash","type":"bytes32"},{"internalType":"string","name":"tokenId","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct TokenizedEUR.FabricAttestation","name":"attestation","type":"tuple"}],"name":"mintFromFabric","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedFabricTxs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Mintable/burnable by Fabric attestation via authorized minter","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"burn(uint256)":{"details":"Destroys a `value` amount of tokens from the caller. See {ERC20-_burn}."},"burnForFabric(address,uint256,string,bytes32)":{"params":{"amount":"Amount to burn","fabricTokenId":"Fabric token ID","fabricTxHash":"Fabric redemption transaction hash","from":"Address to burn from"}},"burnFrom(address,uint256)":{"details":"Destroys a `value` amount of tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `value`."},"getFabricTokenBalance(string)":{"params":{"fabricTokenId":"Fabric token ID"},"returns":{"_0":"Balance on Besu"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isFabricTxProcessed(bytes32)":{"params":{"fabricTxHash":"Fabric transaction hash"},"returns":{"_0":"True if processed"}},"mintFromFabric(address,uint256,string,bytes32,(bytes32,string,uint256,address,uint256,bytes))":{"params":{"amount":"Amount to mint","attestation":"Attestation from Fabric","fabricTokenId":"Fabric token ID","fabricTxHash":"Fabric transaction hash","to":"Recipient address"}},"name()":{"details":"Returns the name of the token."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"title":"TokenizedEUR","version":1},"userdoc":{"kind":"user","methods":{"burnForFabric(address,uint256,string,bytes32)":{"notice":"Burn tokenized EUR to redeem on Fabric"},"decimals()":{"notice":"Override decimals to return 18"},"getFabricTokenBalance(string)":{"notice":"Get Fabric token balance on Besu"},"isFabricTxProcessed(bytes32)":{"notice":"Check if Fabric tx has been processed"},"mintFromFabric(address,uint256,string,bytes32,(bytes32,string,uint256,address,uint256,bytes))":{"notice":"Mint tokenized EUR based on Fabric attestation"},"pause()":{"notice":"Pause token transfers"},"unpause()":{"notice":"Unpause token transfers"}},"notice":"ERC-20 tokenized EUR backed 1:1 by reserves on Fabric","version":1}},"settings":{"compilationTarget":{"contracts/tokenization/TokenizedEUR.sol":"TokenizedEUR"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","license":"MIT","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol":{"keccak256":"0x2659248df25e34000ed214b3dc8da2160bc39874c992b477d9e2b1b3283dc073","license":"MIT","urls":["bzz-raw://c345af1b0e7ea28d1216d6a04ab28f5534a5229b9edf9ca3cd0e84950ae58d26","dweb:/ipfs/QmY63jtSrYpLRe8Gj1ep2vMDCKxGNNG3hnNVKBVnrs2nmA"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/ShortStrings.sol":{"keccak256":"0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6","license":"MIT","urls":["bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c","dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","license":"MIT","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"]},"@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0","license":"MIT","urls":["bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21","dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt"]},"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","license":"MIT","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/bridge/interop/BridgeEscrowVault.sol":{"keccak256":"0x4411967c78a32fc800fd88c7875c4552e247579659899621e6b0dbe7d1cffd98","license":"MIT","urls":["bzz-raw://e1ccca6d988e95a0255160c5908691a99744f7f988653765d42e9d1b7019e357","dweb:/ipfs/QmUy33pNSkMciFLkoQpbP7kBSDcwLHiNS48xzeEvdktRmF"]},"contracts/tokenization/TokenizedEUR.sol":{"keccak256":"0x6840e5826cc2d7d79a696c24289da3a0cb13d18b20320c24c3dfb2ed14edf760","license":"MIT","urls":["bzz-raw://8e551200dd3cf0e96af47d515deda116381f201d493a3cbe0ec542ce21b76362","dweb:/ipfs/QmR1DfXhhM2Sx4a5Ppd6eTMaXY4RG9QZGRFiBwctWNdsWf"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmetVMxa1vsPMzAZNBxt7ihgDuZGtED8XgCwDMFSz2UKjg/archive-info.json b/verification-sources/chain138-metadata-archive/QmetVMxa1vsPMzAZNBxt7ihgDuZGtED8XgCwDMFSz2UKjg/archive-info.json new file mode 100644 index 0000000..fab6818 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmetVMxa1vsPMzAZNBxt7ihgDuZGtED8XgCwDMFSz2UKjg/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmetVMxa1vsPMzAZNBxt7ihgDuZGtED8XgCwDMFSz2UKjg", + "metadata_digest": "f5e301f230409de54112d5d6e307f627b98cf324b9be4357b694c93aeb66915b", + "source_path": "contracts/bridge/adapters/non-evm/XRPLAdapter.sol", + "contract_name": "XRPLAdapter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmetVMxa1vsPMzAZNBxt7ihgDuZGtED8XgCwDMFSz2UKjg/metadata.json b/verification-sources/chain138-metadata-archive/QmetVMxa1vsPMzAZNBxt7ihgDuZGtED8XgCwDMFSz2UKjg/metadata.json new file mode 100644 index 0000000..d93fe04 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmetVMxa1vsPMzAZNBxt7ihgDuZGtED8XgCwDMFSz2UKjg/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"xrplTxHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"ledgerIndex","type":"uint256"}],"name":"XRPLBridgeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"xrplDestination","type":"string"},{"indexed":false,"internalType":"uint32","name":"destinationTag","type":"uint32"}],"name":"XRPLBridgeInitiated","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"cancelBridge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"bytes32","name":"xrplTxHash","type":"bytes32"},{"internalType":"uint256","name":"ledgerIndex","type":"uint256"}],"name":"confirmXRPLTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"drops","type":"uint64"}],"name":"dropsToWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"estimateFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"getBridgeStatus","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"destinationData","type":"bytes"},{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"enum IChainAdapter.BridgeStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"completedAt","type":"uint256"}],"internalType":"struct IChainAdapter.BridgeRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainIdentifier","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"identifier","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"destination","type":"bytes"}],"name":"validateDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"validatedXRPLAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"weiToDrops","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"xrplTxHashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Uses oracle/relayer pattern for non-EVM chain integration","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"bridge(address,uint256,bytes,bytes)":{"params":{"amount":"Amount to bridge","destination":"Chain-specific destination data","recipient":"Recipient address/identifier","token":"Token address (address(0) for native)"},"returns":{"requestId":"Unique request identifier"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"title":"XRPLAdapter","version":1},"userdoc":{"kind":"user","methods":{"bridge(address,uint256,bytes,bytes)":{"notice":"Initiate bridge operation"},"cancelBridge(bytes32)":{"notice":"Cancel pending bridge (if supported)"},"confirmXRPLTransaction(bytes32,bytes32,uint256)":{"notice":"Oracle confirms XRPL transaction"},"dropsToWei(uint64)":{"notice":"Convert XRP drops to wei (1 XRP = 1,000,000 drops)"},"estimateFee(address,uint256,bytes)":{"notice":"Estimate bridge fee"},"getBridgeStatus(bytes32)":{"notice":"Get bridge request status"},"getChainIdentifier()":{"notice":"Get chain identifier (chainId for EVM, string for non-EVM)"},"getChainType()":{"notice":"Get chain type identifier"},"isActive()":{"notice":"Check if adapter is active"},"validateDestination(bytes)":{"notice":"Validate destination address/identifier for this chain"},"weiToDrops(uint256)":{"notice":"Convert wei to XRP drops"}},"notice":"Bridge adapter for XRP Ledger (XRPL)","version":1}},"settings":{"compilationTarget":{"contracts/bridge/adapters/non-evm/XRPLAdapter.sol":"XRPLAdapter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/adapters/non-evm/XRPLAdapter.sol":{"keccak256":"0x9f4d2ca18193c78fc5c8a15a09358f09383aa64b993578a2eeb25b141d8f05ba","license":"MIT","urls":["bzz-raw://58ff3f3f74a947988d23ecbed6f11474452403a2ecfcbaa8f72fbb3caf3dba33","dweb:/ipfs/QmfYJNhtPZw5gLVXc2rCDfLzNHRBTciBd5waAfMPCBUtW3"]},"contracts/bridge/interfaces/IChainAdapter.sol":{"keccak256":"0x78c08c776acfc73baf7a04914b4bb2883c3dd52878d5ce21561b43bb4b5f30b8","license":"MIT","urls":["bzz-raw://33bab3be920525426e539f67c093fc9d011c553d866cc94c5333326eaf2aff00","dweb:/ipfs/QmY9WLMwRshugJgDLcfxg1uDCYuZN9SUdxPWb4xiE528Xg"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmetW9ZM71WCxbzQs8ChWx3AtfLxgdhuBLJxbjA3sDNUuG/archive-info.json b/verification-sources/chain138-metadata-archive/QmetW9ZM71WCxbzQs8ChWx3AtfLxgdhuBLJxbjA3sDNUuG/archive-info.json new file mode 100644 index 0000000..c058f6a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmetW9ZM71WCxbzQs8ChWx3AtfLxgdhuBLJxbjA3sDNUuG/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmetW9ZM71WCxbzQs8ChWx3AtfLxgdhuBLJxbjA3sDNUuG", + "metadata_digest": "f5e3e585078e9960e0c857db9fec6e16044387775246318f4cec8f7e5820c6eb", + "source_path": "contracts/dbis/DBIS_SignerRegistry.sol", + "contract_name": "DBIS_SignerRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmetW9ZM71WCxbzQs8ChWx3AtfLxgdhuBLJxbjA3sDNUuG/metadata.json b/verification-sources/chain138-metadata-archive/QmetW9ZM71WCxbzQs8ChWx3AtfLxgdhuBLJxbjA3sDNUuG/metadata.json new file mode 100644 index 0000000..133af08 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmetW9ZM71WCxbzQs8ChWx3AtfLxgdhuBLJxbjA3sDNUuG/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"requiredSigs","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"requiredMask","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allowedMask","type":"uint256"}],"name":"QuorumUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":false,"internalType":"uint8","name":"category","type":"uint8"}],"name":"SignerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"}],"name":"SignerRemoved","type":"event"},{"inputs":[],"name":"CATEGORY_AUDITOR","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CATEGORY_COMPLIANCE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CATEGORY_CUSTODY","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CATEGORY_OPS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CATEGORY_RISK","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNER_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint8","name":"category","type":"uint8"}],"name":"addSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256","name":"blockNum","type":"uint256"}],"name":"areSignersActiveAtBlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"categoryMaskAllowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"categoryMaskRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSignerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"getSignerInfo","outputs":[{"internalType":"uint8","name":"category","type":"uint8"},{"internalType":"uint256","name":"effectiveFromBlock","type":"uint256"},{"internalType":"uint256","name":"revokedAtBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"}],"name":"hasDuplicateSigners","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256","name":"blockNum","type":"uint256"}],"name":"isSignerActiveAtBlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"largeSwapAmountThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"removeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiredSignatures","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requiredSignaturesLarge","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requiredSignaturesSmall","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"revokeSignerAtBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"requiredSigs","type":"uint8"},{"internalType":"uint256","name":"requiredMask","type":"uint256"},{"internalType":"uint256","name":"allowedMask","type":"uint256"}],"name":"setQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"largeThreshold","type":"uint256"},{"internalType":"uint8","name":"smallSigs","type":"uint8"},{"internalType":"uint8","name":"largeSigs","type":"uint8"}],"name":"setSwapQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"}],"name":"validateSigners","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"validateSignersForSwap","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/DBIS_SignerRegistry.sol":"DBIS_SignerRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dbis/DBIS_SignerRegistry.sol":{"keccak256":"0xc75d67d4d75d78ab582560b19b6a93f7ea2dc0e958678aed6bc41e25d763fa6e","license":"MIT","urls":["bzz-raw://4edfce11bd6cfe501e7d7662b39f910076aa064277af47ded14927fe3634c5ae","dweb:/ipfs/QmbjMn6pDzYx5CHvLxXePQNEVtxLeDXxG9GZ5GKDtgoojr"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmewSXFLEeys43SW1k7bfdLLHGec5nzDS1N3m5Q8azTKF6/archive-info.json b/verification-sources/chain138-metadata-archive/QmewSXFLEeys43SW1k7bfdLLHGec5nzDS1N3m5Q8azTKF6/archive-info.json new file mode 100644 index 0000000..039f4e4 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmewSXFLEeys43SW1k7bfdLLHGec5nzDS1N3m5Q8azTKF6/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmewSXFLEeys43SW1k7bfdLLHGec5nzDS1N3m5Q8azTKF6", + "metadata_digest": "f6a489fc51a14e02d2364be1abeac9a0a2b19dc3936b79dfc5a1ca79b82d5339", + "source_path": "contracts/dbis/IDBIS_EIP712Helper.sol", + "contract_name": "IDBIS_EIP712Helper", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmewSXFLEeys43SW1k7bfdLLHGec5nzDS1N3m5Q8azTKF6/metadata.json b/verification-sources/chain138-metadata-archive/QmewSXFLEeys43SW1k7bfdLLHGec5nzDS1N3m5Q8azTKF6/metadata.json new file mode 100644 index 0000000..201347e --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmewSXFLEeys43SW1k7bfdLLHGec5nzDS1N3m5Q8azTKF6/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"internalType":"bytes32","name":"structHash","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"typeHash","type":"bytes32"},{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"bytes32","name":"isoType","type":"bytes32"},{"internalType":"bytes32","name":"isoHash","type":"bytes32"},{"internalType":"bytes32","name":"accountingRef","type":"bytes32"},{"internalType":"uint8","name":"fundsStatus","type":"uint8"},{"internalType":"bytes32","name":"corridor","type":"bytes32"},{"internalType":"uint8","name":"assetClass","type":"uint8"},{"internalType":"bytes32","name":"recipientsHash","type":"bytes32"},{"internalType":"bytes32","name":"amountsHash","type":"bytes32"},{"internalType":"uint64","name":"notBefore","type":"uint64"},{"internalType":"uint64","name":"expiresAt","type":"uint64"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"}],"name":"getMintAuthStructHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"internalType":"bytes32","name":"typeHash","type":"bytes32"},{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"bytes32","name":"lpaId","type":"bytes32"},{"internalType":"bytes32","name":"venue","type":"bytes32"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"quoteHash","type":"bytes32"},{"internalType":"address","name":"quoteIssuer","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"}],"name":"getSwapAuthDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"arr","type":"address[]"}],"name":"hashAddressArray","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"arr","type":"uint256[]"}],"name":"hashUint256Array","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"recoverSigners","outputs":[{"internalType":"address[]","name":"signers","type":"address[]"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/dbis/IDBIS_EIP712Helper.sol":"IDBIS_EIP712Helper"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/dbis/IDBIS_EIP712Helper.sol":{"keccak256":"0xbf68a20c4148ff149ea88a24855664287126597c95ddf6523f6747045a85ecae","license":"MIT","urls":["bzz-raw://38c3425f4a22875b835659f5928d39a308aec5017b0e44576aa882cdeaa9a2fa","dweb:/ipfs/QmSfFwR5GZ3kad4SYMda2akmvVGHPzNxei2fLcNDUjpbWd"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmez59HUyvNEuoa6X2Lu1CdfSXyYoq4xDcTJebn7staVaL/archive-info.json b/verification-sources/chain138-metadata-archive/Qmez59HUyvNEuoa6X2Lu1CdfSXyYoq4xDcTJebn7staVaL/archive-info.json new file mode 100644 index 0000000..b412372 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmez59HUyvNEuoa6X2Lu1CdfSXyYoq4xDcTJebn7staVaL/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmez59HUyvNEuoa6X2Lu1CdfSXyYoq4xDcTJebn7staVaL", + "metadata_digest": "f7511bc635e87464761771ea13bd8a0bdcb8c099742623304111a32931667015", + "source_path": "contracts/reserve/OraclePriceFeed.sol", + "contract_name": "OraclePriceFeed", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmez59HUyvNEuoa6X2Lu1CdfSXyYoq4xDcTJebn7staVaL/metadata.json b/verification-sources/chain138-metadata-archive/Qmez59HUyvNEuoa6X2Lu1CdfSXyYoq4xDcTJebn7staVaL/metadata.json new file mode 100644 index 0000000..4db2899 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmez59HUyvNEuoa6X2Lu1CdfSXyYoq4xDcTJebn7staVaL/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"reserveSystem_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"aggregator","type":"address"},{"indexed":false,"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"AggregatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PriceFeedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_FEED_UPDATER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"aggregators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getAndUpdatePrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"needsUpdate","outputs":[{"internalType":"bool","name":"updateNeeded","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"priceMultipliers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveSystem","outputs":[{"internalType":"contract IReserveSystem","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"aggregator","type":"address"},{"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"setAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setUpdateInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"}],"name":"updateMultiplePriceFeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"updatePriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Provides price feeds from multiple sources with aggregation and validation","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getAndUpdatePrice(address)":{"params":{"asset":"Address of the asset"},"returns":{"price":"Current price","timestamp":"Price timestamp"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"needsUpdate(address)":{"params":{"asset":"Address of the asset"},"returns":{"updateNeeded":"True if update is needed"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setAggregator(address,address,uint256)":{"params":{"aggregator":"Address of the Chainlink aggregator","asset":"Address of the asset","multiplier":"Price multiplier for decimals conversion (e.g., 1e10 for 8-decimal aggregator to 18 decimals)"}},"setUpdateInterval(uint256)":{"params":{"interval":"New update interval in seconds"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"updateMultiplePriceFeeds(address[])":{"params":{"assets":"Array of asset addresses"}},"updatePriceFeed(address)":{"params":{"asset":"Address of the asset"}}},"title":"OraclePriceFeed","version":1},"userdoc":{"kind":"user","methods":{"getAndUpdatePrice(address)":{"notice":"Get current price from aggregator and update reserve system"},"needsUpdate(address)":{"notice":"Check if price feed needs update"},"setAggregator(address,address,uint256)":{"notice":"Set aggregator for an asset"},"setUpdateInterval(uint256)":{"notice":"Set update interval"},"updateMultiplePriceFeeds(address[])":{"notice":"Update multiple price feeds"},"updatePriceFeed(address)":{"notice":"Update price feed from aggregator"}},"notice":"Integrates Reserve System with Chainlink-compatible oracle aggregators","version":1}},"settings":{"compilationTarget":{"contracts/reserve/OraclePriceFeed.sol":"OraclePriceFeed"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/oracle/IAggregator.sol":{"keccak256":"0xcdbf107184805058e5725282eb6ade5778fe5ac5ac4cacc3d12438d2292e2951","license":"MIT","urls":["bzz-raw://552f85c4185c0c6273b28a9b5f5473154c0d490885e597dae305882d64377809","dweb:/ipfs/QmXMp3tKq42tUr1RoxhC81vfwQ7aYPFsGkpq5SHTpUmsnu"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]},"contracts/reserve/OraclePriceFeed.sol":{"keccak256":"0xaf62465e45e1a8466c7a66bb6e65ef497f3fc0a1d498887fa700d1e959e59a2e","license":"MIT","urls":["bzz-raw://209c8e0b8dfcc3f65c1178c043a32f973b58583dd26fde8ef20bdd7fc4480717","dweb:/ipfs/QmctVjoAtoyHK9jUfeF3RBGt2dvzKKpcTpG5SR4HEyjG3o"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmf3zkTh5GvZnSpEEVZZXt6SJfRcmABEzUJyLuJtKHKkwf/archive-info.json b/verification-sources/chain138-metadata-archive/Qmf3zkTh5GvZnSpEEVZZXt6SJfRcmABEzUJyLuJtKHKkwf/archive-info.json new file mode 100644 index 0000000..8a2d1c5 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmf3zkTh5GvZnSpEEVZZXt6SJfRcmABEzUJyLuJtKHKkwf/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "Qmf3zkTh5GvZnSpEEVZZXt6SJfRcmABEzUJyLuJtKHKkwf", + "metadata_digest": "f85276c6565219a5dac9fe5c5b39e7bf6ee6ae0d691ecddf3ba7e9f0b05f39be", + "source_path": "contracts/vendor/uniswap-v2-core/libraries/UQ112x112.sol", + "contract_name": "UQ112x112", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmf3zkTh5GvZnSpEEVZZXt6SJfRcmABEzUJyLuJtKHKkwf/metadata.json b/verification-sources/chain138-metadata-archive/Qmf3zkTh5GvZnSpEEVZZXt6SJfRcmABEzUJyLuJtKHKkwf/metadata.json new file mode 100644 index 0000000..ecc207b --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmf3zkTh5GvZnSpEEVZZXt6SJfRcmABEzUJyLuJtKHKkwf/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/libraries/UQ112x112.sol":"UQ112x112"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/libraries/UQ112x112.sol":{"keccak256":"0x2240694530251ab376ae468d0a2d3ee8b3109e56f2acadbc203cdf341506dd31","urls":["bzz-raw://56f55c411faa2924df0915ff77129b9d8c64d3e4d28554e7234f3774ac95958a","dweb:/ipfs/QmYrzUurXL8ijzS8EnLtQTVD7fKPReosg2DsEPXXCY7ec3"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmf6XGZj3svXjwz7nRHuBixuYsY5SKG1BRVnkb2vCQuYaK/archive-info.json b/verification-sources/chain138-metadata-archive/Qmf6XGZj3svXjwz7nRHuBixuYsY5SKG1BRVnkb2vCQuYaK/archive-info.json new file mode 100644 index 0000000..1444bc2 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmf6XGZj3svXjwz7nRHuBixuYsY5SKG1BRVnkb2vCQuYaK/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmf6XGZj3svXjwz7nRHuBixuYsY5SKG1BRVnkb2vCQuYaK", + "metadata_digest": "f8f822315169e6091f4440fd188fd7ee6e370e9ae7124b97fec970f471db3318", + "source_path": "contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Callee.sol", + "contract_name": "IUniswapV2Callee", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmf6XGZj3svXjwz7nRHuBixuYsY5SKG1BRVnkb2vCQuYaK/metadata.json b/verification-sources/chain138-metadata-archive/Qmf6XGZj3svXjwz7nRHuBixuYsY5SKG1BRVnkb2vCQuYaK/metadata.json new file mode 100644 index 0000000..1ed94f9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmf6XGZj3svXjwz7nRHuBixuYsY5SKG1BRVnkb2vCQuYaK/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"uniswapV2Call","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Callee.sol":"IUniswapV2Callee"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Callee.sol":{"keccak256":"0x6bf2e1cd601f8df7a25606a03fb01532f33aa5d77278ef6e7fb72a3b95a2d8d8","license":"GPL-3.0","urls":["bzz-raw://aaaf7c44351d883b3830e484cc20fe1f91b832aaeb8c4631b1848b6bb08c7661","dweb:/ipfs/QmbxistLwfsuywWLHgBpDcQu4f5j6wV13Vs3JrSd1gjX9N"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmf6grkyNvg32cvPxCmv3Bmn2CGs71t26Pk75EEd6KXEMV/archive-info.json b/verification-sources/chain138-metadata-archive/Qmf6grkyNvg32cvPxCmv3Bmn2CGs71t26Pk75EEd6KXEMV/archive-info.json new file mode 100644 index 0000000..192d97a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmf6grkyNvg32cvPxCmv3Bmn2CGs71t26Pk75EEd6KXEMV/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "Qmf6grkyNvg32cvPxCmv3Bmn2CGs71t26Pk75EEd6KXEMV", + "metadata_digest": "f902f9fc2bb0a9caa2b41f5557a1bddfffb09332e717e2ff3137a71fb55725e8", + "source_path": "contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol", + "contract_name": "IUniswapV2Factory", + "compiler": "0.5.16", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/cf30bb43bc734994e1c038845c316299.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmf6grkyNvg32cvPxCmv3Bmn2CGs71t26Pk75EEd6KXEMV/metadata.json b/verification-sources/chain138-metadata-archive/Qmf6grkyNvg32cvPxCmv3Bmn2CGs71t26Pk75EEd6KXEMV/metadata.json new file mode 100644 index 0000000..90b290c --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmf6grkyNvg32cvPxCmv3Bmn2CGs71t26Pk75EEd6KXEMV/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.5.16+commit.9c3226ce"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PairCreated","type":"event"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"pair","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setFeeTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setFeeToSetter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol":"IUniswapV2Factory"},"evmVersion":"istanbul","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/uniswap-v2-core/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xe5905c0989cf5a865ed9bb7b9252536ca011c5b744017a82a7d4443b9c00a891","urls":["bzz-raw://5d2a90a0a796491507462a3da18c3f8819721d571572d765a2207c35bf0a0389","dweb:/ipfs/Qmf9ACYiT3qzjgsYuhm866FBdiBpRMXAPpQhSFbgqcyhHt"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmf7FzyUK3z4avJtVtWpQHczF6o3ggLFrsVmozpXpSMyyR/archive-info.json b/verification-sources/chain138-metadata-archive/Qmf7FzyUK3z4avJtVtWpQHczF6o3ggLFrsVmozpXpSMyyR/archive-info.json new file mode 100644 index 0000000..45c5456 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmf7FzyUK3z4avJtVtWpQHczF6o3ggLFrsVmozpXpSMyyR/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmf7FzyUK3z4avJtVtWpQHczF6o3ggLFrsVmozpXpSMyyR", + "metadata_digest": "f928732b8c4fbdc0dcee40dd6a7e7a9194c050c9423fb0e4e936001f076714b8", + "source_path": "contracts/bridge/trustless/interfaces/IAggregationRouter.sol", + "contract_name": "IAggregationRouter", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmf7FzyUK3z4avJtVtWpQHczF6o3ggLFrsVmozpXpSMyyR/metadata.json b/verification-sources/chain138-metadata-archive/Qmf7FzyUK3z4avJtVtWpQHczF6o3ggLFrsVmozpXpSMyyR/metadata.json new file mode 100644 index 0000000..aa97be8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmf7FzyUK3z4avJtVtWpQHczF6o3ggLFrsVmozpXpSMyyR/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"executor","type":"address"},{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct IAggregationRouter.SwapDescription","name":"desc","type":"tuple"},{"internalType":"bytes","name":"permit","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"spentAmount","type":"uint256"}],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"Based on 1inch V5 Router","kind":"dev","methods":{},"title":"IAggregationRouter - 1inch AggregationRouter Interface","version":1},"userdoc":{"kind":"user","methods":{},"notice":"Minimal interface for 1inch AggregationRouter","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":"IAggregationRouter"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/Qmf8YyfX55fbVBHcPFzAjPfejAioCQpM1SKTC9qJKJsDpz/archive-info.json b/verification-sources/chain138-metadata-archive/Qmf8YyfX55fbVBHcPFzAjPfejAioCQpM1SKTC9qJKJsDpz/archive-info.json new file mode 100644 index 0000000..c75fe7a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmf8YyfX55fbVBHcPFzAjPfejAioCQpM1SKTC9qJKJsDpz/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "Qmf8YyfX55fbVBHcPFzAjPfejAioCQpM1SKTC9qJKJsDpz", + "metadata_digest": "f97d3a24d5c66ad32c42ad29b98cdc5030c6567939e428429c43a065eca517ef", + "source_path": "contracts/dex/DODOPMMIntegration.sol", + "contract_name": "IDODOPMMPool", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/Qmf8YyfX55fbVBHcPFzAjPfejAioCQpM1SKTC9qJKJsDpz/metadata.json b/verification-sources/chain138-metadata-archive/Qmf8YyfX55fbVBHcPFzAjPfejAioCQpM1SKTC9qJKJsDpz/metadata.json new file mode 100644 index 0000000..424d7b6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/Qmf8YyfX55fbVBHcPFzAjPfejAioCQpM1SKTC9qJKJsDpz/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"_BASE_RESERVE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_RESERVE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"buyShares","outputs":[{"internalType":"uint256","name":"baseShare","type":"uint256"},{"internalType":"uint256","name":"quoteShare","type":"uint256"},{"internalType":"uint256","name":"lpShare","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMidPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultReserve","outputs":[{"internalType":"uint256","name":"baseReserve","type":"uint256"},{"internalType":"uint256","name":"quoteReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"payBaseAmount","type":"uint256"}],"name":"querySellBase","outputs":[{"internalType":"uint256","name":"receiveQuoteAmount","type":"uint256"},{"internalType":"uint256","name":"mtFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"payQuoteAmount","type":"uint256"}],"name":"querySellQuote","outputs":[{"internalType":"uint256","name":"receiveBaseAmount","type":"uint256"},{"internalType":"uint256","name":"mtFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellBase","outputs":[{"internalType":"uint256","name":"receiveQuoteAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellQuote","outputs":[{"internalType":"uint256","name":"receiveBaseAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Actual DODO interfaces may vary - this is a simplified version","kind":"dev","methods":{},"title":"DODO PMM Pool Interface","version":1},"userdoc":{"kind":"user","methods":{"sellBase(address)":{"notice":"Official DODO DVM: excess base in pool vs reserve is sold; `to` receives quote."},"sellQuote(address)":{"notice":"Official DODO DVM: excess quote in pool vs reserve is sold; `to` receives base."}},"notice":"Simplified interface for DODO Proactive Market Maker pools","version":1}},"settings":{"compilationTarget":{"contracts/dex/DODOPMMIntegration.sol":"IDODOPMMPool"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dex/DODOPMMIntegration.sol":{"keccak256":"0x1405e3af6768c64eca2f10258049ad1c6ba71facaef4efe24a97ca6d5f068132","license":"MIT","urls":["bzz-raw://cda6ca9dd862d1bbf228d774aa6eb02c4608797da335ac32be00b3f8ad5c1721","dweb:/ipfs/Qmcko5CRpsfR4hx7QmndPUDjcD3bEtQdjzPcJe1u7jDEUB"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfA2kT5WTJAzPgtTD2fUxnV498yrywyMA1nQN3C3vjd4o/archive-info.json b/verification-sources/chain138-metadata-archive/QmfA2kT5WTJAzPgtTD2fUxnV498yrywyMA1nQN3C3vjd4o/archive-info.json new file mode 100644 index 0000000..edbba17 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfA2kT5WTJAzPgtTD2fUxnV498yrywyMA1nQN3C3vjd4o/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfA2kT5WTJAzPgtTD2fUxnV498yrywyMA1nQN3C3vjd4o", + "metadata_digest": "f9de35c3d56e94ae9a2b615644fd1a0cfe16eb8f5f93df88998f5d50b0072ccc", + "source_path": "contracts/governance/Voting.sol", + "contract_name": "Voting", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfA2kT5WTJAzPgtTD2fUxnV498yrywyMA1nQN3C3vjd4o/metadata.json b/verification-sources/chain138-metadata-archive/QmfA2kT5WTJAzPgtTD2fUxnV498yrywyMA1nQN3C3vjd4o/metadata.json new file mode 100644 index 0000000..dbe7e08 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfA2kT5WTJAzPgtTD2fUxnV498yrywyMA1nQN3C3vjd4o/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"}],"name":"VoteCast","type":"event"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"addVoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"description","type":"string"}],"name":"createProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"executeProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposal","outputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"yesVotes","type":"uint256"},{"internalType":"uint256","name":"noVotes","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"yesVotes","type":"uint256"},{"internalType":"uint256","name":"noVotes","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"removeVoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"setQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPeriod","type":"uint256"}],"name":"setVotingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"voters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Simple voting implementation with yes/no votes","errors":{"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"Voting Contract","version":1},"userdoc":{"kind":"user","methods":{"addVoter(address)":{"notice":"Add a voter"},"createProposal(string)":{"notice":"Create a new proposal"},"executeProposal(uint256)":{"notice":"Execute a proposal if it passes"},"getProposal(uint256)":{"notice":"Get proposal details"},"removeVoter(address)":{"notice":"Remove a voter"},"setQuorum(uint256)":{"notice":"Update quorum"},"setVotingPeriod(uint256)":{"notice":"Update voting period"},"vote(uint256,bool)":{"notice":"Vote on a proposal"}},"notice":"On-chain voting mechanism for governance proposals","version":1}},"settings":{"compilationTarget":{"contracts/governance/Voting.sol":"Voting"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/governance/Voting.sol":{"keccak256":"0x08246d117baa10c4010fe5636fae27ebc567d8c7570de27e8f7b2852720bd95e","license":"MIT","urls":["bzz-raw://54200c6737d753484cdc3a5352b7bc1b6f366f0cbc105fbf7094483e4b83073d","dweb:/ipfs/QmXTvjWLPY5Zfo1eByJHSJ4VTs2vbd35iJQoogvkn8z22M"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfB4g8FxWj3BDddKD96wda3D8ur9xMdxvzUVQjKWUwuHb/archive-info.json b/verification-sources/chain138-metadata-archive/QmfB4g8FxWj3BDddKD96wda3D8ur9xMdxvzUVQjKWUwuHb/archive-info.json new file mode 100644 index 0000000..3900611 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfB4g8FxWj3BDddKD96wda3D8ur9xMdxvzUVQjKWUwuHb/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfB4g8FxWj3BDddKD96wda3D8ur9xMdxvzUVQjKWUwuHb", + "metadata_digest": "fa21f7ca4a6343beab9e3bc438e74eb1dbc4648b514a87382fd412f4f89f23d2", + "source_path": "contracts/bridge/atomic/AtomicFeePolicy.sol", + "contract_name": "AtomicFeePolicy", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfB4g8FxWj3BDddKD96wda3D8ur9xMdxvzUVQjKWUwuHb/metadata.json b/verification-sources/chain138-metadata-archive/QmfB4g8FxWj3BDddKD96wda3D8ur9xMdxvzUVQjKWUwuHb/metadata.json new file mode 100644 index 0000000..c2c72b6 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfB4g8FxWj3BDddKD96wda3D8ur9xMdxvzUVQjKWUwuHb/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"indexed":false,"internalType":"uint16","name":"fulfillerFeeBps","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"protocolFeeBps","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"bondBps","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"slashPenaltyBps","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"maxFulfilmentDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSettlementDelay","type":"uint256"}],"name":"CorridorPolicySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POLICY_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"corridorPolicies","outputs":[{"internalType":"uint16","name":"fulfillerFeeBps","type":"uint16"},{"internalType":"uint16","name":"protocolFeeBps","type":"uint16"},{"internalType":"uint16","name":"bondBps","type":"uint16"},{"internalType":"uint16","name":"slashPenaltyBps","type":"uint16"},{"internalType":"uint256","name":"maxFulfilmentDelay","type":"uint256"},{"internalType":"uint256","name":"maxSettlementDelay","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"quoteFees","outputs":[{"internalType":"uint256","name":"fulfillerFee","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"uint256","name":"reservedLiquidity","type":"uint256"}],"name":"requiredBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"uint16","name":"fulfillerFeeBps","type":"uint16"},{"internalType":"uint16","name":"protocolFeeBps","type":"uint16"},{"internalType":"uint16","name":"bondBps","type":"uint16"},{"internalType":"uint16","name":"slashPenaltyBps","type":"uint16"},{"internalType":"uint256","name":"maxFulfilmentDelay","type":"uint256"},{"internalType":"uint256","name":"maxSettlementDelay","type":"uint256"}],"name":"setCorridorPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/AtomicFeePolicy.sol":"AtomicFeePolicy"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/atomic/AtomicFeePolicy.sol":{"keccak256":"0xfe8256cd10ae6129f7cd0919a85f81055a129a974052ea5e9015534bc3c23069","license":"MIT","urls":["bzz-raw://f3f08ef8182b2ac2b9ebf6c5f1289214da84a918c79911f65c3bb43448c7a958","dweb:/ipfs/QmesykVxZqsK3E952iVLhhA6zHvfLchcJtftZ7dcstJYA5"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfDbDT6cUQEgrZXBdmvkZHmLu6AaEY1nE9jELwaJ34fWw/archive-info.json b/verification-sources/chain138-metadata-archive/QmfDbDT6cUQEgrZXBdmvkZHmLu6AaEY1nE9jELwaJ34fWw/archive-info.json new file mode 100644 index 0000000..4b8be29 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfDbDT6cUQEgrZXBdmvkZHmLu6AaEY1nE9jELwaJ34fWw/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfDbDT6cUQEgrZXBdmvkZHmLu6AaEY1nE9jELwaJ34fWw", + "metadata_digest": "fac7a94cf3801938d46d83f7b7196ded2ac9ad210ca8d71911de529e45cd7498", + "source_path": "contracts/tokens/WETH10.sol", + "contract_name": "WETH10", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfDbDT6cUQEgrZXBdmvkZHmLu6AaEY1nE9jELwaJ34fWw/metadata.json b/verification-sources/chain138-metadata-archive/QmfDbDT6cUQEgrZXBdmvkZHmLu6AaEY1nE9jELwaJ34fWw/metadata.json new file mode 100644 index 0000000..6b31d45 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfDbDT6cUQEgrZXBdmvkZHmLu6AaEY1nE9jELwaJ34fWw/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"guy","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"FLASH_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FLASH_LOAN_CALLBACK_SUCCESS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"guy","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC3156FlashBorrower","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"maxFlashLoan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/tokens/WETH10.sol":"WETH10"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/tokens/WETH10.sol":{"keccak256":"0xdb94dafe131a1ecde041c9830f89e5c82f48a338b8b0f44b64e2c2fa8267d3fe","license":"MIT","urls":["bzz-raw://acf422bdefa787500f16dfce819d41194ee9bbaec119d664274c110101e7f15a","dweb:/ipfs/QmUZswCiwKNzk7P5iZdvw9m7Cw22znaDFwCH2Yrf987CLv"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfDqf5UsCoLp5X87GsirbXAxnarJiCbaAH9M3NCKyJtZh/archive-info.json b/verification-sources/chain138-metadata-archive/QmfDqf5UsCoLp5X87GsirbXAxnarJiCbaAH9M3NCKyJtZh/archive-info.json new file mode 100644 index 0000000..6424533 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfDqf5UsCoLp5X87GsirbXAxnarJiCbaAH9M3NCKyJtZh/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfDqf5UsCoLp5X87GsirbXAxnarJiCbaAH9M3NCKyJtZh", + "metadata_digest": "fad7fda3ea0cfb263510de325693beeb2e8447c6c6b092b72b62ae6729e91e3c", + "source_path": "contracts/registry/ChainRegistry.sol", + "contract_name": "ChainRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfDqf5UsCoLp5X87GsirbXAxnarJiCbaAH9M3NCKyJtZh/metadata.json b/verification-sources/chain138-metadata-archive/QmfDqf5UsCoLp5X87GsirbXAxnarJiCbaAH9M3NCKyJtZh/metadata.json new file mode 100644 index 0000000..b25899a --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfDqf5UsCoLp5X87GsirbXAxnarJiCbaAH9M3NCKyJtZh/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"string","name":"chainIdentifier","type":"string"},{"indexed":false,"internalType":"address","name":"oldAdapter","type":"address"},{"indexed":false,"internalType":"address","name":"newAdapter","type":"address"}],"name":"AdapterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"string","name":"chainIdentifier","type":"string"}],"name":"ChainDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"string","name":"chainIdentifier","type":"string"},{"indexed":false,"internalType":"enum ChainRegistry.ChainType","name":"chainType","type":"uint8"},{"indexed":false,"internalType":"address","name":"adapter","type":"address"}],"name":"ChainRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"string","name":"chainIdentifier","type":"string"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"ChainUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTRY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adapterToChainType","outputs":[{"internalType":"enum ChainRegistry.ChainType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"evmChains","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainIdentifier","type":"string"},{"internalType":"enum ChainRegistry.ChainType","name":"chainType","type":"uint8"},{"internalType":"address","name":"adapter","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"minConfirmations","type":"uint256"},{"internalType":"uint256","name":"avgBlockTime","type":"uint256"},{"internalType":"bool","name":"requiresOracle","type":"bool"},{"internalType":"string","name":"rpcEndpoint","type":"string"},{"internalType":"string","name":"explorerUrl","type":"string"},{"internalType":"bytes","name":"additionalData","type":"bytes"},{"internalType":"uint256","name":"addedAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainIdentifier","type":"string"}],"name":"getAdapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllEVMChains","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainIdentifier","type":"string"},{"internalType":"enum ChainRegistry.ChainType","name":"chainType","type":"uint8"},{"internalType":"address","name":"adapter","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"minConfirmations","type":"uint256"},{"internalType":"uint256","name":"avgBlockTime","type":"uint256"},{"internalType":"bool","name":"requiresOracle","type":"bool"},{"internalType":"string","name":"rpcEndpoint","type":"string"},{"internalType":"string","name":"explorerUrl","type":"string"},{"internalType":"bytes","name":"additionalData","type":"bytes"},{"internalType":"uint256","name":"addedAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"internalType":"struct ChainRegistry.ChainMetadata[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllNonEVMChains","outputs":[{"internalType":"string[]","name":"","type":"string[]"},{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainIdentifier","type":"string"},{"internalType":"enum ChainRegistry.ChainType","name":"chainType","type":"uint8"},{"internalType":"address","name":"adapter","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"minConfirmations","type":"uint256"},{"internalType":"uint256","name":"avgBlockTime","type":"uint256"},{"internalType":"bool","name":"requiresOracle","type":"bool"},{"internalType":"string","name":"rpcEndpoint","type":"string"},{"internalType":"string","name":"explorerUrl","type":"string"},{"internalType":"bytes","name":"additionalData","type":"bytes"},{"internalType":"uint256","name":"addedAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"internalType":"struct ChainRegistry.ChainMetadata[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"getEVMChain","outputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainIdentifier","type":"string"},{"internalType":"enum ChainRegistry.ChainType","name":"chainType","type":"uint8"},{"internalType":"address","name":"adapter","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"minConfirmations","type":"uint256"},{"internalType":"uint256","name":"avgBlockTime","type":"uint256"},{"internalType":"bool","name":"requiresOracle","type":"bool"},{"internalType":"string","name":"rpcEndpoint","type":"string"},{"internalType":"string","name":"explorerUrl","type":"string"},{"internalType":"bytes","name":"additionalData","type":"bytes"},{"internalType":"uint256","name":"addedAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"internalType":"struct ChainRegistry.ChainMetadata","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"chainIdentifier","type":"string"}],"name":"getNonEVMChain","outputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainIdentifier","type":"string"},{"internalType":"enum ChainRegistry.ChainType","name":"chainType","type":"uint8"},{"internalType":"address","name":"adapter","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"minConfirmations","type":"uint256"},{"internalType":"uint256","name":"avgBlockTime","type":"uint256"},{"internalType":"bool","name":"requiresOracle","type":"bool"},{"internalType":"string","name":"rpcEndpoint","type":"string"},{"internalType":"string","name":"explorerUrl","type":"string"},{"internalType":"bytes","name":"additionalData","type":"bytes"},{"internalType":"uint256","name":"addedAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"internalType":"struct ChainRegistry.ChainMetadata","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalChains","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainIdentifier","type":"string"}],"name":"isChainActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isValidAdapter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nonEvmChains","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainIdentifier","type":"string"},{"internalType":"enum ChainRegistry.ChainType","name":"chainType","type":"uint8"},{"internalType":"address","name":"adapter","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"minConfirmations","type":"uint256"},{"internalType":"uint256","name":"avgBlockTime","type":"uint256"},{"internalType":"bool","name":"requiresOracle","type":"bool"},{"internalType":"string","name":"rpcEndpoint","type":"string"},{"internalType":"string","name":"explorerUrl","type":"string"},{"internalType":"bytes","name":"additionalData","type":"bytes"},{"internalType":"uint256","name":"addedAt","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"adapter","type":"address"},{"internalType":"string","name":"explorerUrl","type":"string"},{"internalType":"uint256","name":"minConfirmations","type":"uint256"},{"internalType":"uint256","name":"avgBlockTime","type":"uint256"},{"internalType":"bytes","name":"additionalData","type":"bytes"}],"name":"registerEVMChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"chainIdentifier","type":"string"},{"internalType":"enum ChainRegistry.ChainType","name":"chainType","type":"uint8"},{"internalType":"address","name":"adapter","type":"address"},{"internalType":"string","name":"explorerUrl","type":"string"},{"internalType":"uint256","name":"minConfirmations","type":"uint256"},{"internalType":"uint256","name":"avgBlockTime","type":"uint256"},{"internalType":"bool","name":"requiresOracle","type":"bool"},{"internalType":"bytes","name":"additionalData","type":"bytes"}],"name":"registerNonEVMChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredEVMChainIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredNonEVMIdentifiers","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainIdentifier","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setChainActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"chainIdentifier","type":"string"},{"internalType":"address","name":"newAdapter","type":"address"}],"name":"updateAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"devdoc":{"details":"Maps chain identifiers to adapter contracts and metadata","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ERC1967InvalidImplementation(address)":[{"details":"The `implementation` of the proxy is invalid."}],"ERC1967NonPayable()":[{"details":"An upgrade function sees `msg.value > 0` that may be lost."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"UUPSUnauthorizedCallContext()":[{"details":"The call is from an unauthorized context."}],"UUPSUnsupportedProxiableUUID(bytes32)":[{"details":"The storage `slot` is unsupported as a UUID."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded."}},"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"title":"ChainRegistry","version":1},"userdoc":{"kind":"user","methods":{"registerEVMChain(uint256,address,string,uint256,uint256,bytes)":{"notice":"Register an EVM chain"},"registerNonEVMChain(string,uint8,address,string,uint256,uint256,bool,bytes)":{"notice":"Register a non-EVM chain"},"setChainActive(uint256,string,bool)":{"notice":"Enable/disable chain"},"updateAdapter(uint256,string,address)":{"notice":"Update chain adapter"}},"notice":"Central registry for all supported blockchains (EVM and non-EVM)","version":1}},"settings":{"compilationTarget":{"contracts/registry/ChainRegistry.sol":"ChainRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"keccak256":"0xe3a2cff969716ebedd6f9fc7f4cbc499449e9bd0377afa49dab9e9c21212a50e","license":"MIT","urls":["bzz-raw://b14eb6728d660a790b2c49df0e96fe31e467ec30fc02ae41944b5d5a628610d8","dweb:/ipfs/QmSP2j6xhEbCRzDyv5HTwvJV14vBtyZFog3LUh7wp94YHc"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x30d125b8417684dbfea3e8d57284b353a86b22077237b4aaf098c0b54b153e16","license":"MIT","urls":["bzz-raw://2813775a6326190e75dfa9005c1abbdb1e541c195c0bf5656dd4199e8c66fd8d","dweb:/ipfs/QmYDKANBezQXNrEDyJ69RVXkgypW1hWj7MAvjfdNHTZY8L"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xad316bdc3ee64a0e29773256245045dc57b92660799ff14f668f7c0da9456a9d","license":"MIT","urls":["bzz-raw://66463434d266816fca2a3a2734ceee88544e61b7cc3899c50333b46e8e771455","dweb:/ipfs/QmPYCzHjki1HQLvBub3uUqoUKGrwdgR3xP9Zpya14YTdXS"]},"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0x16b88aca1f1c3aa38783416d86207ce6fe574fcd1993dfe54403b5c8b6c74224","license":"MIT","urls":["bzz-raw://29f3c5c687fe0d87742b013872f495e67656910530c916a69873860dc8fea812","dweb:/ipfs/QmbspfQXmbhCANqqiunUFm9fiVVQwPet2YKQoJ58km442Y"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","license":"MIT","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","license":"MIT","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","license":"MIT","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"]},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","license":"MIT","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","license":"MIT","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/registry/ChainRegistry.sol":{"keccak256":"0x62a13e8c91f8735ec2bca3897d2a40fb0a6362d8ef581be208f4559d36f76d5f","license":"MIT","urls":["bzz-raw://2623c3a311c6bed5526943cdb3f7085a8ecfd0c3058b539bfbe53ac127539c3a","dweb:/ipfs/QmRdJNx8Tidewyj2MLq1DHKiuUvBYLn5di7tsvhJb7LcDB"]},"contracts/vendor/openzeppelin/UUPSUpgradeable.sol":{"keccak256":"0xbb6b0436016dce56e3ca83cf1ea88deeed9d91ba3aa1ab699fc36ffdfd0916d0","license":"MIT","urls":["bzz-raw://8ea84a6e3d7b60cf3f7a3a60cc16600aafff7516737da52d898e9efde9c4d06f","dweb:/ipfs/QmbvfuSLieg9gQ59GHiEJU2GjuVrgrFHSd9k5dQ7jc7bfa"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfGDzZhod6YyFma5ukX243iZ46e6g5vG4LHvwCd5EMnXH/archive-info.json b/verification-sources/chain138-metadata-archive/QmfGDzZhod6YyFma5ukX243iZ46e6g5vG4LHvwCd5EMnXH/archive-info.json new file mode 100644 index 0000000..aae1c19 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfGDzZhod6YyFma5ukX243iZ46e6g5vG4LHvwCd5EMnXH/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfGDzZhod6YyFma5ukX243iZ46e6g5vG4LHvwCd5EMnXH", + "metadata_digest": "fb7468638d6484d710fae3a91341745f54c015f8eb628d834fe297789f157620", + "source_path": "contracts/bridge/atomic/interfaces/IAtomicFulfillerRegistry.sol", + "contract_name": "IAtomicFulfillerRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfGDzZhod6YyFma5ukX243iZ46e6g5vG4LHvwCd5EMnXH/metadata.json b/verification-sources/chain138-metadata-archive/QmfGDzZhod6YyFma5ukX243iZ46e6g5vG4LHvwCd5EMnXH/metadata.json new file mode 100644 index 0000000..7e472fa --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfGDzZhod6YyFma5ukX243iZ46e6g5vG4LHvwCd5EMnXH/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"fulfiller","type":"address"}],"name":"availableBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"canCover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"bytes32","name":"corridorId","type":"bytes32"}],"name":"isFulfillerAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"bytes32","name":"corridorId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"}],"name":"releaseBond","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"obligationId","type":"bytes32"},{"internalType":"address","name":"recipient","type":"address"}],"name":"slashBond","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawBond","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/atomic/interfaces/IAtomicFulfillerRegistry.sol":"IAtomicFulfillerRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/bridge/atomic/interfaces/IAtomicFulfillerRegistry.sol":{"keccak256":"0xdd5c9766af720fb2b40a8e5232b818004999ab640e0420fd4cfd6198fdc9bf56","license":"MIT","urls":["bzz-raw://20a172cfc8b4a54f94bd889d464a84530467ab11085748437158368d931d828d","dweb:/ipfs/QmUKBHadjvVmiSc3cxBcMCg8496hpqFS1gEi4vhQJvj7R7"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfGaGFn8iucvXCCetmvox9LNAxJ7iSBdTHNswWRnd5cB8/archive-info.json b/verification-sources/chain138-metadata-archive/QmfGaGFn8iucvXCCetmvox9LNAxJ7iSBdTHNswWRnd5cB8/archive-info.json new file mode 100644 index 0000000..5f0226f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfGaGFn8iucvXCCetmvox9LNAxJ7iSBdTHNswWRnd5cB8/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfGaGFn8iucvXCCetmvox9LNAxJ7iSBdTHNswWRnd5cB8", + "metadata_digest": "fb8b53e665a1e0cf94d6e616d44dcb4b86c931ad3ff4ef8033010420d1f23eb7", + "source_path": "contracts/bridge/trustless/DualRouterBridgeSwapCoordinator.sol", + "contract_name": "DualRouterBridgeSwapCoordinator", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfGaGFn8iucvXCCetmvox9LNAxJ7iSBdTHNswWRnd5cB8/metadata.json b/verification-sources/chain138-metadata-archive/QmfGaGFn8iucvXCCetmvox9LNAxJ7iSBdTHNswWRnd5cB8/metadata.json new file mode 100644 index 0000000..4448a06 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfGaGFn8iucvXCCetmvox9LNAxJ7iSBdTHNswWRnd5cB8/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_inbox","type":"address"},{"internalType":"address","name":"_liquidityPool","type":"address"},{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_enhancedSwapRouter","type":"address"},{"internalType":"address","name":"_challengeManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"ClaimChallenged","type":"error"},{"inputs":[],"name":"ClaimNotFinalized","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientOutput","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ZeroDepositId","type":"error"},{"inputs":[],"name":"ZeroRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"enum LiquidityPoolETH.AssetType","name":"inputAsset","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"stablecoinToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"stablecoinAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"usedEnhancedRouter","type":"bool"}],"name":"BridgeSwapExecuted","type":"event"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"enum LiquidityPoolETH.AssetType","name":"outputAsset","type":"uint8"},{"internalType":"address","name":"stablecoinToken","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"bytes","name":"routeData","type":"bytes"},{"internalType":"bool","name":"useEnhancedRouter","type":"bool"}],"name":"bridgeAndSwap","outputs":[{"internalType":"uint256","name":"stablecoinAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"canSwap","outputs":[{"internalType":"bool","name":"canSwap_","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"challengeManager","outputs":[{"internalType":"contract ChallengeManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enhancedSwapRouter","outputs":[{"internalType":"contract EnhancedSwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inbox","outputs":[{"internalType":"contract InboxETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPool","outputs":[{"internalType":"contract LiquidityPoolETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract SwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Verifies claim finalization, releases from liquidity pool, then swaps via chosen router","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AddressInsufficientBalance(address)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"FailedInnerCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC20 token failed."}]},"kind":"dev","methods":{"bridgeAndSwap(uint256,address,uint8,address,uint256,bytes,bool)":{"params":{"amountOutMin":"Minimum stablecoin output (slippage protection)","depositId":"Deposit ID","outputAsset":"Asset type from bridge (ETH or WETH)","recipient":"Recipient address (should match claim recipient)","routeData":"Optional route data for basic SwapRouter (ignored when useEnhancedRouter is true)","stablecoinToken":"Target stablecoin address (USDT, USDC, or DAI)","useEnhancedRouter":"If true, use EnhancedSwapRouter; otherwise use basic SwapRouter"},"returns":{"stablecoinAmount":"Amount of stablecoin received"}}},"title":"DualRouterBridgeSwapCoordinator","version":1},"userdoc":{"kind":"user","methods":{"bridgeAndSwap(uint256,address,uint8,address,uint256,bytes,bool)":{"notice":"Execute bridge release + swap to stablecoin"},"canSwap(uint256)":{"notice":"Check if claim can be swapped"}},"notice":"Coordinates bridge release + swap using either basic SwapRouter or EnhancedSwapRouter","version":1}},"settings":{"compilationTarget":{"contracts/bridge/trustless/DualRouterBridgeSwapCoordinator.sol":"DualRouterBridgeSwapCoordinator"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236","license":"MIT","urls":["bzz-raw://7448ab095d6940130bcf76ba47a2eab14148c83119523b93dd89f6d84edd6c02","dweb:/ipfs/QmawrZ4voKQjH3oomXT3Kuheb3Mnmo2VvVpxg8Ne5UJUrd"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/trustless/BondManager.sol":{"keccak256":"0xd9c903ba88cae86f3477b282c24308a3e8da48885518337e551f747576edab8f","license":"MIT","urls":["bzz-raw://77b72abe65c34dbe450d7bef2be8bf49ce2e188fb18955143cae39d1318ed510","dweb:/ipfs/QmTZXXgixwpjzcsGuqRS6X9JWwaFawg2g6ptHWLNoGzeN2"]},"contracts/bridge/trustless/ChallengeManager.sol":{"keccak256":"0x1b78e36725fc1d8e0fc8f93ad6b6fb7c41205df7db81bc790338c9dbfbf9da5f","license":"MIT","urls":["bzz-raw://c6f8aa8fbf2996df80a4d8f97107c4dabebf1bd16da5c1a2c2267f67b421517f","dweb:/ipfs/QmSwYZ2mFi6fbtbZAqPerQVjuqov3QL7ramtrafS8cqijq"]},"contracts/bridge/trustless/DualRouterBridgeSwapCoordinator.sol":{"keccak256":"0x9bbf46f8382a5ab73d1a444653598c2ee0d812b8713b20ffdef6cf7793851f45","license":"MIT","urls":["bzz-raw://fa8707bbfef9036e42ca912af2a07e2682df7b3fc3230b5c07a53261b04de620","dweb:/ipfs/QmWBxMspBVPrJYiBA2qj1eTa2q2dSQJ4nsbsbtucUgqKBR"]},"contracts/bridge/trustless/EnhancedSwapRouter.sol":{"keccak256":"0x7b0ff8b8f9efdf21c655af224adb375da88851180557cec99b7063c30a1d4f87","license":"MIT","urls":["bzz-raw://61fb6da1ad5a3ddf6a30fec013036d69b4fd32b5fa5dce4842a6afd897c9a22f","dweb:/ipfs/QmSoso3FZA4temTo3wXyhpRYyx88SM5f4NRaiaEi76fjKY"]},"contracts/bridge/trustless/InboxETH.sol":{"keccak256":"0x17dc0c5a4dcbd345fe0828cf41149098d5966e25235964a247da1623ce63d8ff","license":"MIT","urls":["bzz-raw://059d14196f2f160f38db2713d562975086b6be688e50553d6e90b03c3de95e4a","dweb:/ipfs/QmXm7uTYvKMmsPoahi7G17tz1ZkWnG2WzSC6NUe3Lh7MCW"]},"contracts/bridge/trustless/LiquidityPoolETH.sol":{"keccak256":"0x803ee5e2d23594afba35192d9bf666ee06964ed88e32d4e46300d322e2da01f4","license":"MIT","urls":["bzz-raw://2a9a078c9cd1246a3fd4f43ad68050a7572f45eed8c504a018f900c4523637d9","dweb:/ipfs/QmY2uHVGDMfiDAgNTbbZoYfhTX7PFPVUZBkxmtC6HzFuSi"]},"contracts/bridge/trustless/SwapRouter.sol":{"keccak256":"0x46c48469998ef933a26e9a8276fe5183987664c0f0972de7fccc0489dd1d7a03","license":"MIT","urls":["bzz-raw://81fcbbe09707082aaa4a8125b69200979cbbaf56d190ffa0795fb5d5f561f84c","dweb:/ipfs/QmbJxRppS5zvoYSfdRDxhujEnEGYDdzmedZq8CarP5x5db"]},"contracts/bridge/trustless/interfaces/IAggregationRouter.sol":{"keccak256":"0xda8f6da75b67b42f986e276e320cdcb9a67ec785743a721542b378d23e3f2b3a","license":"MIT","urls":["bzz-raw://a1040b23e41227316525f707bd5c2ea8ced7c5c5d577e8ce42a3357386b03e3d","dweb:/ipfs/QmUf7pg85FcmhSy4rN64AHjgRvfWmtTu62w3U5tfEwYKuq"]},"contracts/bridge/trustless/interfaces/IBalancerVault.sol":{"keccak256":"0xbf9faf574796378aa8e4e4917f6aa6b3051aa6e5efb03a4eaf211f636f405b7e","license":"MIT","urls":["bzz-raw://aa0f50709b1d6e6bd3ef0c810c4505a00d9e826e5b65c32223f2e9e23b76db89","dweb:/ipfs/QmTrKFJQuWRHJ7ouvNris63Cbrk8nGnvf45Tmr6zzmMK9T"]},"contracts/bridge/trustless/interfaces/ICurvePool.sol":{"keccak256":"0x5ae3aa4d090820bdf093b760b9b71b195da7c2cb43be8e89ebc933bc487aec7c","license":"MIT","urls":["bzz-raw://3fb1467093eb91a52b10a09bdeead7063abb299d514483d7128c8d63a2b66ad1","dweb:/ipfs/QmdA8GdVxdsjyrHboJZzNsEBAxZGdstup7DiMFoLRkm6pC"]},"contracts/bridge/trustless/interfaces/IDodoexRouter.sol":{"keccak256":"0x308f04c802c19b06ee0e627b07fc2ebeee50ac4ad5d716e2c0c83a61acab0b7b","license":"MIT","urls":["bzz-raw://4075ad950eee500921c9d32dbd3f34dc87a83ab52c9186e6d29d52a77b0757c7","dweb:/ipfs/QmcBtfPDmBbuPMEm9CoDUWY16kv6UErDi6Ay4oGGhkqC72"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/bridge/trustless/interfaces/IWETH.sol":{"keccak256":"0x2797f22d48c59542f0c7eb5d4405c7c5c2156c764faf9798de2493e5f6487977","license":"MIT","urls":["bzz-raw://e876c569dce230e2eaf208885fa3df05879363b80df005bbe1841f404c789202","dweb:/ipfs/QmTMEUjEVx2ZvKKe7L6uuEWZYbFaTUYAkabF91189J5wMf"]},"contracts/bridge/trustless/libraries/FraudProofTypes.sol":{"keccak256":"0x15e2c59fc46db2ddb33eda2bcd632392564d859942fb1e0026622201f45fe9ab","license":"MIT","urls":["bzz-raw://81e5b0e23122f0d1bccab7d8470987e3aaa787c2d02e140631ff70a83567ae2c","dweb:/ipfs/QmbxNW8tY3FnyFM5GKrEj9Vtr9kLSX6X78xKQGjPdbfd46"]},"contracts/bridge/trustless/libraries/MerkleProofVerifier.sol":{"keccak256":"0x8d92e319d3f83a0e4218d89b598ed86c478a446b4e9271fa1d284842a1aca82b","license":"MIT","urls":["bzz-raw://2aad9a1e47f6e7177b8e7f77ebbb4f9bb32df02f43d07edbd76b7442d49f4e87","dweb:/ipfs/QmXdaJGiAXHqAW9d1zEyBY1vzJhoUaFhzFdPGsxFRrnCLi"]},"contracts/liquidity/interfaces/ILiquidityProvider.sol":{"keccak256":"0xa10b0aef06554835dc192851d0b487bc32d822f73d95558a82f9d37a29071248","license":"MIT","urls":["bzz-raw://5d579daa420f9219b117b44969f43058fbf81979f08a85403dbac621d64955b2","dweb:/ipfs/QmeDFsbuqfnFoVVZQ1S5LMriqLfB8H7qgkCS51yzCydwot"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfGntUswwQJTR45gWnjWtWtB9tkFj1bfQTmmNGduA75jx/archive-info.json b/verification-sources/chain138-metadata-archive/QmfGntUswwQJTR45gWnjWtWtB9tkFj1bfQTmmNGduA75jx/archive-info.json new file mode 100644 index 0000000..ee33c4f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfGntUswwQJTR45gWnjWtWtB9tkFj1bfQTmmNGduA75jx/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfGntUswwQJTR45gWnjWtWtB9tkFj1bfQTmmNGduA75jx", + "metadata_digest": "fb999a36ae245b6e6743dde09a7b97d1e55601de6c30163f3b6eecb6fe3f90cb", + "source_path": "contracts/flash/TwoHopDodoIntegrationUnwinder.sol", + "contract_name": "IDODOIntegrationSwapExactIn", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfGntUswwQJTR45gWnjWtWtB9tkFj1bfQTmmNGduA75jx/metadata.json b/verification-sources/chain138-metadata-archive/QmfGntUswwQJTR45gWnjWtWtB9tkFj1bfQTmmNGduA75jx/metadata.json new file mode 100644 index 0000000..92337dc --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfGntUswwQJTR45gWnjWtWtB9tkFj1bfQTmmNGduA75jx/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapExactIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/TwoHopDodoIntegrationUnwinder.sol":"IDODOIntegrationSwapExactIn"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/flash/TwoHopDodoIntegrationUnwinder.sol":{"keccak256":"0xe272b61163cf6860d252c8c75048c139586a8f60ba7cadbf040497b3aa0a4c2c","license":"MIT","urls":["bzz-raw://4824ebcb15628a5074529ecb6e10b73c73374a92f2e97c77922dd37bf281d60c","dweb:/ipfs/QmNy9WJimfXdwc78MSZpxf5xz3d323yLKewP2cYx7JAVBT"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfHsQcBbEmDqrjmMHX4nudkYgVpLrikGbM7texfhCc2VY/archive-info.json b/verification-sources/chain138-metadata-archive/QmfHsQcBbEmDqrjmMHX4nudkYgVpLrikGbM7texfhCc2VY/archive-info.json new file mode 100644 index 0000000..df17811 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfHsQcBbEmDqrjmMHX4nudkYgVpLrikGbM7texfhCc2VY/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:13Z", + "cid": "QmfHsQcBbEmDqrjmMHX4nudkYgVpLrikGbM7texfhCc2VY", + "metadata_digest": "fbe04b172880bec820ca5d9bedf23472326ea4ab84635ef55ecf895bd6a7b1c3", + "source_path": "contracts/vendor/sushiswap-v2/UniswapV2Pair.sol", + "contract_name": "UniswapV2Pair", + "compiler": "0.6.12", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "", + "viaIR": false, + "build_info": "smom-dbis-138/artifacts/build-info/a3746311a3a4708acb630ad8863db34f.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfHsQcBbEmDqrjmMHX4nudkYgVpLrikGbM7texfhCc2VY/metadata.json b/verification-sources/chain138-metadata-archive/QmfHsQcBbEmDqrjmMHX4nudkYgVpLrikGbM7texfhCc2VY/metadata.json new file mode 100644 index 0000000..c1c7723 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfHsQcBbEmDqrjmMHX4nudkYgVpLrikGbM7texfhCc2VY/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.6.12+commit.27d51765"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/vendor/sushiswap-v2/UniswapV2Pair.sol":"UniswapV2Pair"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"contracts/vendor/sushiswap-v2/UniswapV2ERC20.sol":{"keccak256":"0x2effe906b7ffa4fd9ff704fb426f46d21b9af881bbc9ca35f221531243251826","license":"GPL-3.0","urls":["bzz-raw://27a0ecc1fff91645ccd91ba3305272aeb3fbd124a48760e984a0b7c192946377","dweb:/ipfs/QmZpWRVXgSvesXppoitQiEWv4QWw5Xt1e34rxocYcswn1b"]},"contracts/vendor/sushiswap-v2/UniswapV2Pair.sol":{"keccak256":"0x3b13a4696ca98b08fb2450c8b9820d7c6df6ccfa9274275af5a0fdac7624a2ce","license":"GPL-3.0","urls":["bzz-raw://eb27c08ddfb2387690ab2601c3a5329af50e2337b1ad0f01c9d3ecb86d47286b","dweb:/ipfs/Qmerb5ys7C8AQZLAnWgEGRCxkzCXYHRQiYjfZHRZ5JAKhJ"]},"contracts/vendor/sushiswap-v2/interfaces/IERC20.sol":{"keccak256":"0x76866491759a6f069ddc030d52df08d4105a8bcef0e3330dee261cf7ee049b1a","license":"GPL-3.0","urls":["bzz-raw://0b3b2a687415260c33e491cc2d03577729802b5ff8227cc9fd7b45b28cbd24e4","dweb:/ipfs/QmNtBCKh68KLnNj8M2rQDPnbBfKhntzaZ1JReQx4Axtx5w"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Callee.sol":{"keccak256":"0x6bf2e1cd601f8df7a25606a03fb01532f33aa5d77278ef6e7fb72a3b95a2d8d8","license":"GPL-3.0","urls":["bzz-raw://aaaf7c44351d883b3830e484cc20fe1f91b832aaeb8c4631b1848b6bb08c7661","dweb:/ipfs/QmbxistLwfsuywWLHgBpDcQu4f5j6wV13Vs3JrSd1gjX9N"]},"contracts/vendor/sushiswap-v2/interfaces/IUniswapV2Factory.sol":{"keccak256":"0xcaec675e6250bf4cd3364459a0cbf789262af2aaa377d61d4d463f657aea7b50","license":"GPL-3.0","urls":["bzz-raw://2c09e004aa8654e1ad2a1e9d8500883f618d754e5a77c840e2c9064c7a80b5cb","dweb:/ipfs/QmamoA2xnZpLsu4gjNaWkfdYcL5VjRpFmR5shpoJ8wYjZw"]},"contracts/vendor/sushiswap-v2/libraries/Math.sol":{"keccak256":"0x3e0a5520297ed1dc711407fb10e309db409fc8143e19a0a7751aa064bb99dfa1","license":"GPL-3.0","urls":["bzz-raw://5d44428171de5cd02c255aebd53d88e78cfee0b877bc1a13bbafa6e83eb0597d","dweb:/ipfs/QmXLVkrxEpA57vgP2CYh26PPGqaFy8C5peKKSdLobfCv31"]},"contracts/vendor/sushiswap-v2/libraries/SafeMath.sol":{"keccak256":"0xbde2cf4655f2f21a4e6cc76c28cf88ade1d8150289c208d48662135be9d5dd97","license":"GPL-3.0","urls":["bzz-raw://bd8f46ed9dc5ad8123e596a3b762815503a04ce8a83098d80ba45085fe3c5953","dweb:/ipfs/QmUa6d2v7Miy26dzUctkrumi5My4G34TL9QNUj9u4hh7iS"]},"contracts/vendor/sushiswap-v2/libraries/UQ112x112.sol":{"keccak256":"0xc4574ee73aa220d7a8b363ef7c874c099b6007b0f30365993e758c8337a294d8","license":"GPL-3.0","urls":["bzz-raw://e27c362f1a0f0bf97004bccab2b19faaea0706bc8a21febca6e365de77a20536","dweb:/ipfs/QmZipPjDSok9FxPjMB5rPTuJ7P2VvhaNzHA92TpYvE16FR"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfJAToFAoSSfmKFHKjnVU1KPTGciaKeYjyrtfMGSYRWYx/archive-info.json b/verification-sources/chain138-metadata-archive/QmfJAToFAoSSfmKFHKjnVU1KPTGciaKeYjyrtfMGSYRWYx/archive-info.json new file mode 100644 index 0000000..18d3737 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfJAToFAoSSfmKFHKjnVU1KPTGciaKeYjyrtfMGSYRWYx/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfJAToFAoSSfmKFHKjnVU1KPTGciaKeYjyrtfMGSYRWYx", + "metadata_digest": "fbf393d6213c10c90d58938cb7879525e0eece6eed47a603bd92966d90195161", + "source_path": "contracts/flash/TwoHopDodoToUniswapV3MultiHopExternalUnwinder.sol", + "contract_name": "IDODOTwoHopSwapExactIn", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfJAToFAoSSfmKFHKjnVU1KPTGciaKeYjyrtfMGSYRWYx/metadata.json b/verification-sources/chain138-metadata-archive/QmfJAToFAoSSfmKFHKjnVU1KPTGciaKeYjyrtfMGSYRWYx/metadata.json new file mode 100644 index 0000000..1e3ca73 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfJAToFAoSSfmKFHKjnVU1KPTGciaKeYjyrtfMGSYRWYx/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapExactIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/TwoHopDodoToUniswapV3MultiHopExternalUnwinder.sol":"IDODOTwoHopSwapExactIn"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"contracts/bridge/trustless/interfaces/ISwapRouter.sol":{"keccak256":"0x291d1022fca78a02625d85d4ea1ae6be57e63929d5396caa9523b270a8986012","license":"MIT","urls":["bzz-raw://1cc335590b16f8f589cb4806062e60aab52996e80e0f49b0d7ab04fde569f9b8","dweb:/ipfs/Qma5545StDPXxUz6EqNSU1eRjd13VmXS2cUUQcq2tYhevN"]},"contracts/flash/TwoHopDodoToUniswapV3MultiHopExternalUnwinder.sol":{"keccak256":"0x9e71ec9424770a39783dbf7fadde6c62c574cda2cd2a5258f3fc0985d6e37a79","license":"MIT","urls":["bzz-raw://2ea42fb0a3f86010828419c067a2fc06ef2e3a33390479d8b323362b83856128","dweb:/ipfs/Qmc6CtpNbGBtfb9Fjo9vC7aJaaU1p8tsAcCCc812JiLceL"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfKwGwVUZZEjGCufFXTToHUJQLjgJEojPfRtLfanCRb3s/archive-info.json b/verification-sources/chain138-metadata-archive/QmfKwGwVUZZEjGCufFXTToHUJQLjgJEojPfRtLfanCRb3s/archive-info.json new file mode 100644 index 0000000..03d5ee8 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfKwGwVUZZEjGCufFXTToHUJQLjgJEojPfRtLfanCRb3s/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfKwGwVUZZEjGCufFXTToHUJQLjgJEojPfRtLfanCRb3s", + "metadata_digest": "fc67d40a843dfbfbda9cdd975882cd9f0e677af2448647bed02d200ff7f57e3e", + "source_path": "contracts/tokens/CompliantUSDT.sol", + "contract_name": "CompliantUSDT", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfKwGwVUZZEjGCufFXTToHUJQLjgJEojPfRtLfanCRb3s/metadata.json b/verification-sources/chain138-metadata-archive/QmfKwGwVUZZEjGCufFXTToHUJQLjgJEojPfRtLfanCRb3s/metadata.json new file mode 100644 index 0000000..3426047 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfKwGwVUZZEjGCufFXTToHUJQLjgJEojPfRtLfanCRb3s/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mechanism","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisputeResolutionMechanismSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"jurisdiction","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"JurisdictionDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"noticeHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LegalNotice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"legalReferenceHash","type":"bytes32"}],"name":"ValueTransferDeclared","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISPUTE_RESOLUTION_MECHANISM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_ARBITRATION_SUPPORT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_TRADE_TERMS_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICC_UNIFORM_RULES_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTRUMENT_CLASSIFICATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_20022_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_27001_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_3166_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_4217_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISO_8601_COMPLIANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_ENFORCEABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_FRAMEWORK_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGAL_JURISDICTION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGULATORY_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_OF_PROCESS_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFERABILITY_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAVEL_RULE_EXEMPTION_STATEMENT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"recordLegalNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Inherits from LegallyCompliantBase for Travel Rules exemption and regulatory compliance exemption","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`\u2019s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"burn(uint256)":{"params":{"amount":"Amount of tokens to burn"}},"constructor":{"params":{"admin":"Address that will receive DEFAULT_ADMIN_ROLE for compliance","initialOwner":"Address that will own the contract"}},"decimals()":{"returns":{"_0":"Number of decimals (6 for USDT)"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"mint(address,uint256)":{"details":"Only owner can mint","params":{"amount":"Amount of tokens to mint","to":"Address to mint tokens to"}},"name()":{"details":"Returns the name of the token."},"owner()":{"details":"Returns the address of the current owner."},"pause()":{"details":"Only owner can pause"},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"recordLegalNotice(string)":{"params":{"message":"The legal notice message"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"unpause()":{"details":"Only owner can unpause"}},"title":"CompliantUSDT","version":1},"userdoc":{"kind":"user","methods":{"burn(uint256)":{"notice":"Burn tokens from caller's balance"},"constructor":{"notice":"Constructor"},"decimals()":{"notice":"Returns the number of decimals"},"mint(address,uint256)":{"notice":"Mint new tokens"},"pause()":{"notice":"Pause token transfers"},"recordLegalNotice(string)":{"notice":"Record a legal notice"},"unpause()":{"notice":"Unpause token transfers"}},"notice":"Tether USD (Compliant) - ERC20 token with full legal compliance","version":1}},"settings":{"compilationTarget":{"contracts/tokens/CompliantUSDT.sol":"CompliantUSDT"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","license":"MIT","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","license":"MIT","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","license":"MIT","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd","license":"MIT","urls":["bzz-raw://1a4b83328c98d518a2699c2cbe9e9b055e78aa57fa8639f1b88deb8b3750b5dc","dweb:/ipfs/QmXdcYj5v7zQxXFPULShHkR5p4Wa2zYuupbHnFdV3cHYtc"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","license":"MIT","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","license":"MIT","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","license":"MIT","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"]},"contracts/compliance/LegallyCompliantBase.sol":{"keccak256":"0x60b62492c7ad1f613a6070f38b3e6849d7a52d63dd68254bd95f96e733f74bb1","license":"MIT","urls":["bzz-raw://abcea0d6b1835eaccbd2b9eceaa1f04e3665fbdf3f2a61bcc52709e783a8ba51","dweb:/ipfs/Qmc8M9VQ2k2QP4UBXcjGfWQAojbmxNYUBVwNBfHSLFRorw"]},"contracts/tokens/CompliantUSDT.sol":{"keccak256":"0x2fbbba4ff0c752a3b555f814e59b9dbb6051ebe9cf827a6c4b20d739fc3b7a55","license":"MIT","urls":["bzz-raw://8cfb6bfa0cb2dd980e0fd4fbc4e380389c358ba9d053338a3defcfd53a0f85fe","dweb:/ipfs/QmVjddQQ7rG26gnfedh5M4ND6GShj5nJWdk5rkhT8dDb1R"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfQxPSsyTiV8W3Ne6L34N1Vf6D3j1chAixtVZVoW1fCpt/archive-info.json b/verification-sources/chain138-metadata-archive/QmfQxPSsyTiV8W3Ne6L34N1Vf6D3j1chAixtVZVoW1fCpt/archive-info.json new file mode 100644 index 0000000..c4fdc00 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfQxPSsyTiV8W3Ne6L34N1Vf6D3j1chAixtVZVoW1fCpt/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfQxPSsyTiV8W3Ne6L34N1Vf6D3j1chAixtVZVoW1fCpt", + "metadata_digest": "fdb0fd68e1a7fd071e867d7376b18d73a51354f40ba36924689c644689dec1f5", + "source_path": "contracts/flash/AaveQuotePushFlashReceiver.sol", + "contract_name": "IAaveExternalUnwinder", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfQxPSsyTiV8W3Ne6L34N1Vf6D3j1chAixtVZVoW1fCpt/metadata.json b/verification-sources/chain138-metadata-archive/QmfQxPSsyTiV8W3Ne6L34N1Vf6D3j1chAixtVZVoW1fCpt/metadata.json new file mode 100644 index 0000000..5086e45 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfQxPSsyTiV8W3Ne6L34N1Vf6D3j1chAixtVZVoW1fCpt/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unwind","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/flash/AaveQuotePushFlashReceiver.sol":"IAaveExternalUnwinder"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","license":"MIT","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","license":"MIT","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","license":"MIT","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"contracts/flash/AaveQuotePushFlashReceiver.sol":{"keccak256":"0x9648a35f371bb79c4782933d66237ee759ab4d546950bf79489c87091ff5d7e5","license":"MIT","urls":["bzz-raw://e4360e49daf3f2ac0a7f0299d0083479909f5ae30de80ad647b37421f4d871c8","dweb:/ipfs/QmVAkMWwMEJwFQ5ELSLJhhoxM6oSPUpkrjTzEZkMH5cdh7"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfXE8xEv7TPP1WkNtUALfSWjKs9vaxKnNPN3oLKqXU1Lg/archive-info.json b/verification-sources/chain138-metadata-archive/QmfXE8xEv7TPP1WkNtUALfSWjKs9vaxKnNPN3oLKqXU1Lg/archive-info.json new file mode 100644 index 0000000..2631c5d --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfXE8xEv7TPP1WkNtUALfSWjKs9vaxKnNPN3oLKqXU1Lg/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfXE8xEv7TPP1WkNtUALfSWjKs9vaxKnNPN3oLKqXU1Lg", + "metadata_digest": "ff4c488f78b9ef2b3009906ef9e8c53ffadc942acead81955e131d7885c44a8d", + "source_path": "contracts/dex/PrivatePoolRegistry.sol", + "contract_name": "PrivatePoolRegistry", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfXE8xEv7TPP1WkNtUALfSWjKs9vaxKnNPN3oLKqXU1Lg/metadata.json b/verification-sources/chain138-metadata-archive/QmfXE8xEv7TPP1WkNtUALfSWjKs9vaxKnNPN3oLKqXU1Lg/metadata.json new file mode 100644 index 0000000..8e4b2cb --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfXE8xEv7TPP1WkNtUALfSWjKs9vaxKnNPN3oLKqXU1Lg/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"}],"name":"PrivatePoolRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"}],"name":"PrivatePoolRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STABILIZER_LP_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getPrivatePool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLpAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"address","name":"poolAddress","type":"address"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"unregister","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Only the Stabilizer (or whitelisted keeper) should execute swaps for rebalancing. Liquidity provision can be restricted via STABILIZER_LP_ROLE when enforced by a wrapper or runbook.","errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)"}},"kind":"dev","methods":{"getPrivatePool(address,address)":{"params":{"tokenIn":"One of the pair","tokenOut":"The other"},"returns":{"pool":"The registered pool address, or address(0) if none"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isLpAllowed(address)":{"details":"Use in a wrapper or runbook; DODOPMMIntegration.addLiquidity does not check this."},"register(address,address,address)":{"params":{"poolAddress":"DODO pool address (e.g. from DODOPMMIntegration.createPool)","tokenA":"First token (order used for storage; getPrivatePool is order-agnostic)","tokenB":"Second token"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"stateVariables":{"_pools":{"details":"Canonical key: (token0, token1) where token0 < token1"}},"title":"PrivatePoolRegistry","version":1},"userdoc":{"kind":"user","methods":{"getPrivatePool(address,address)":{"notice":"Get the private pool for a token pair (order-agnostic)."},"isLpAllowed(address)":{"notice":"Check if an address is allowed to add liquidity (has STABILIZER_LP_ROLE)."},"register(address,address,address)":{"notice":"Register a private pool for a token pair."},"unregister(address,address)":{"notice":"Remove a private pool registration (e.g. migration)."}},"notice":"Registry of private XAU-anchored stabilization pools (Master Plan Phase 2).","version":1}},"settings":{"compilationTarget":{"contracts/dex/PrivatePoolRegistry.sol":"PrivatePoolRegistry"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/dex/PrivatePoolRegistry.sol":{"keccak256":"0xdea6a1e32a8be8440c9534705f8056d3a6e4ca5ec239d1368310cbbbf34bf84a","license":"MIT","urls":["bzz-raw://e9d034ff9cea19d882581da7750c9722e4a2a80f04e368a8b4d3937fda29eadd","dweb:/ipfs/QmT7jpzpu6BRDAjkDmYKWXmUJ6dSrvvCjkXbtqL28Kbo9n"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfYqDTuYo3a6xzJXar19CEbwj5fSAuCoQTCPi7jnVo9Fd/archive-info.json b/verification-sources/chain138-metadata-archive/QmfYqDTuYo3a6xzJXar19CEbwj5fSAuCoQTCPi7jnVo9Fd/archive-info.json new file mode 100644 index 0000000..d06de0f --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfYqDTuYo3a6xzJXar19CEbwj5fSAuCoQTCPi7jnVo9Fd/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfYqDTuYo3a6xzJXar19CEbwj5fSAuCoQTCPi7jnVo9Fd", + "metadata_digest": "ffb586de065474dd9562f7cb474f3a42c8c7879c0a0515335f64b9c4343a5100", + "source_path": "contracts/vault/interfaces/IVault.sol", + "contract_name": "IVault", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfYqDTuYo3a6xzJXar19CEbwj5fSAuCoQTCPi7jnVo9Fd/metadata.json b/verification-sources/chain138-metadata-archive/QmfYqDTuYo3a6xzJXar19CEbwj5fSAuCoQTCPi7jnVo9Fd/metadata.json new file mode 100644 index 0000000..72bb701 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfYqDTuYo3a6xzJXar19CEbwj5fSAuCoQTCPi7jnVo9Fd/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"borrower","type":"address"}],"name":"Borrowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"repayer","type":"address"}],"name":"Repaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getHealth","outputs":[{"internalType":"uint256","name":"healthRatio","type":"uint256"},{"internalType":"uint256","name":"collateralValue","type":"uint256"},{"internalType":"uint256","name":"debtValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Aave-style vault operations (deposit, borrow, repay, withdraw)","kind":"dev","methods":{"borrow(address,uint256)":{"params":{"amount":"Amount to borrow","currency":"eMoney currency address"}},"deposit(address,uint256)":{"params":{"amount":"Amount to deposit","asset":"Collateral asset address"}},"getHealth()":{"returns":{"collateralValue":"Total collateral value in XAU","debtValue":"Total debt value in XAU","healthRatio":"Collateralization ratio in basis points"}},"owner()":{"returns":{"_0":"owner Vault owner address"}},"repay(address,uint256)":{"params":{"amount":"Amount to repay","currency":"eMoney currency address"}},"withdraw(address,uint256)":{"params":{"amount":"Amount to withdraw","asset":"Collateral asset address"}}},"title":"IVault","version":1},"userdoc":{"kind":"user","methods":{"borrow(address,uint256)":{"notice":"Borrow eMoney against collateral"},"deposit(address,uint256)":{"notice":"Deposit M0 collateral into vault"},"getHealth()":{"notice":"Get vault health"},"owner()":{"notice":"Get vault owner"},"repay(address,uint256)":{"notice":"Repay borrowed eMoney"},"withdraw(address,uint256)":{"notice":"Withdraw collateral from vault"}},"notice":"Interface for Vault contract","version":1}},"settings":{"compilationTarget":{"contracts/vault/interfaces/IVault.sol":"IVault"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"contracts/vault/interfaces/IVault.sol":{"keccak256":"0x8d8b34ee40744f19fc1c758cd08815b748750059ea87eb89b25b0490c3613c9c","license":"MIT","urls":["bzz-raw://af6f236b0a80f6eb36c4c006df04c5199247c021182c5afb08184503b187a552","dweb:/ipfs/QmSobXGKCjL8WfvKA312zK3dtE7M5DmioKEucN4MP4TZEZ"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-metadata-archive/QmfZH82Kztm9cTKGYgujr2AMmdtdpoZUDEpmuhMum9UWZV/archive-info.json b/verification-sources/chain138-metadata-archive/QmfZH82Kztm9cTKGYgujr2AMmdtdpoZUDEpmuhMum9UWZV/archive-info.json new file mode 100644 index 0000000..48fef95 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfZH82Kztm9cTKGYgujr2AMmdtdpoZUDEpmuhMum9UWZV/archive-info.json @@ -0,0 +1,15 @@ +{ + "archived_utc": "2026-07-09T03:24:14Z", + "cid": "QmfZH82Kztm9cTKGYgujr2AMmdtdpoZUDEpmuhMum9UWZV", + "metadata_digest": "ffd2d1ad13e324efbb8dc40d2a53e499abadc210c21b45be4992acfc40e425a8", + "source_path": "contracts/bridge/integration/CWAssetReserveVerifier.sol", + "contract_name": "IOwnableLikeV2", + "compiler": "0.8.22", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "viaIR": true, + "build_info": "smom-dbis-138/artifacts/build-info/df624af513902d1cebc7f4b3b2844acc.json" +} diff --git a/verification-sources/chain138-metadata-archive/QmfZH82Kztm9cTKGYgujr2AMmdtdpoZUDEpmuhMum9UWZV/metadata.json b/verification-sources/chain138-metadata-archive/QmfZH82Kztm9cTKGYgujr2AMmdtdpoZUDEpmuhMum9UWZV/metadata.json new file mode 100644 index 0000000..3098fc9 --- /dev/null +++ b/verification-sources/chain138-metadata-archive/QmfZH82Kztm9cTKGYgujr2AMmdtdpoZUDEpmuhMum9UWZV/metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/bridge/integration/CWAssetReserveVerifier.sol":"IOwnableLikeV2"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","license":"MIT","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","license":"MIT","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","license":"MIT","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","license":"MIT","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","license":"MIT","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"]},"contracts/bridge/integration/CWAssetReserveVerifier.sol":{"keccak256":"0xcb55f1e9a1cf66ac3664c2b1aefe5fea606cb5cf49d6c1fe28d8a801a6304b26","license":"MIT","urls":["bzz-raw://cd2bdfc516e4e6ada08aea0e897acebdf9fbeca2fde3c4dc2141fcba100a31b3","dweb:/ipfs/QmQ7HiaLuE5x1tMZaMCiLrMMYwLx4ijeyBB9L9Cv7bci2y"]},"contracts/bridge/integration/ICWReserveVerifier.sol":{"keccak256":"0x4fc7b6b8f10d5ec64517fc31559a2b7ac52c7496a7effaac7d29fbfc64f44528","license":"MIT","urls":["bzz-raw://7ef5196aefc98a7d6b295118500062ec62c05d786e3f9ad1ae8414d48279605d","dweb:/ipfs/QmU6cE1rZA99DygbUECyCoQwc5t2g1aJrcs3BiZ4SPoksa"]},"contracts/reserve/IReserveSystem.sol":{"keccak256":"0x54807c96215606d488ee3caf75f410a2959d3574bde674c7e37efc0a5a0e9587","license":"MIT","urls":["bzz-raw://92c2882fcdfa04e90a36585c86610ce06f1ae102f8aea93f4fcbc8ec6f6b158e","dweb:/ipfs/QmcyE5zCLCi6uPa9HQEWdwihUfbWBWqAP2LETtsSSq89xY"]}},"version":1} \ No newline at end of file diff --git a/verification-sources/chain138-multicall/Multicall.sol b/verification-sources/chain138-multicall/Multicall.sol new file mode 100644 index 0000000..9879d6a --- /dev/null +++ b/verification-sources/chain138-multicall/Multicall.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title Multicall + * @notice Aggregate multiple calls in a single transaction + * @dev Based on Uniswap V3 Multicall + */ +contract Multicall { + struct Call { + address target; + bytes callData; + } + + struct Result { + bool success; + bytes returnData; + } + + /** + * @notice Aggregate multiple calls + * @param calls Array of calls to execute + * @return returnData Array of return data for each call + */ + function aggregate(Call[] memory calls) public returns (bytes[] memory returnData) { + returnData = new bytes[](calls.length); + for (uint256 i = 0; i < calls.length; i++) { + (bool success, bytes memory ret) = calls[i].target.call(calls[i].callData); + require(success, "Multicall: call failed"); + returnData[i] = ret; + } + } + + /** + * @notice Aggregate multiple calls, allowing failures + * @param requireSuccess If true, require all calls to succeed + * @param calls Array of calls to execute + * @return returnData Array of results with success flags and return data for each call + */ + function tryAggregate(bool requireSuccess, Call[] memory calls) + public + returns (Result[] memory returnData) + { + returnData = new Result[](calls.length); + for (uint256 i = 0; i < calls.length; i++) { + (bool success, bytes memory ret) = calls[i].target.call(calls[i].callData); + + if (requireSuccess) { + require(success, "Multicall: call failed"); + } + + returnData[i] = Result(success, ret); + } + } + + /** + * @notice Aggregate multiple calls with gas limit + * @param calls Array of calls to execute + * @param gasLimit Gas limit for each call + * @return returnData Array of return data for each call + */ + function aggregateWithGasLimit(Call[] memory calls, uint256 gasLimit) + public + returns (bytes[] memory returnData) + { + returnData = new bytes[](calls.length); + for (uint256 i = 0; i < calls.length; i++) { + (bool success, bytes memory ret) = calls[i].target.call{gas: gasLimit}(calls[i].callData); + require(success, "Multicall: call failed"); + returnData[i] = ret; + } + } + + /** + * @notice Get block hash for a specific block + * @param blockNumber Block number + * @return blockHash Block hash + */ + function getBlockHash(uint256 blockNumber) public view returns (bytes32 blockHash) { + blockHash = blockhash(blockNumber); + } + + /** + * @notice Get current block timestamp + * @return timestamp Current block timestamp + */ + function getCurrentBlockTimestamp() public view returns (uint256 timestamp) { + timestamp = block.timestamp; + } + + /** + * @notice Get current block difficulty + * @return difficulty Current block difficulty + */ + function getCurrentBlockDifficulty() public view returns (uint256 difficulty) { + difficulty = block.difficulty; + } + + /** + * @notice Get current block gas limit + * @return gaslimit Current block gas limit + */ + function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) { + gaslimit = block.gaslimit; + } + + /** + * @notice Get current block coinbase + * @return coinbase Current block coinbase + */ + function getCurrentBlockCoinbase() public view returns (address coinbase) { + coinbase = block.coinbase; + } + + /** + * @notice Get current block number + * @return blockNumber Current block number + */ + function getCurrentBlockNumber() public view returns (uint256 blockNumber) { + blockNumber = block.number; + } + + /** + * @notice Get current chain ID + * @return chainid Current chain ID + */ + function getChainId() public view returns (uint256 chainid) { + chainid = block.chainid; + } +} diff --git a/verification-sources/chain138-multicall/foundry.toml b/verification-sources/chain138-multicall/foundry.toml new file mode 100644 index 0000000..f97fe93 --- /dev/null +++ b/verification-sources/chain138-multicall/foundry.toml @@ -0,0 +1,10 @@ +[profile.default] +src = "." +out = "out" +cache_path = "cache" +solc = "0.8.20" +optimizer = true +optimizer_runs = 200 +via_ir = true +evm_version = "paris" +auto_detect_remappings = false diff --git a/verification-sources/chain138-transaction-mirror-historical/contracts/mirror/TransactionMirror.sol b/verification-sources/chain138-transaction-mirror-historical/contracts/mirror/TransactionMirror.sol new file mode 100644 index 0000000..37b5096 --- /dev/null +++ b/verification-sources/chain138-transaction-mirror-historical/contracts/mirror/TransactionMirror.sol @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +/** + * @title TransactionMirror + * @notice Mirrors Chain-138 transactions to Ethereum Mainnet for Etherscan visibility + * @dev Logs all Chain-138 transactions as events on Mainnet, making them searchable + * and viewable on Etherscan. This provides transparency and auditability. + */ +contract TransactionMirror { + address public admin; + bool public paused; + + // Chain-138 chain ID + uint64 public constant CHAIN_138 = 138; + + // Maximum batch size to prevent gas limit issues + uint256 public constant MAX_BATCH_SIZE = 100; + + // Transaction structure + struct MirroredTransaction { + bytes32 txHash; // Chain-138 transaction hash + address from; // Sender address + address to; // Recipient address (or contract) + uint256 value; // Value transferred + uint256 blockNumber; // Chain-138 block number + uint256 blockTimestamp; // Block timestamp + uint256 gasUsed; // Gas used + bool success; // Transaction success status + bytes data; // Transaction data (if any) + bytes32 indexedHash; // Indexed hash for searchability + } + + // Mapping: txHash => MirroredTransaction + mapping(bytes32 => MirroredTransaction) public transactions; + + // Array of all mirrored transaction hashes + bytes32[] public mirroredTxHashes; + + // Mapping: txHash => bool (replay protection) + mapping(bytes32 => bool) public processed; + + // Events (indexed for Etherscan searchability) + event TransactionMirrored( + bytes32 indexed txHash, + address indexed from, + address indexed to, + uint256 value, + uint256 blockNumber, + uint256 blockTimestamp, + uint256 gasUsed, + bool success + ); + + event BatchTransactionsMirrored( + uint256 count, + uint256 startBlock, + uint256 endBlock + ); + + event AdminChanged(address indexed newAdmin); + event Paused(); + event Unpaused(); + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin"); + _; + } + + modifier whenNotPaused() { + require(!paused, "paused"); + _; + } + + constructor(address _admin) { + require(_admin != address(0), "zero admin"); + admin = _admin; + } + + /** + * @notice Mirror a single Chain-138 transaction to Mainnet + * @param txHash Chain-138 transaction hash + * @param from Sender address + * @param to Recipient address + * @param value Value transferred + * @param blockNumber Chain-138 block number + * @param blockTimestamp Block timestamp + * @param gasUsed Gas used + * @param success Transaction success status + * @param data Transaction data (optional) + */ + function mirrorTransaction( + bytes32 txHash, + address from, + address to, + uint256 value, + uint256 blockNumber, + uint256 blockTimestamp, + uint256 gasUsed, + bool success, + bytes calldata data + ) external onlyAdmin whenNotPaused { + require(txHash != bytes32(0), "invalid hash"); + require(!processed[txHash], "already mirrored"); + + bytes32 indexedHash = keccak256(abi.encodePacked(CHAIN_138, txHash)); + + transactions[txHash] = MirroredTransaction({ + txHash: txHash, + from: from, + to: to, + value: value, + blockNumber: blockNumber, + blockTimestamp: blockTimestamp, + gasUsed: gasUsed, + success: success, + data: data, + indexedHash: indexedHash + }); + + mirroredTxHashes.push(txHash); + processed[txHash] = true; + + emit TransactionMirrored( + txHash, + from, + to, + value, + blockNumber, + blockTimestamp, + gasUsed, + success + ); + } + + /** + * @notice Mirror multiple Chain-138 transactions in a batch + * @param txHashes Array of transaction hashes + * @param froms Array of sender addresses + * @param tos Array of recipient addresses + * @param values Array of values + * @param blockNumbers Array of block numbers + * @param blockTimestamps Array of timestamps + * @param gasUseds Array of gas used + * @param successes Array of success statuses + * @param datas Array of transaction data + */ + function mirrorBatchTransactions( + bytes32[] calldata txHashes, + address[] calldata froms, + address[] calldata tos, + uint256[] calldata values, + uint256[] calldata blockNumbers, + uint256[] calldata blockTimestamps, + uint256[] calldata gasUseds, + bool[] calldata successes, + bytes[] calldata datas + ) external onlyAdmin whenNotPaused { + uint256 count = txHashes.length; + require(count > 0, "empty batch"); + require(count <= MAX_BATCH_SIZE, "batch too large"); + require( + count == froms.length && + count == tos.length && + count == values.length && + count == blockNumbers.length && + count == blockTimestamps.length && + count == gasUseds.length && + count == successes.length && + count == datas.length, + "array length mismatch" + ); + + uint256 startBlock = blockNumbers[0]; + uint256 endBlock = blockNumbers[count - 1]; + + // Process transactions in batches to avoid stack too deep + for (uint256 i = 0; i < count; i++) { + bytes32 txHash = txHashes[i]; + require(txHash != bytes32(0), "invalid hash"); + require(!processed[txHash], "already mirrored"); + + bytes32 indexedHash = keccak256(abi.encodePacked(CHAIN_138, txHash)); + + transactions[txHash] = MirroredTransaction({ + txHash: txHash, + from: froms[i], + to: tos[i], + value: values[i], + blockNumber: blockNumbers[i], + blockTimestamp: blockTimestamps[i], + gasUsed: gasUseds[i], + success: successes[i], + data: datas[i], + indexedHash: indexedHash + }); + + mirroredTxHashes.push(txHash); + processed[txHash] = true; + + emit TransactionMirrored( + txHash, + froms[i], + tos[i], + values[i], + blockNumbers[i], + blockTimestamps[i], + gasUseds[i], + successes[i] + ); + } + + emit BatchTransactionsMirrored(count, startBlock, endBlock); + } + + + /** + * @notice Get mirrored transaction details + * @param txHash Chain-138 transaction hash + * @return mirroredTx Mirrored transaction structure + */ + function getTransaction(bytes32 txHash) external view returns (MirroredTransaction memory mirroredTx) { + require(processed[txHash], "not mirrored"); + return transactions[txHash]; + } + + /** + * @notice Check if a transaction is mirrored + * @param txHash Chain-138 transaction hash + * @return true if mirrored + */ + function isMirrored(bytes32 txHash) external view returns (bool) { + return processed[txHash]; + } + + /** + * @notice Get total number of mirrored transactions + * @return count Number of mirrored transactions + */ + function getMirroredTransactionCount() external view returns (uint256) { + return mirroredTxHashes.length; + } + + /** + * @notice Get mirrored transaction hash at index + * @param index Index in mirroredTxHashes array + * @return txHash Transaction hash + */ + function getMirroredTransaction(uint256 index) external view returns (bytes32) { + require(index < mirroredTxHashes.length, "out of bounds"); + return mirroredTxHashes[index]; + } + + /** + * @notice Admin functions + */ + function setAdmin(address newAdmin) external onlyAdmin { + require(newAdmin != address(0), "zero admin"); + admin = newAdmin; + emit AdminChanged(newAdmin); + } + + function pause() external onlyAdmin { + paused = true; + emit Paused(); + } + + function unpause() external onlyAdmin { + paused = false; + emit Unpaused(); + } +} + diff --git a/verification-sources/chain138-transaction-mirror-historical/foundry.toml b/verification-sources/chain138-transaction-mirror-historical/foundry.toml new file mode 100644 index 0000000..0885899 --- /dev/null +++ b/verification-sources/chain138-transaction-mirror-historical/foundry.toml @@ -0,0 +1,15 @@ +[profile.default] +src = "contracts" +out = "out" +cache_path = "cache" +libs = ["../../lib", "../../node_modules"] +solc = "0.8.20" +optimizer = true +optimizer_runs = 200 +via_ir = true +evm_version = "paris" +auto_detect_remappings = false +remappings = [ + "@openzeppelin/=../../node_modules/@openzeppelin/", + "forge-std/=../../lib/forge-std/src/" +] diff --git a/verification-sources/chain138-usdw-historical/contracts/compliance/LegallyCompliantBase.sol b/verification-sources/chain138-usdw-historical/contracts/compliance/LegallyCompliantBase.sol new file mode 100644 index 0000000..f2b5801 --- /dev/null +++ b/verification-sources/chain138-usdw-historical/contracts/compliance/LegallyCompliantBase.sol @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; + +/** + * @title LegallyCompliantBase + * @notice Base contract for all legally compliant value transfer instruments + * @dev Provides legal framework declarations, ISO standards compliance, ICC compliance, + * and exemption declarations for Travel Rules and regulatory compliance + */ +abstract contract LegallyCompliantBase is AccessControl { + using Strings for uint256; + + // Legal Framework Version + string public constant LEGAL_FRAMEWORK_VERSION = "1.0.0"; + + // Legal Jurisdiction + string public constant LEGAL_JURISDICTION = "International Private Law"; + + // Dispute Resolution + string public constant DISPUTE_RESOLUTION_MECHANISM = "ICC Arbitration (Paris)"; + + // Service of Process Address + string public constant SERVICE_OF_PROCESS_ADDRESS = "0x0000000000000000000000000000000000000000"; + + // ISO Standards Compliance + string public constant ISO_20022_COMPLIANCE = "ISO 20022 (Financial Messaging) - Supported via ISO20022Router"; + string public constant ISO_27001_COMPLIANCE = "ISO 27001 (Information Security) - Architectural Compliance"; + string public constant ISO_3166_COMPLIANCE = "ISO 3166 (Country Codes) - Supported"; + string public constant ISO_8601_COMPLIANCE = "ISO 8601 (Timestamps) - Supported"; + string public constant ISO_4217_COMPLIANCE = "ISO 4217 (Currency Codes) - Supported"; + + // ICC Compliance + string public constant ICC_UNIFORM_RULES_COMPLIANCE = "ICC Uniform Rules for Demand Guarantees (URDG 758) - Applicable by reference"; + string public constant ICC_ARBITRATION_SUPPORT = "ICC Arbitration Rules - Supported for dispute resolution"; + string public constant ICC_TRADE_TERMS_COMPLIANCE = "Incoterms 2020 - Applicable by reference"; + + // Instrument Classification + string public constant INSTRUMENT_CLASSIFICATION = "Private Digital Instrument of Value Transfer"; + + // Transferability Statement + string public constant TRANSFERABILITY_STATEMENT = "This instrument represents a transferable claim or value, subject to contract terms."; + + // Legal Enforceability + string public constant LEGAL_ENFORCEABILITY_STATEMENT = "Enforceable under private international law principles and ICC arbitration."; + + // Travel Rules Exemption + string public constant TRAVEL_RULE_EXEMPTION_STATEMENT = + "This contract is designed for private, peer-to-peer value transfer and is not intended to facilitate transactions subject to FATF Travel Rule (e.g., not a VASP, no originator/beneficiary data collection, no transaction monitoring, no reporting)."; + + // Regulatory Exemption + string public constant REGULATORY_EXEMPTION_STATEMENT = + "This contract is not intended to be a money transmission service, payment service, or regulated financial instrument. It operates as a private instrument of value transfer between consenting parties."; + + // Events + event LegalNotice(bytes32 indexed noticeHash, string message, uint256 timestamp); + event ValueTransferDeclared( + address indexed from, + address indexed to, + uint256 value, + bytes32 legalReferenceHash + ); + event JurisdictionDeclared(string jurisdiction, uint256 timestamp); + event DisputeResolutionMechanismSet(string mechanism, uint256 timestamp); + + /** + * @notice Constructor + * @param admin Address that will receive DEFAULT_ADMIN_ROLE + */ + constructor(address admin) { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + emit JurisdictionDeclared(LEGAL_JURISDICTION, block.timestamp); + emit DisputeResolutionMechanismSet(DISPUTE_RESOLUTION_MECHANISM, block.timestamp); + } + + /** + * @notice Record a legal notice + * @param message The legal notice message + */ + function recordLegalNotice(string calldata message) external onlyRole(DEFAULT_ADMIN_ROLE) { + emit LegalNotice( + keccak256(abi.encodePacked(message, block.timestamp)), + message, + block.timestamp + ); + } + + /** + * @notice Generate a legal reference hash for a value transfer + * @param from Source address + * @param to Destination address + * @param value Transfer amount + * @param additionalData Additional data for the transfer + * @return legalReferenceHash The generated legal reference hash + */ + function _generateLegalReferenceHash( + address from, + address to, + uint256 value, + bytes memory additionalData + ) internal view returns (bytes32) { + return keccak256(abi.encodePacked( + block.timestamp, + block.number, + tx.origin, + from, + to, + value, + additionalData, + LEGAL_FRAMEWORK_VERSION, + LEGAL_JURISDICTION + )); + } + + /** + * @notice Emit a compliant value transfer event + * @param from Source address + * @param to Destination address + * @param value Transfer amount + * @param legalReference Legal reference string + * @param iso20022MessageId ISO 20022 message ID (if applicable) + */ + function _emitCompliantValueTransfer( + address from, + address to, + uint256 value, + string memory legalReference, + bytes32 iso20022MessageId + ) internal { + bytes32 legalRefHash = _generateLegalReferenceHash( + from, + to, + value, + abi.encodePacked(legalReference, iso20022MessageId) + ); + + emit ValueTransferDeclared(from, to, value, legalRefHash); + } +} + diff --git a/verification-sources/chain138-usdw-historical/contracts/tokens/CompliantFiatToken.sol b/verification-sources/chain138-usdw-historical/contracts/tokens/CompliantFiatToken.sol new file mode 100644 index 0000000..d96496e --- /dev/null +++ b/verification-sources/chain138-usdw-historical/contracts/tokens/CompliantFiatToken.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "../compliance/LegallyCompliantBase.sol"; + +/** + * @title CompliantFiatToken + * @notice Generic ISO-4217 compliant fiat/commodity token (ERC-20, DEX-ready) + * @dev Use for cEURC, cGBPC, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT, etc. + * Full ERC-20 for DEX liquidity pools; inherits LegallyCompliantBase. + * + * XAU (gold) invariant — enforced by policy and integrators, not by ERC-20 math: + * When `currencyCode()` is `"XAU"` (e.g. cXAUC, cXAUT), **one full token** means + * **exactly one troy ounce** of fine gold: balances and `mint`/`transfer` amounts use + * `10 ** decimals()` base units per troy ounce (with 6 decimals, `1_000_000` base = 1 oz). + * Fiat codes (USD, EUR, …) use one full token as one unit of that currency at `decimals`. + */ +contract CompliantFiatToken is ERC20, Pausable, Ownable, LegallyCompliantBase { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + + uint8 private immutable _decimalsStorage; + string private _currencyCode; + + /** + * @notice Constructor + * @param name_ Token name (e.g. "Euro Coin (Compliant)") + * @param symbol_ Token symbol (e.g. "cEURC") + * @param decimals_ Token decimals (e.g. 6) + * @param currencyCode_ ISO-4217 code (e.g. "EUR") + * @param initialOwner Owner address + * @param admin Compliance admin (DEFAULT_ADMIN_ROLE) + * @param initialSupply Initial supply to mint to deployer + */ + constructor( + string memory name_, + string memory symbol_, + uint8 decimals_, + string memory currencyCode_, + address initialOwner, + address admin, + uint256 initialSupply + ) + ERC20(name_, symbol_) + Ownable(initialOwner) + LegallyCompliantBase(admin) + { + _decimalsStorage = decimals_; + _currencyCode = currencyCode_; + _grantRole(MINTER_ROLE, initialOwner); + if (initialSupply > 0) { + _mint(msg.sender, initialSupply); + } + } + + function decimals() public view override returns (uint8) { + return _decimalsStorage; + } + + function currencyCode() external view returns (string memory) { + return _currencyCode; + } + + /** + * @notice Internal transfer with compliance tracking + */ + function _update( + address from, + address to, + uint256 amount + ) internal override whenNotPaused { + super._update(from, to, amount); + if (from != address(0) && to != address(0)) { + bytes32 legalRefHash = _generateLegalReferenceHash( + from, + to, + amount, + abi.encodePacked(symbol(), " Transfer") + ); + emit ValueTransferDeclared(from, to, amount, legalRefHash); + } + } + + function pause() public onlyOwner { + _pause(); + } + + function unpause() public onlyOwner { + _unpause(); + } + + /// @notice Mint (DBIS Rail: grant MINTER_ROLE only to DBIS_GRU_MintController; revoke from others) + function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) { + _mint(to, amount); + } + + function burn(uint256 amount) public { + _burn(msg.sender, amount); + } +} diff --git a/verification-sources/chain138-usdw-historical/foundry.toml b/verification-sources/chain138-usdw-historical/foundry.toml new file mode 100644 index 0000000..0885899 --- /dev/null +++ b/verification-sources/chain138-usdw-historical/foundry.toml @@ -0,0 +1,15 @@ +[profile.default] +src = "contracts" +out = "out" +cache_path = "cache" +libs = ["../../lib", "../../node_modules"] +solc = "0.8.20" +optimizer = true +optimizer_runs = 200 +via_ir = true +evm_version = "paris" +auto_detect_remappings = false +remappings = [ + "@openzeppelin/=../../node_modules/@openzeppelin/", + "forge-std/=../../lib/forge-std/src/" +]