false
false

Contract Address Details

0x8Cbb8dB5CE28CF072776866F701368BBcf81F087

Contract Name
SourceBridge
Creator
0xfe0c4d–5fd5d4 at 0xfff2a2–63a984
Balance
0 MNT ( )
Tokens
Fetching tokens...
Transactions
7
Transfers
0
Gas Used
830,107
Last Balance Update
24316365
Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x1d29b8bf4ae4d45d019d21a5770298ac46fc111b.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
Contract name:
SourceBridge




Optimization enabled
true
Compiler version
v0.8.16+commit.07a7930e




Optimization runs
100
Verified at
2023-10-25T14:56:46.589120Z

contracts/bridge/SourceBridge.sol

/**SPDX-License-Identifier: BUSL-1.1

      ā–„ā–„ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–„
   ā•“ā–ˆā–ˆā–€ā”” ,ā•“ā–„ā–„ā–„, 'ā–€ā–ˆā–ˆā–„
  ā–ˆā–ˆā–€ ā–„ā–ˆā–ˆā–€ā–€ā•™ā•™ā–€ā–€ā–ˆā–ˆā–„ ā””ā–ˆā–ˆĀµ           ,,       ,,      ,     ,,,            ,,,
 ā–ˆā–ˆ ,ā–ˆā–ˆĀ¬ ā–„ā–ˆā–ˆā–ˆā–ˆā–„  ā–€ā–ˆā–„ ā•™ā–ˆā–„      ā–„ā–ˆā–ˆā–ˆā–€ā–€ā–ˆā–ˆā–ˆā–„   ā–ˆā–ˆā–ˆā–„    ā–ˆā–ˆ  ā–ˆā–ˆā–ˆā–€ā–€ā–€ā–ˆā–ˆā–ˆā–„    ā–„ā–ˆā–ˆā–ˆā–€ā–€ā–ˆā–ˆā–ˆ,
ā–ˆā–ˆ  ā–ˆā–ˆ ā•’ā–ˆā–€'   ā•™ā–ˆā–Œ ā•™ā–ˆā–Œ ā–ˆā–ˆ     ā–ā–ˆā–ˆ      ā–ˆā–ˆā–ˆ  ā–ˆā–ˆā–ˆā–ˆā–ˆ,  ā–ˆā–ˆ  ā–ˆā–ˆā–Œ    ā””ā–ˆā–ˆā–Œ  ā–ˆā–ˆā–Œ     ā””ā–ˆā–ˆā–Œ
ā–ˆā–ˆ ā–ā–ˆā–Œ ā–ˆā–ˆ      ā•Ÿā–ˆ  ā–ˆā–Œ ā•Ÿā–ˆ     ā–ˆā–ˆā–Œ      ā–ā–ˆā–ˆ  ā–ˆā–ˆ ā””ā–ˆā–ˆā–ˆ ā–ˆā–ˆ  ā–ˆā–ˆā–Œ     ā•Ÿā–ˆā–ˆ jā–ˆā–ˆ       ā•Ÿā–ˆā–ˆ
ā•Ÿā–ˆ  ā–ˆā–ˆ ā•™ā–ˆā–ˆ    ā–„ā–ˆā–€ ā–ā–ˆā–Œ ā–ˆā–ˆ     ā•™ā–ˆā–ˆ      ā–ˆā–ˆā–Œ  ā–ˆā–ˆ   ā•™ā–ˆā–ˆā–ˆā–ˆ  ā–ˆā–ˆā–Œ    ā–„ā–ˆā–ˆā–€  ā–ˆā–ˆā–Œ     ,ā–ˆā–ˆā–€
 ā–ˆā–ˆ "ā–ˆā–ˆ, ā•™ā–€ā–€ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆāŒ      ā•™ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–€   ā–ˆā–ˆ     ā•™ā–ˆā–ˆ  ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–€ā–€     ā•™ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–€`
  ā–ˆā–ˆā–„ ā•™ā–€ā–ˆā–ˆā–„ā–„ā–„ā–„ā–„,,,                ¬─                                    '─¬
   ā•™ā–€ā–ˆā–ˆā–„ '╙╙╙▀▀▀▀▀▀▀▀
      ā•™ā–€ā–€ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆR⌐

 */
pragma solidity 0.8.16;

import "contracts/interfaces/IAxelarGateway.sol";
import "contracts/interfaces/IAxelarGasService.sol";
import "contracts/interfaces/IMulticall.sol";
import "contracts/interfaces/IRWALike.sol";
import {AddressToString} from "contracts/external/axelar/StringAddressUtils.sol";
import "contracts/external/openzeppelin/contracts/access/Ownable.sol";
import "contracts/external/openzeppelin/contracts/security/Pausable.sol";

contract SourceBridge is Ownable, Pausable, IMulticall {
  /// @notice Mapping from destination chain to bridge address on that chain
  /// @dev Axelar uses the string representation of addresses, hence we store
  ///      the address as a string
  mapping(string => string) public destChainToContractAddr;

  /// @notice Token contract bridged by this contract
  IRWALike public immutable TOKEN;

  /// @notice Pointer  to AxelarGateway contract
  IAxelarGateway public immutable AXELAR_GATEWAY;

  /// @notice Pointer to AxelarGasService contract
  IAxelarGasService public immutable GAS_RECEIVER;

  /// @notice Versioning for payload
  bytes32 public constant VERSION = "1.0";

  /// @notice Monotonically increasing nonce for each transaction
  uint256 public nonce;

  /// @notice src Chain Id, used to salt txnHash on dst Chain
  uint256 public immutable CHAIN_ID;

  /**
   * @notice Constructor
   *
   * @param _token The address of the token bridged
   * @param _axelarGateway The address of the AxelarGateway contract
   * @param _gasService The address of the AxelarGasService contract
   * @param owner The owner of the contract
   */
  constructor(
    address _token,
    address _axelarGateway,
    address _gasService,
    address owner
  ) {
    TOKEN = IRWALike(_token);
    AXELAR_GATEWAY = IAxelarGateway(_axelarGateway);
    GAS_RECEIVER = IAxelarGasService(_gasService);
    _transferOwnership(owner);
    CHAIN_ID = block.chainid;
  }

  /**
   * @notice Burns tokens on the source Chain and calls AxelarGateway contract
   *         to mint tokens on the destination chain
   *
   * @param amount The amount of tokens to burn
   * @param destinationChain The destination chain to mint tokens on
   *
   * @dev The amount of tokens to mint is the same as the amount burned
   * @dev User must approve `amount` tokens to this contract before bridging
   */
  function burnAndCallAxelar(
    uint256 amount,
    string calldata destinationChain
  ) external payable whenNotPaused {
    // Ensure that some gas is sent
    if (msg.value == 0) {
      revert GasFeeTooLow();
    }

    // Ensure that amount bridged is not zero
    if (amount == 0) {
      revert CannotBridgeZero();
    }

    // Check destinationChain is correct
    string memory destContract = destChainToContractAddr[destinationChain];

    if (bytes(destContract).length == 0) {
      revert DestinationNotSupported();
    }

    // burn amount
    TOKEN.burnFrom(msg.sender, amount);

    bytes memory payload = abi.encode(
      VERSION,
      CHAIN_ID,
      msg.sender,
      amount,
      nonce++
    );

    _payGasAndCallContract(destinationChain, destContract, payload);
    emit BridgeInitiated(msg.sender, nonce - 1, CHAIN_ID, VERSION, amount);
  }

  /**
   * @notice Helper function that pays gas and calls the AxelarGateway contract
   *
   * @param destinationChain The destination chain to mint tokens on
   * @param destContract The contract address on the destination chain
   * @param payload The payload to send to the AxelarGateway contract
   */
  function _payGasAndCallContract(
    string calldata destinationChain,
    string memory destContract,
    bytes memory payload
  ) private {
    GAS_RECEIVER.payNativeGasForContractCall{value: msg.value}(
      address(this),
      destinationChain,
      destContract,
      payload,
      msg.sender
    );

    // Send all information to AxelarGateway contract.
    AXELAR_GATEWAY.callContract(destinationChain, destContract, payload);
  }

  /*//////////////////////////////////////////////////////////////
                          Admin Functions
  //////////////////////////////////////////////////////////////*/

  /**
   * @notice Sets the destination chain to contract address mapping
   *
   * @param destinationChain The destination chain
   * @param contractAddress The contract address on the destination chain
   *
   * @dev Chain name must come from list of supported chains
   *      at https://docs.axelar.dev/dev/reference/mainnet-chain-names
   */
  function setDestinationChainContractAddress(
    string calldata destinationChain,
    address contractAddress
  ) external onlyOwner {
    destChainToContractAddr[destinationChain] = AddressToString.toString(
      contractAddress
    );
    emit DestinationChainContractAddressSet(destinationChain, contractAddress);
  }

  /**
   * @notice Deletes an entry w/n the destination chain to contract address
   *         mapping
   *
   * @param destinationChain The destination chain to disallow
   */
  function removeDestinationChainContractAddress(
    string calldata destinationChain
  ) external onlyOwner {
    delete destChainToContractAddr[destinationChain];
    emit ChainSupportRemoved(destinationChain);
  }

  /**
   * @notice Admin function to pause the contract
   *
   * @dev Only used for bridge functions
   */
  function pause() external onlyOwner {
    _pause();
  }

  /**
   * @notice Admin function to unpause the contract
   *
   * @dev Only used for bridge functions
   */
  function unpause() external onlyOwner {
    _unpause();
  }

  /**
   * @notice Allows for arbitrary batched calls
   *
   * @dev All external calls made through this function will
   *      msg.sender == contract address
   *
   * @param exCallData Struct consisting of
   *       1) target - contract to call
   *       2) data - data to call target with
   *       3) value - eth value to call target with
   */
  function multiexcall(
    ExCallData[] calldata exCallData
  ) external payable override onlyOwner returns (bytes[] memory results) {
    results = new bytes[](exCallData.length);
    for (uint256 i = 0; i < exCallData.length; ++i) {
      (bool success, bytes memory ret) = address(exCallData[i].target).call{
        value: exCallData[i].value
      }(exCallData[i].data);
      require(success, "Call Failed");
      results[i] = ret;
    }
  }

  /*//////////////////////////////////////////////////////////////
                           Events & Errors
  //////////////////////////////////////////////////////////////*/

  /**
   * @notice Event emitted when the destination chain to contract address mapping is set
   *
   * @param destinationChain The destination chain
   * @param contractAddress The contract address on the destination chain
   */
  event DestinationChainContractAddressSet(
    string indexed destinationChain,
    address contractAddress
  );

  /**
   * @notice Event emitted when a message is passed to an Axelar gateway
   *
   * @param user    The account initiating the msg pass
   * @param nonce   The nonce of the src bridge for this msg pass
   * @param chainId The chainId of the chain which the src bridge is deployed to
   * @param version The payload version
   * @param amount  The amount field in the msg being passed
   */
  event BridgeInitiated(
    address indexed user,
    uint256 indexed nonce,
    uint256 indexed chainId,
    bytes32 version,
    uint256 amount
  );
  /**
   * @notice Event emitted when the destination chain to contract address mapping is
   *         deleted
   *
   * @param destinationChain The destination chain to be removed;
   */
  event ChainSupportRemoved(string indexed destinationChain);

  // Errors
  error DestinationNotSupported();
  error GasFeeTooLow();
  error CannotBridgeZero();
}
              

contracts/interfaces/IAxelarGasService.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// This should be owned by the microservice that is paying for gas.
interface IAxelarGasService {
  // This is called on the source chain before calling the gateway to execute a remote contract.
  function payNativeGasForContractCall(
    address sender,
    string calldata destinationChain,
    string calldata destinationAddress,
    bytes calldata payload,
    address refundAddress
  ) external payable;
}
                

contracts/interfaces/IAxelarGateway.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IAxelarGateway {
  function callContract(
    string calldata destinationChain,
    string calldata contractAddress,
    bytes calldata payload
  ) external;

  function validateContractCall(
    bytes32 commandId,
    string calldata sourceChain,
    string calldata sourceAddress,
    bytes32 payloadHash
  ) external returns (bool);

  function validateContractCallAndMint(
    bytes32 commandId,
    string calldata sourceChain,
    string calldata sourceAddress,
    bytes32 payloadHash,
    string calldata symbol,
    uint256 amount
  ) external returns (bool);
}
                

contracts/external/axelar/StringAddressUtils.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library StringToAddress {
  error InvalidAddressString();

  function toAddress(
    string memory addressString
  ) internal pure returns (address) {
    bytes memory stringBytes = bytes(addressString);
    uint160 addressNumber = 0;
    uint8 stringByte;

    if (
      stringBytes.length != 42 || stringBytes[0] != "0" || stringBytes[1] != "x"
    ) revert InvalidAddressString();

    for (uint256 i = 2; i < 42; ++i) {
      stringByte = uint8(stringBytes[i]);

      if ((stringByte >= 97) && (stringByte <= 102)) stringByte -= 87;
      else if ((stringByte >= 65) && (stringByte <= 70)) stringByte -= 55;
      else if ((stringByte >= 48) && (stringByte <= 57)) stringByte -= 48;
      else revert InvalidAddressString();

      addressNumber |= uint160(uint256(stringByte) << ((41 - i) << 2));
    }
    return address(addressNumber);
  }
}

library AddressToString {
  function toString(address addr) internal pure returns (string memory) {
    bytes memory addressBytes = abi.encodePacked(addr);
    uint256 length = addressBytes.length;
    bytes memory characters = "0123456789abcdef";
    bytes memory stringBytes = new bytes(2 + addressBytes.length * 2);

    stringBytes[0] = "0";
    stringBytes[1] = "x";

    for (uint256 i; i < length; ++i) {
      stringBytes[2 + i * 2] = characters[uint8(addressBytes[i] >> 4)];
      stringBytes[3 + i * 2] = characters[uint8(addressBytes[i] & 0x0f)];
    }
    return string(stringBytes);
  }
}
                

contracts/external/openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "contracts/external/openzeppelin/contracts/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.
 *
 * By default, the owner account will be the one that deploys the contract. 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;

  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() {
    _transferOwnership(_msgSender());
  }

  /**
   * @dev Returns the address of the current owner.
   */
  function owner() public view virtual returns (address) {
    return _owner;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(owner() == _msgSender(), "Ownable: caller is not the owner");
    _;
  }

  /**
   * @dev Leaves the contract without owner. It will not be possible to call
   * `onlyOwner` functions anymore. Can only be called by the current owner.
   *
   * NOTE: Renouncing ownership will leave the contract without an owner,
   * thereby removing any functionality that is only available to the owner.
   */
  function renounceOwnership() public virtual onlyOwner {
    _transferOwnership(address(0));
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public virtual onlyOwner {
    require(newOwner != address(0), "Ownable: new owner is the zero address");
    _transferOwnership(newOwner);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Internal function without access restriction.
   */
  function _transferOwnership(address newOwner) internal virtual {
    address oldOwner = _owner;
    _owner = newOwner;
    emit OwnershipTransferred(oldOwner, newOwner);
  }
}
                

contracts/external/openzeppelin/contracts/security/Pausable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "contracts/external/openzeppelin/contracts/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 {
  /**
   * @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);

  bool private _paused;

  /**
   * @dev Initializes the contract in unpaused state.
   */
  constructor() {
    _paused = false;
  }

  /**
   * @dev Returns true if the contract is paused, and false otherwise.
   */
  function paused() public view virtual returns (bool) {
    return _paused;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   *
   * Requirements:
   *
   * - The contract must not be paused.
   */
  modifier whenNotPaused() {
    require(!paused(), "Pausable: paused");
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   *
   * Requirements:
   *
   * - The contract must be paused.
   */
  modifier whenPaused() {
    require(paused(), "Pausable: not paused");
    _;
  }

  /**
   * @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());
  }
}
                

contracts/external/openzeppelin/contracts/token/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `from` to `to` using the
   * allowance mechanism. `amount` 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 amount
  ) external returns (bool);

  /**
   * @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);
}
                

contracts/external/openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @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;
  }
}
                

contracts/interfaces/IMulticall.sol

/**SPDX-License-Identifier: BUSL-1.1

      ā–„ā–„ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–„
   ā•“ā–ˆā–ˆā–€ā”” ,ā•“ā–„ā–„ā–„, 'ā–€ā–ˆā–ˆā–„
  ā–ˆā–ˆā–€ ā–„ā–ˆā–ˆā–€ā–€ā•™ā•™ā–€ā–€ā–ˆā–ˆā–„ ā””ā–ˆā–ˆĀµ           ,,       ,,      ,     ,,,            ,,,
 ā–ˆā–ˆ ,ā–ˆā–ˆĀ¬ ā–„ā–ˆā–ˆā–ˆā–ˆā–„  ā–€ā–ˆā–„ ā•™ā–ˆā–„      ā–„ā–ˆā–ˆā–ˆā–€ā–€ā–ˆā–ˆā–ˆā–„   ā–ˆā–ˆā–ˆā–„    ā–ˆā–ˆ  ā–ˆā–ˆā–ˆā–€ā–€ā–€ā–ˆā–ˆā–ˆā–„    ā–„ā–ˆā–ˆā–ˆā–€ā–€ā–ˆā–ˆā–ˆ,
ā–ˆā–ˆ  ā–ˆā–ˆ ā•’ā–ˆā–€'   ā•™ā–ˆā–Œ ā•™ā–ˆā–Œ ā–ˆā–ˆ     ā–ā–ˆā–ˆ      ā–ˆā–ˆā–ˆ  ā–ˆā–ˆā–ˆā–ˆā–ˆ,  ā–ˆā–ˆ  ā–ˆā–ˆā–Œ    ā””ā–ˆā–ˆā–Œ  ā–ˆā–ˆā–Œ     ā””ā–ˆā–ˆā–Œ
ā–ˆā–ˆ ā–ā–ˆā–Œ ā–ˆā–ˆ      ā•Ÿā–ˆ  ā–ˆā–Œ ā•Ÿā–ˆ     ā–ˆā–ˆā–Œ      ā–ā–ˆā–ˆ  ā–ˆā–ˆ ā””ā–ˆā–ˆā–ˆ ā–ˆā–ˆ  ā–ˆā–ˆā–Œ     ā•Ÿā–ˆā–ˆ jā–ˆā–ˆ       ā•Ÿā–ˆā–ˆ
ā•Ÿā–ˆ  ā–ˆā–ˆ ā•™ā–ˆā–ˆ    ā–„ā–ˆā–€ ā–ā–ˆā–Œ ā–ˆā–ˆ     ā•™ā–ˆā–ˆ      ā–ˆā–ˆā–Œ  ā–ˆā–ˆ   ā•™ā–ˆā–ˆā–ˆā–ˆ  ā–ˆā–ˆā–Œ    ā–„ā–ˆā–ˆā–€  ā–ˆā–ˆā–Œ     ,ā–ˆā–ˆā–€
 ā–ˆā–ˆ "ā–ˆā–ˆ, ā•™ā–€ā–€ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆāŒ      ā•™ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–€   ā–ˆā–ˆ     ā•™ā–ˆā–ˆ  ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–€ā–€     ā•™ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–€`
  ā–ˆā–ˆā–„ ā•™ā–€ā–ˆā–ˆā–„ā–„ā–„ā–„ā–„,,,                ¬─                                    '─¬
   ā•™ā–€ā–ˆā–ˆā–„ '╙╙╙▀▀▀▀▀▀▀▀
      ā•™ā–€ā–€ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆR⌐

 */
pragma solidity 0.8.16;

/**
 * @title IMulticall
 * @author Ondo Finance
 * @notice This interface dictates the required external functions for Ondo's
 *         multicall contract.
 */
interface IMulticall {
  /// @dev External call data structure
  struct ExCallData {
    // The contract we intend to call
    address target;
    // The encoded function data for the call
    bytes data;
    // The ether value to be sent in the call
    uint256 value;
  }

  /**
   * @notice Batches multiple function calls to different target contracts
   *         and returns the resulting data provided all calls were successful
   *
   * @dev The `msg.sender` is always the contract from which this function
   *      is being called
   *
   * @param exdata The ExCallData struct array containing the information
   *               regarding which contract to call, what data to call with,
   *               and what ether value to send along with the call
   *
   * @return results The resulting data returned from each call made
   */
  function multiexcall(
    ExCallData[] calldata exdata
  ) external payable returns (bytes[] memory results);
}
                

contracts/interfaces/IRWALike.sol

/**SPDX-License-Identifier: BUSL-1.1

      ā–„ā–„ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–„
   ā•“ā–ˆā–ˆā–€ā”” ,ā•“ā–„ā–„ā–„, 'ā–€ā–ˆā–ˆā–„
  ā–ˆā–ˆā–€ ā–„ā–ˆā–ˆā–€ā–€ā•™ā•™ā–€ā–€ā–ˆā–ˆā–„ ā””ā–ˆā–ˆĀµ           ,,       ,,      ,     ,,,            ,,,
 ā–ˆā–ˆ ,ā–ˆā–ˆĀ¬ ā–„ā–ˆā–ˆā–ˆā–ˆā–„  ā–€ā–ˆā–„ ā•™ā–ˆā–„      ā–„ā–ˆā–ˆā–ˆā–€ā–€ā–ˆā–ˆā–ˆā–„   ā–ˆā–ˆā–ˆā–„    ā–ˆā–ˆ  ā–ˆā–ˆā–ˆā–€ā–€ā–€ā–ˆā–ˆā–ˆā–„    ā–„ā–ˆā–ˆā–ˆā–€ā–€ā–ˆā–ˆā–ˆ,
ā–ˆā–ˆ  ā–ˆā–ˆ ā•’ā–ˆā–€'   ā•™ā–ˆā–Œ ā•™ā–ˆā–Œ ā–ˆā–ˆ     ā–ā–ˆā–ˆ      ā–ˆā–ˆā–ˆ  ā–ˆā–ˆā–ˆā–ˆā–ˆ,  ā–ˆā–ˆ  ā–ˆā–ˆā–Œ    ā””ā–ˆā–ˆā–Œ  ā–ˆā–ˆā–Œ     ā””ā–ˆā–ˆā–Œ
ā–ˆā–ˆ ā–ā–ˆā–Œ ā–ˆā–ˆ      ā•Ÿā–ˆ  ā–ˆā–Œ ā•Ÿā–ˆ     ā–ˆā–ˆā–Œ      ā–ā–ˆā–ˆ  ā–ˆā–ˆ ā””ā–ˆā–ˆā–ˆ ā–ˆā–ˆ  ā–ˆā–ˆā–Œ     ā•Ÿā–ˆā–ˆ jā–ˆā–ˆ       ā•Ÿā–ˆā–ˆ
ā•Ÿā–ˆ  ā–ˆā–ˆ ā•™ā–ˆā–ˆ    ā–„ā–ˆā–€ ā–ā–ˆā–Œ ā–ˆā–ˆ     ā•™ā–ˆā–ˆ      ā–ˆā–ˆā–Œ  ā–ˆā–ˆ   ā•™ā–ˆā–ˆā–ˆā–ˆ  ā–ˆā–ˆā–Œ    ā–„ā–ˆā–ˆā–€  ā–ˆā–ˆā–Œ     ,ā–ˆā–ˆā–€
 ā–ˆā–ˆ "ā–ˆā–ˆ, ā•™ā–€ā–€ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆāŒ      ā•™ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–€   ā–ˆā–ˆ     ā•™ā–ˆā–ˆ  ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–€ā–€     ā•™ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–€`
  ā–ˆā–ˆā–„ ā•™ā–€ā–ˆā–ˆā–„ā–„ā–„ā–„ā–„,,,                ¬─                                    '─¬
   ā•™ā–€ā–ˆā–ˆā–„ '╙╙╙▀▀▀▀▀▀▀▀
      ā•™ā–€ā–€ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆR⌐
 */
pragma solidity 0.8.16;

// This interface is not inherited directly by RWA, instead, it is a
// subset of functions provided by all RWA tokens that the RWA Hub
// Client uses.
import "contracts/external/openzeppelin/contracts/token/IERC20.sol";

interface IRWALike is IERC20 {
  function mint(address to, uint256 amount) external;

  function burn(uint256 amount) external;

  function burnFrom(address from, uint256 amount) external;
}
                

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":100,"enabled":true},"metadata":{"useLiteralContent":true},"libraries":{}}
                    

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_axelarGateway","internalType":"address"},{"type":"address","name":"_gasService","internalType":"address"},{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"CannotBridgeZero","inputs":[]},{"type":"error","name":"DestinationNotSupported","inputs":[]},{"type":"error","name":"GasFeeTooLow","inputs":[]},{"type":"event","name":"BridgeInitiated","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"nonce","internalType":"uint256","indexed":true},{"type":"uint256","name":"chainId","internalType":"uint256","indexed":true},{"type":"bytes32","name":"version","internalType":"bytes32","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ChainSupportRemoved","inputs":[{"type":"string","name":"destinationChain","internalType":"string","indexed":true}],"anonymous":false},{"type":"event","name":"DestinationChainContractAddressSet","inputs":[{"type":"string","name":"destinationChain","internalType":"string","indexed":true},{"type":"address","name":"contractAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IAxelarGateway"}],"name":"AXELAR_GATEWAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"CHAIN_ID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IAxelarGasService"}],"name":"GAS_RECEIVER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IRWALike"}],"name":"TOKEN","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"VERSION","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"burnAndCallAxelar","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"string","name":"destinationChain","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"destChainToContractAddr","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"bytes[]","name":"results","internalType":"bytes[]"}],"name":"multiexcall","inputs":[{"type":"tuple[]","name":"exCallData","internalType":"struct IMulticall.ExCallData[]","components":[{"type":"address","name":"target","internalType":"address"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint256","name":"value","internalType":"uint256"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonce","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeDestinationChainContractAddress","inputs":[{"type":"string","name":"destinationChain","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDestinationChainContractAddress","inputs":[{"type":"string","name":"destinationChain","internalType":"string"},{"type":"address","name":"contractAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpause","inputs":[]}]
                    

Contract Creation Code

0x6101006040523480156200001257600080fd5b5060405162001909380380620019098339810160408190526200003591620000ed565b620000403362000080565b6000805460ff60a01b191690556001600160a01b0380851660805283811660a052821660c052620000718162000080565b50504660e052506200014a9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000e857600080fd5b919050565b600080600080608085870312156200010457600080fd5b6200010f85620000d0565b93506200011f60208601620000d0565b92506200012f60408601620000d0565b91506200013f60608601620000d0565b905092959194509250565b60805160a05160c05160e051611763620001a660003960008181610238015281816106d1015261075701526000818160f40152610c4f0152600081816102cf0152610cd60152600081816101ef015261066201526117636000f3fe6080604052600436106100dd5760003560e01c80638456cb59116100855780638456cb591461021157806385e1f4d0146102265780638da5cb5b14610268578063936bffd91461027d57806398b3653c1461029d578063a59b4b3a146102bd578063affed0e0146102f1578063f2fde38b14610307578063ffa1ad741461032757600080fd5b8062f2b3ec146100e25780633297a1261461012c5780633f4ba83a1461014e5780635a3c605e146101635780635c975abb14610190578063715018a6146101b5578063771cb6a8146101ca57806382bfefc8146101dd575b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b6040516101239190611044565b60405180910390f35b34801561013857600080fd5b5061014c6101473660046110a0565b610341565b005b34801561015a57600080fd5b5061014c6103e9565b34801561016f57600080fd5b5061018361017e3660046110f7565b610422565b60405161012391906111ed565b34801561019c57600080fd5b506101a56104c7565b6040519015158152602001610123565b3480156101c157600080fd5b5061014c6104d7565b61014c6101d8366004611207565b610510565b3480156101e957600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b34801561021d57600080fd5b5061014c6107cd565b34801561023257600080fd5b5061025a7f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610123565b34801561027457600080fd5b50610116610804565b61029061028b366004611252565b610813565b60405161012391906112c6565b3480156102a957600080fd5b5061014c6102b8366004611344565b6109fd565b3480156102c957600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b3480156102fd57600080fd5b5061025a60025481565b34801561031357600080fd5b5061014c610322366004611397565b610ab6565b34801561033357600080fd5b5061025a620312e360ec1b81565b3361034a610804565b6001600160a01b0316146103795760405162461bcd60e51b8152600401610370906113b2565b60405180910390fd5b6001828260405161038b9291906113e7565b908152602001604051809103902060006103a59190610ff6565b81816040516103b59291906113e7565b604051908190038120907f158a044d8042048b13e12437e2777a46dd46a6be69ebe30470c49532a17307c290600090a25050565b336103f2610804565b6001600160a01b0316146104185760405162461bcd60e51b8152600401610370906113b2565b610420610b56565b565b805160208183018101805160018252928201919093012091528054610446906113f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610472906113f7565b80156104bf5780601f10610494576101008083540402835291602001916104bf565b820191906000526020600020905b8154815290600101906020018083116104a257829003601f168201915b505050505081565b600054600160a01b900460ff1690565b336104e0610804565b6001600160a01b0316146105065760405162461bcd60e51b8152600401610370906113b2565b6104206000610be8565b6105186104c7565b156105355760405162461bcd60e51b815260040161037090611431565b346000036105565760405163f4f7e42b60e01b815260040160405180910390fd5b826000036105775760405163d74b168d60e01b815260040160405180910390fd5b60006001838360405161058b9291906113e7565b908152602001604051809103902080546105a4906113f7565b80601f01602080910402602001604051908101604052809291908181526020018280546105d0906113f7565b801561061d5780601f106105f25761010080835404028352916020019161061d565b820191906000526020600020905b81548152906001019060200180831161060057829003601f168201915b505050505090508051600003610646576040516359f521b760e01b815260040160405180910390fd5b60405163079cc67960e41b8152336004820152602481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906379cc679090604401600060405180830381600087803b1580156106ae57600080fd5b505af11580156106c2573d6000803e3d6000fd5b505050506000620312e360ec1b7f000000000000000000000000000000000000000000000000000000000000000033876002600081548092919061070590611471565b909155506040805160208101969096528501939093526001600160a01b039091166060840152608083015260a082015260c001604051602081830303815290604052905061075584848484610c38565b7f00000000000000000000000000000000000000000000000000000000000000006001600254610785919061148a565b60408051620312e360ec1b81526020810189905233917f719ab00511e884d1ea4921ee843132435dc006b0bb7f8b67fb693b621e45bb53910160405180910390a45050505050565b336107d6610804565b6001600160a01b0316146107fc5760405162461bcd60e51b8152600401610370906113b2565b610420610d4c565b6000546001600160a01b031690565b60603361081e610804565b6001600160a01b0316146108445760405162461bcd60e51b8152600401610370906113b2565b816001600160401b0381111561085c5761085c6110e1565b60405190808252806020026020018201604052801561088f57816020015b606081526020019060019003908161087a5790505b50905060005b828110156109f6576000808585848181106108b2576108b26114a3565b90506020028101906108c491906114b9565b6108d2906020810190611397565b6001600160a01b03168686858181106108ed576108ed6114a3565b90506020028101906108ff91906114b9565b60400135878786818110610915576109156114a3565b905060200281019061092791906114b9565b6109359060208101906114d9565b6040516109439291906113e7565b60006040518083038185875af1925050503d8060008114610980576040519150601f19603f3d011682016040523d82523d6000602084013e610985565b606091505b5091509150816109c55760405162461bcd60e51b815260206004820152600b60248201526a10d85b1b0811985a5b195960aa1b6044820152606401610370565b808484815181106109d8576109d86114a3565b60200260200101819052505050806109ef90611471565b9050610895565b5092915050565b33610a06610804565b6001600160a01b031614610a2c5760405162461bcd60e51b8152600401610370906113b2565b610a3581610dac565b60018484604051610a479291906113e7565b90815260200160405180910390209081610a61919061156e565b508282604051610a729291906113e7565b60405180910390207fc78dabf274f05064c785f85d36cbaa36322ebcd04f3dd2e8723b4b8805928e2082604051610aa99190611044565b60405180910390a2505050565b33610abf610804565b6001600160a01b031614610ae55760405162461bcd60e51b8152600401610370906113b2565b6001600160a01b038116610b4a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610370565b610b5381610be8565b50565b610b5e6104c7565b610ba15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610370565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610bde9190611044565b60405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051630c93e3bb60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630c93e3bb903490610c9090309089908990899089903390600401611656565b6000604051808303818588803b158015610ca957600080fd5b505af1158015610cbd573d6000803e3d6000fd5b5050604051631c92115f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350631c92115f9250610d14915087908790879087906004016116b6565b600060405180830381600087803b158015610d2e57600080fd5b505af1158015610d42573d6000803e3d6000fd5b5050505050505050565b610d546104c7565b15610d715760405162461bcd60e51b815260040161037090611431565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610bd13390565b604051606082811b6bffffffffffffffffffffffff191660208301529060009060340160408051601f198184030181528282528051838301909252601083526f181899199a1a9b1b9c1cb0b131b232b360811b60208401528051909350909190600090610e1a9060026116fb565b610e2590600261171a565b6001600160401b03811115610e3c57610e3c6110e1565b6040519080825280601f01601f191660200182016040528015610e66576020820181803683370190505b509050600360fc1b81600081518110610e8157610e816114a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610eb057610eb06114a3565b60200101906001600160f81b031916908160001a90535060005b83811015610fec57826004868381518110610ee757610ee76114a3565b016020015182516001600160f81b031990911690911c60f81c908110610f0f57610f0f6114a3565b01602001516001600160f81b03191682610f2a8360026116fb565b610f3590600261171a565b81518110610f4557610f456114a3565b60200101906001600160f81b031916908160001a90535082858281518110610f6f57610f6f6114a3565b602091010151815160f89190911c600f16908110610f8f57610f8f6114a3565b01602001516001600160f81b03191682610faa8360026116fb565b610fb590600361171a565b81518110610fc557610fc56114a3565b60200101906001600160f81b031916908160001a905350610fe581611471565b9050610eca565b5095945050505050565b508054611002906113f7565b6000825580601f10611012575050565b601f016020900490600052602060002090810190610b5391905b80821115611040576000815560010161102c565b5090565b6001600160a01b0391909116815260200190565b60008083601f84011261106a57600080fd5b5081356001600160401b0381111561108157600080fd5b60208301915083602082850101111561109957600080fd5b9250929050565b600080602083850312156110b357600080fd5b82356001600160401b038111156110c957600080fd5b6110d585828601611058565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561110957600080fd5b81356001600160401b038082111561112057600080fd5b818401915084601f83011261113457600080fd5b813581811115611146576111466110e1565b604051601f8201601f19908116603f0116810190838211818310171561116e5761116e6110e1565b8160405282815287602084870101111561118757600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000815180845260005b818110156111cd576020818501810151868301820152016111b1565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061120060208301846111a7565b9392505050565b60008060006040848603121561121c57600080fd5b8335925060208401356001600160401b0381111561123957600080fd5b61124586828701611058565b9497909650939450505050565b6000806020838503121561126557600080fd5b82356001600160401b038082111561127c57600080fd5b818501915085601f83011261129057600080fd5b81358181111561129f57600080fd5b8660208260051b85010111156112b457600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561131b57603f198886030184526113098583516111a7565b945092850192908501906001016112ed565b5092979650505050505050565b80356001600160a01b038116811461133f57600080fd5b919050565b60008060006040848603121561135957600080fd5b83356001600160401b0381111561136f57600080fd5b61137b86828701611058565b909450925061138e905060208501611328565b90509250925092565b6000602082840312156113a957600080fd5b61120082611328565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8183823760009101908152919050565b600181811c9082168061140b57607f821691505b60208210810361142b57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016114835761148361145b565b5060010190565b8181038181111561149d5761149d61145b565b92915050565b634e487b7160e01b600052603260045260246000fd5b60008235605e198336030181126114cf57600080fd5b9190910192915050565b6000808335601e198436030181126114f057600080fd5b8301803591506001600160401b0382111561150a57600080fd5b60200191503681900382131561109957600080fd5b601f82111561156957600081815260208120601f850160051c810160208610156115465750805b601f850160051c820191505b8181101561156557828155600101611552565b5050505b505050565b81516001600160401b03811115611587576115876110e1565b61159b8161159584546113f7565b8461151f565b602080601f8311600181146115d057600084156115b85750858301515b600019600386901b1c1916600185901b178555611565565b600085815260208120601f198616915b828110156115ff578886015182559484019460019091019084016115e0565b508582101561161d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600060018060a01b03808916835260a0602084015261167960a08401888a61162d565b838103604085015261168b81886111a7565b9050838103606085015261169f81876111a7565b925050808416608084015250979650505050505050565b6060815260006116ca60608301868861162d565b82810360208401526116dc81866111a7565b905082810360408401526116f081856111a7565b979650505050505050565b60008160001904831182151516156117155761171561145b565b500290565b8082018082111561149d5761149d61145b56fea264697066735822122006206d2119fb6d36ddb9db76db97a5ca460acc5a04b74e5c6d40891015ba772e64736f6c634300081000330000000000000000000000005be26527e817998a7206475496fde1e68957c5a6000000000000000000000000e432150cce91c13a887f7d836923d5597add8e310000000000000000000000002d5d7d31f671f86c782533cc367f14109a082712000000000000000000000000c8a7870ffe41054612f7f3433e173d8b5bfca8e3

Deployed ByteCode

0x6080604052600436106100dd5760003560e01c80638456cb59116100855780638456cb591461021157806385e1f4d0146102265780638da5cb5b14610268578063936bffd91461027d57806398b3653c1461029d578063a59b4b3a146102bd578063affed0e0146102f1578063f2fde38b14610307578063ffa1ad741461032757600080fd5b8062f2b3ec146100e25780633297a1261461012c5780633f4ba83a1461014e5780635a3c605e146101635780635c975abb14610190578063715018a6146101b5578063771cb6a8146101ca57806382bfefc8146101dd575b600080fd5b3480156100ee57600080fd5b506101167f0000000000000000000000002d5d7d31f671f86c782533cc367f14109a08271281565b6040516101239190611044565b60405180910390f35b34801561013857600080fd5b5061014c6101473660046110a0565b610341565b005b34801561015a57600080fd5b5061014c6103e9565b34801561016f57600080fd5b5061018361017e3660046110f7565b610422565b60405161012391906111ed565b34801561019c57600080fd5b506101a56104c7565b6040519015158152602001610123565b3480156101c157600080fd5b5061014c6104d7565b61014c6101d8366004611207565b610510565b3480156101e957600080fd5b506101167f0000000000000000000000005be26527e817998a7206475496fde1e68957c5a681565b34801561021d57600080fd5b5061014c6107cd565b34801561023257600080fd5b5061025a7f000000000000000000000000000000000000000000000000000000000000138881565b604051908152602001610123565b34801561027457600080fd5b50610116610804565b61029061028b366004611252565b610813565b60405161012391906112c6565b3480156102a957600080fd5b5061014c6102b8366004611344565b6109fd565b3480156102c957600080fd5b506101167f000000000000000000000000e432150cce91c13a887f7d836923d5597add8e3181565b3480156102fd57600080fd5b5061025a60025481565b34801561031357600080fd5b5061014c610322366004611397565b610ab6565b34801561033357600080fd5b5061025a620312e360ec1b81565b3361034a610804565b6001600160a01b0316146103795760405162461bcd60e51b8152600401610370906113b2565b60405180910390fd5b6001828260405161038b9291906113e7565b908152602001604051809103902060006103a59190610ff6565b81816040516103b59291906113e7565b604051908190038120907f158a044d8042048b13e12437e2777a46dd46a6be69ebe30470c49532a17307c290600090a25050565b336103f2610804565b6001600160a01b0316146104185760405162461bcd60e51b8152600401610370906113b2565b610420610b56565b565b805160208183018101805160018252928201919093012091528054610446906113f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610472906113f7565b80156104bf5780601f10610494576101008083540402835291602001916104bf565b820191906000526020600020905b8154815290600101906020018083116104a257829003601f168201915b505050505081565b600054600160a01b900460ff1690565b336104e0610804565b6001600160a01b0316146105065760405162461bcd60e51b8152600401610370906113b2565b6104206000610be8565b6105186104c7565b156105355760405162461bcd60e51b815260040161037090611431565b346000036105565760405163f4f7e42b60e01b815260040160405180910390fd5b826000036105775760405163d74b168d60e01b815260040160405180910390fd5b60006001838360405161058b9291906113e7565b908152602001604051809103902080546105a4906113f7565b80601f01602080910402602001604051908101604052809291908181526020018280546105d0906113f7565b801561061d5780601f106105f25761010080835404028352916020019161061d565b820191906000526020600020905b81548152906001019060200180831161060057829003601f168201915b505050505090508051600003610646576040516359f521b760e01b815260040160405180910390fd5b60405163079cc67960e41b8152336004820152602481018590527f0000000000000000000000005be26527e817998a7206475496fde1e68957c5a66001600160a01b0316906379cc679090604401600060405180830381600087803b1580156106ae57600080fd5b505af11580156106c2573d6000803e3d6000fd5b505050506000620312e360ec1b7f000000000000000000000000000000000000000000000000000000000000138833876002600081548092919061070590611471565b909155506040805160208101969096528501939093526001600160a01b039091166060840152608083015260a082015260c001604051602081830303815290604052905061075584848484610c38565b7f00000000000000000000000000000000000000000000000000000000000013886001600254610785919061148a565b60408051620312e360ec1b81526020810189905233917f719ab00511e884d1ea4921ee843132435dc006b0bb7f8b67fb693b621e45bb53910160405180910390a45050505050565b336107d6610804565b6001600160a01b0316146107fc5760405162461bcd60e51b8152600401610370906113b2565b610420610d4c565b6000546001600160a01b031690565b60603361081e610804565b6001600160a01b0316146108445760405162461bcd60e51b8152600401610370906113b2565b816001600160401b0381111561085c5761085c6110e1565b60405190808252806020026020018201604052801561088f57816020015b606081526020019060019003908161087a5790505b50905060005b828110156109f6576000808585848181106108b2576108b26114a3565b90506020028101906108c491906114b9565b6108d2906020810190611397565b6001600160a01b03168686858181106108ed576108ed6114a3565b90506020028101906108ff91906114b9565b60400135878786818110610915576109156114a3565b905060200281019061092791906114b9565b6109359060208101906114d9565b6040516109439291906113e7565b60006040518083038185875af1925050503d8060008114610980576040519150601f19603f3d011682016040523d82523d6000602084013e610985565b606091505b5091509150816109c55760405162461bcd60e51b815260206004820152600b60248201526a10d85b1b0811985a5b195960aa1b6044820152606401610370565b808484815181106109d8576109d86114a3565b60200260200101819052505050806109ef90611471565b9050610895565b5092915050565b33610a06610804565b6001600160a01b031614610a2c5760405162461bcd60e51b8152600401610370906113b2565b610a3581610dac565b60018484604051610a479291906113e7565b90815260200160405180910390209081610a61919061156e565b508282604051610a729291906113e7565b60405180910390207fc78dabf274f05064c785f85d36cbaa36322ebcd04f3dd2e8723b4b8805928e2082604051610aa99190611044565b60405180910390a2505050565b33610abf610804565b6001600160a01b031614610ae55760405162461bcd60e51b8152600401610370906113b2565b6001600160a01b038116610b4a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610370565b610b5381610be8565b50565b610b5e6104c7565b610ba15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610370565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610bde9190611044565b60405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051630c93e3bb60e01b81526001600160a01b037f0000000000000000000000002d5d7d31f671f86c782533cc367f14109a0827121690630c93e3bb903490610c9090309089908990899089903390600401611656565b6000604051808303818588803b158015610ca957600080fd5b505af1158015610cbd573d6000803e3d6000fd5b5050604051631c92115f60e01b81526001600160a01b037f000000000000000000000000e432150cce91c13a887f7d836923d5597add8e31169350631c92115f9250610d14915087908790879087906004016116b6565b600060405180830381600087803b158015610d2e57600080fd5b505af1158015610d42573d6000803e3d6000fd5b5050505050505050565b610d546104c7565b15610d715760405162461bcd60e51b815260040161037090611431565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610bd13390565b604051606082811b6bffffffffffffffffffffffff191660208301529060009060340160408051601f198184030181528282528051838301909252601083526f181899199a1a9b1b9c1cb0b131b232b360811b60208401528051909350909190600090610e1a9060026116fb565b610e2590600261171a565b6001600160401b03811115610e3c57610e3c6110e1565b6040519080825280601f01601f191660200182016040528015610e66576020820181803683370190505b509050600360fc1b81600081518110610e8157610e816114a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610eb057610eb06114a3565b60200101906001600160f81b031916908160001a90535060005b83811015610fec57826004868381518110610ee757610ee76114a3565b016020015182516001600160f81b031990911690911c60f81c908110610f0f57610f0f6114a3565b01602001516001600160f81b03191682610f2a8360026116fb565b610f3590600261171a565b81518110610f4557610f456114a3565b60200101906001600160f81b031916908160001a90535082858281518110610f6f57610f6f6114a3565b602091010151815160f89190911c600f16908110610f8f57610f8f6114a3565b01602001516001600160f81b03191682610faa8360026116fb565b610fb590600361171a565b81518110610fc557610fc56114a3565b60200101906001600160f81b031916908160001a905350610fe581611471565b9050610eca565b5095945050505050565b508054611002906113f7565b6000825580601f10611012575050565b601f016020900490600052602060002090810190610b5391905b80821115611040576000815560010161102c565b5090565b6001600160a01b0391909116815260200190565b60008083601f84011261106a57600080fd5b5081356001600160401b0381111561108157600080fd5b60208301915083602082850101111561109957600080fd5b9250929050565b600080602083850312156110b357600080fd5b82356001600160401b038111156110c957600080fd5b6110d585828601611058565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561110957600080fd5b81356001600160401b038082111561112057600080fd5b818401915084601f83011261113457600080fd5b813581811115611146576111466110e1565b604051601f8201601f19908116603f0116810190838211818310171561116e5761116e6110e1565b8160405282815287602084870101111561118757600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000815180845260005b818110156111cd576020818501810151868301820152016111b1565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061120060208301846111a7565b9392505050565b60008060006040848603121561121c57600080fd5b8335925060208401356001600160401b0381111561123957600080fd5b61124586828701611058565b9497909650939450505050565b6000806020838503121561126557600080fd5b82356001600160401b038082111561127c57600080fd5b818501915085601f83011261129057600080fd5b81358181111561129f57600080fd5b8660208260051b85010111156112b457600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561131b57603f198886030184526113098583516111a7565b945092850192908501906001016112ed565b5092979650505050505050565b80356001600160a01b038116811461133f57600080fd5b919050565b60008060006040848603121561135957600080fd5b83356001600160401b0381111561136f57600080fd5b61137b86828701611058565b909450925061138e905060208501611328565b90509250925092565b6000602082840312156113a957600080fd5b61120082611328565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8183823760009101908152919050565b600181811c9082168061140b57607f821691505b60208210810361142b57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016114835761148361145b565b5060010190565b8181038181111561149d5761149d61145b565b92915050565b634e487b7160e01b600052603260045260246000fd5b60008235605e198336030181126114cf57600080fd5b9190910192915050565b6000808335601e198436030181126114f057600080fd5b8301803591506001600160401b0382111561150a57600080fd5b60200191503681900382131561109957600080fd5b601f82111561156957600081815260208120601f850160051c810160208610156115465750805b601f850160051c820191505b8181101561156557828155600101611552565b5050505b505050565b81516001600160401b03811115611587576115876110e1565b61159b8161159584546113f7565b8461151f565b602080601f8311600181146115d057600084156115b85750858301515b600019600386901b1c1916600185901b178555611565565b600085815260208120601f198616915b828110156115ff578886015182559484019460019091019084016115e0565b508582101561161d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600060018060a01b03808916835260a0602084015261167960a08401888a61162d565b838103604085015261168b81886111a7565b9050838103606085015261169f81876111a7565b925050808416608084015250979650505050505050565b6060815260006116ca60608301868861162d565b82810360208401526116dc81866111a7565b905082810360408401526116f081856111a7565b979650505050505050565b60008160001904831182151516156117155761171561145b565b500290565b8082018082111561149d5761149d61145b56fea264697066735822122006206d2119fb6d36ddb9db76db97a5ca460acc5a04b74e5c6d40891015ba772e64736f6c63430008100033
Loading...
Loading...