Contract 0xE8Bf8fe5ce9e15D30F478E1647A57CB6B0271228

Contract Overview

Balance:
0 Ether
Txn Hash Method
Block
From
To
Value
0xfa3340f2471a3fcd50e07ac4a0a106cb71e48e91f8a8ef56ca6314808a8ebd24Accept Ownership246589312021-05-04 23:07:0813 days 20 hrs ago0x73570075092502472e4b61a7058df1a4a1db12f2 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0000659973
0xbbff7304daf07274307cb121ec801d27ea8fd53934c550a515d6df2a1032850dNominate New Own...246588752021-05-04 23:03:2413 days 20 hrs ago0x73570075092502472e4b61a7058df1a4a1db12f2 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0000448281
0x53b97f6abe068acfbb235f47eed894ed04818f2061495c1aee0a411847d246feAccept Ownership243400812021-04-19 23:15:5628 days 20 hrs ago0x73570075092502472e4b61a7058df1a4a1db12f2 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0000219991
0x534891333ec2b76c4acb9c5b6da49a0b2b7d5d17b0c6656c5f528260d72a7f33Nominate New Own...243383642021-04-19 21:19:5628 days 22 hrs ago0xb64ff7a4a33acdf48d97dab0d764afd0f6176882 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0000448161
0x47ced3832ad3ba355987f403109bf3805ee6c16d92f00c5f777f3271138c6121Initiate Deposit242729152021-04-15 23:26:2032 days 20 hrs ago0x1814d7b59c497cc0095948fe4672b2231234bd5b IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.003568910
0x56e4bafb96bf56b8f0d1ec9882989458871fe97c57bc554421f7c390f795b8b3Initiate Deposit242052492021-04-09 17:56:2039 days 1 hr ago0x68bf577920d6607c52114cb5e13696a19c2c9efa IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0006837562
0x289450291cad1ffb1cabddaea0e104402843cf040800869acdb158655dfe2654Initiate Deposit242052142021-04-09 17:51:4039 days 1 hr ago0xb64ff7a4a33acdf48d97dab0d764afd0f6176882 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0000571981
0xf58f27da832c27b29e4f1ee2953b62cce9e3c034c644b6bbde1b510cedfbd2b2Rebuild Cache242051802021-04-09 17:42:5239 days 1 hr ago0xb64ff7a4a33acdf48d97dab0d764afd0f6176882 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0009982510
0xa3f7071505dc25480ece3e783106458672a0c7ef2b79581ae2586dce806bde32Initiate Deposit242021292021-04-09 7:35:0839 days 12 hrs ago0x32a1f43c198772c9529924d0eeeeab521c535ff1 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.036672178109
0x456b6b6829c8b32c98c0586a4fda22abf9bd98b5067912841748d5c797c8c52aInitiate Deposit242018192021-04-09 6:48:0439 days 12 hrs ago0x32a1f43c198772c9529924d0eeeeab521c535ff1 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0269153680
0x8da92b5ca725c595fab0a4cd0e12d50b1461298154a0a2573cea57874a6bdcf4Initiate Deposit241998832021-04-09 1:16:5239 days 18 hrs ago0x32a1f43c198772c9529924d0eeeeab521c535ff1 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0319619995
0x168a684b9b16bbcfdbd1e2c562623eedf09f22bf9addba54a3ac1adb401e6357Initiate Deposit241731102021-04-06 8:48:4442 days 10 hrs ago0x28ef2d65f77e2f51752776c53fc341980ed746b2 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.042051609123
0xe52a1cf76f83251aa8e90cd00cf24a3daa7f4fa07cf64a3db6974973d02fba49Initiate Deposit241577842021-04-04 20:57:4043 days 22 hrs ago0x92e754de771835cb0772d4d82e62654c52de0385 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.03179511993
0xc609984170365f3283f8e7dec8095cddd6208214fb2bbc897ac680b69c3a0b4cInitiate Deposit241266422021-04-01 19:12:1247 days 26 mins ago0x92e754de771835cb0772d4d82e62654c52de0385 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.05469936160
0x850b6c918bfe90baed2201f0418f25fb225e977377261cf4e621a77139a91d89Initiate Deposit241087762021-03-31 2:07:5648 days 17 hrs ago0x9697aaec8c09f5e39998621fe82cf818077bbb09 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.046834683137
0x1ee7d144adf80b31b643b1ddb7bf56bf232166e2897e5172970e67e38a0bb063Initiate Escrow ...241067782021-03-30 21:31:5648 days 22 hrs ago0x8dd7b3223b9c2f18b0f4b4108ed2a506f824b1ce IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.068372096136
0x3335383b962df785bd470b896ee4c5e6872b4c0e7b37e946d3ae7ad28439bee7Initiate Deposit241063662021-03-30 20:37:0048 days 23 hrs ago0x8dd7b3223b9c2f18b0f4b4108ed2a506f824b1ce IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.048205503141
0xef4e52f65004366dc5f0616103805b2f9452e3d147de5c72058104d539c8bbf4Initiate Deposit241000622021-03-30 6:21:4849 days 13 hrs ago0x28ee755c0468ef579b68871643f4fcf1a2d33feb IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.03350100698
0xf1085281e119dd42f7d95226e7d8a1528450b7c64bf788a8e6b13fd33d82c219Initiate Deposit241000182021-03-30 6:15:5649 days 13 hrs ago0x28ee755c0468ef579b68871643f4fcf1a2d33feb IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.035211477103
0xcd4940d0a1916d766841a94d17b2315c010444cd06e5692426558eeec9514b59Initiate Deposit240900762021-03-29 6:50:4450 days 12 hrs ago0x28ee755c0468ef579b68871643f4fcf1a2d33feb IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.03350218298
0x7631dd3a38b4507593b9eb559ccf5a80b646c788a809d1580891b80b44cb3a47Initiate Deposit240642022021-03-26 20:39:4852 days 22 hrs ago0x68bf577920d6607c52114cb5e13696a19c2c9efa IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0003568111
0xa0a7f6956ce36c73bb6aea736b56a661cec28587bad23bb6f2d6fc21cad16b3dInitiate Deposit240631332021-03-26 18:16:3653 days 1 hr ago0xf5a701d13be654a534d14de8cd6a328293712405 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.051624333151
0x18b0942ba179174d2f2bfe36d3d411651f8189740c963ba9c76f4a9944e9758fInitiate Deposit240630032021-03-26 17:59:1653 days 1 hr ago0x68bf577920d6607c52114cb5e13696a19c2c9efa IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0000593921
0x3a8e160f5de29df0d4c230817d435b58acc1ec6021096b70fad3120c699a24c5Initiate Deposit240629482021-03-26 17:51:5653 days 1 hr ago0xb64ff7a4a33acdf48d97dab0d764afd0f6176882 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0000572041
0x8f2208fe51df36583403bbdb6316ae0b3b0d6625029b6d7ab611526f36159938Rebuild Cache240629212021-03-26 17:48:2053 days 1 hr ago0xb64ff7a4a33acdf48d97dab0d764afd0f6176882 IN  0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether0.0000956251
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xb598828332473b109ccb45cb38421df4b12abda92602036791b654fa3d6daf83246589292021-05-04 23:07:0013 days 20 hrs ago 0x5f0ccabe97bf838c777f08702e17ec300ff78cd0 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0xb598828332473b109ccb45cb38421df4b12abda92602036791b654fa3d6daf83246589292021-05-04 23:07:0013 days 20 hrs ago 0x5f0ccabe97bf838c777f08702e17ec300ff78cd0 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0xb598828332473b109ccb45cb38421df4b12abda92602036791b654fa3d6daf83246589292021-05-04 23:07:0013 days 20 hrs ago 0x5f0ccabe97bf838c777f08702e17ec300ff78cd0 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0xb598828332473b109ccb45cb38421df4b12abda92602036791b654fa3d6daf83246589292021-05-04 23:07:0013 days 20 hrs ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x07acc2b253218535c21a3e57bcb81eb13345a34a0 Ether
0xb598828332473b109ccb45cb38421df4b12abda92602036791b654fa3d6daf83246589292021-05-04 23:07:0013 days 20 hrs ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x07acc2b253218535c21a3e57bcb81eb13345a34a0 Ether
0xb598828332473b109ccb45cb38421df4b12abda92602036791b654fa3d6daf83246589292021-05-04 23:07:0013 days 20 hrs ago 0x5f0ccabe97bf838c777f08702e17ec300ff78cd0 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0xb598828332473b109ccb45cb38421df4b12abda92602036791b654fa3d6daf83246589292021-05-04 23:07:0013 days 20 hrs ago 0x5f0ccabe97bf838c777f08702e17ec300ff78cd0 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0xb598828332473b109ccb45cb38421df4b12abda92602036791b654fa3d6daf83246589292021-05-04 23:07:0013 days 20 hrs ago 0x5f0ccabe97bf838c777f08702e17ec300ff78cd0 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0xb598828332473b109ccb45cb38421df4b12abda92602036791b654fa3d6daf83246589292021-05-04 23:07:0013 days 20 hrs ago 0x5f0ccabe97bf838c777f08702e17ec300ff78cd0 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0xb598828332473b109ccb45cb38421df4b12abda92602036791b654fa3d6daf83246589292021-05-04 23:07:0013 days 20 hrs ago 0x5f0ccabe97bf838c777f08702e17ec300ff78cd0 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0xd3f58af74662523483acb0d3b130e2025583104591097df54a5d65a31a332984245709612021-04-30 20:01:4817 days 23 hrs ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x07acc2b253218535c21a3e57bcb81eb13345a34a0 Ether
0xd3f58af74662523483acb0d3b130e2025583104591097df54a5d65a31a332984245709612021-04-30 20:01:4817 days 23 hrs ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x48062ed9b6488ec41c4cfbf2f568d7773819d8c90 Ether
0xd3f58af74662523483acb0d3b130e2025583104591097df54a5d65a31a332984245709612021-04-30 20:01:4817 days 23 hrs ago 0x48062ed9b6488ec41c4cfbf2f568d7773819d8c9 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0x47ced3832ad3ba355987f403109bf3805ee6c16d92f00c5f777f3271138c6121242729152021-04-15 23:26:2032 days 20 hrs ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x48062ed9b6488ec41c4cfbf2f568d7773819d8c90 Ether
0x47ced3832ad3ba355987f403109bf3805ee6c16d92f00c5f777f3271138c6121242729152021-04-15 23:26:2032 days 20 hrs ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0xb1751e5ede811288ce2fc4c65aaca17a955366be0 Ether
0x47ced3832ad3ba355987f403109bf3805ee6c16d92f00c5f777f3271138c6121242729152021-04-15 23:26:2032 days 20 hrs ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x07acc2b253218535c21a3e57bcb81eb13345a34a0 Ether
0x47ced3832ad3ba355987f403109bf3805ee6c16d92f00c5f777f3271138c6121242729152021-04-15 23:26:2032 days 20 hrs ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x2709b3568a79d7e00d6729e96b84a1996cdb89ef0 Ether
0xd1ad8c8340b8905d52d9a070a71cf326f9145ed66de525948937109649f89acd242053272021-04-09 18:06:4439 days 1 hr ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x07acc2b253218535c21a3e57bcb81eb13345a34a0 Ether
0xd1ad8c8340b8905d52d9a070a71cf326f9145ed66de525948937109649f89acd242053272021-04-09 18:06:4439 days 1 hr ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x48062ed9b6488ec41c4cfbf2f568d7773819d8c90 Ether
0xd1ad8c8340b8905d52d9a070a71cf326f9145ed66de525948937109649f89acd242053272021-04-09 18:06:4439 days 1 hr ago 0x48062ed9b6488ec41c4cfbf2f568d7773819d8c9 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0xec68cde33b61c672e0a740a88ea7c849856403b01a1d803a09bf775e25085f99242053042021-04-09 18:03:4039 days 1 hr ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x07acc2b253218535c21a3e57bcb81eb13345a34a0 Ether
0xec68cde33b61c672e0a740a88ea7c849856403b01a1d803a09bf775e25085f99242053042021-04-09 18:03:4039 days 1 hr ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x48062ed9b6488ec41c4cfbf2f568d7773819d8c90 Ether
0xec68cde33b61c672e0a740a88ea7c849856403b01a1d803a09bf775e25085f99242053042021-04-09 18:03:4039 days 1 hr ago 0x48062ed9b6488ec41c4cfbf2f568d7773819d8c9 0xe8bf8fe5ce9e15d30f478e1647a57cb6b02712280 Ether
0x56e4bafb96bf56b8f0d1ec9882989458871fe97c57bc554421f7c390f795b8b3242052492021-04-09 17:56:2039 days 1 hr ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0x48062ed9b6488ec41c4cfbf2f568d7773819d8c90 Ether
0x56e4bafb96bf56b8f0d1ec9882989458871fe97c57bc554421f7c390f795b8b3242052492021-04-09 17:56:2039 days 1 hr ago 0xe8bf8fe5ce9e15d30f478e1647a57cb6b0271228 0xb1751e5ede811288ce2fc4c65aaca17a955366be0 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SynthetixBridgeToOptimism

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-14
*/

/*
   ____            __   __        __   _
  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __
 _\ \ / // // _ \/ __// _ \/ -_)/ __// / \ \ /
/___/ \_, //_//_/\__//_//_/\__/ \__//_/ /_\_\
     /___/

* Synthetix: SynthetixBridgeToOptimism.sol
*
* Latest source (may be newer): https://github.com/Synthetixio/synthetix/blob/master/contracts/SynthetixBridgeToOptimism.sol
* Docs: https://docs.synthetix.io/contracts/SynthetixBridgeToOptimism
*
* Contract Dependencies: 
*	- IAddressResolver
*	- ISynthetixBridgeToOptimism
*	- MixinResolver
*	- MixinSystemSettings
*	- Owned
* Libraries: 
*	- VestingEntries
*
* MIT License
* ===========
*
* Copyright (c) 2021 Synthetix
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
*/



pragma solidity ^0.5.16;


// https://docs.synthetix.io/contracts/source/contracts/owned
contract Owned {
    address public owner;
    address public nominatedOwner;

    constructor(address _owner) public {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner {
        _onlyOwner();
        _;
    }

    function _onlyOwner() private view {
        require(msg.sender == owner, "Only the contract owner may perform this action");
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}


// https://docs.synthetix.io/contracts/source/interfaces/iaddressresolver
interface IAddressResolver {
    function getAddress(bytes32 name) external view returns (address);

    function getSynth(bytes32 key) external view returns (address);

    function requireAndGetAddress(bytes32 name, string calldata reason) external view returns (address);
}


// https://docs.synthetix.io/contracts/source/interfaces/isynth
interface ISynth {
    // Views
    function currencyKey() external view returns (bytes32);

    function transferableSynths(address account) external view returns (uint);

    // Mutative functions
    function transferAndSettle(address to, uint value) external returns (bool);

    function transferFromAndSettle(
        address from,
        address to,
        uint value
    ) external returns (bool);

    // Restricted: used internally to Synthetix
    function burn(address account, uint amount) external;

    function issue(address account, uint amount) external;
}


// https://docs.synthetix.io/contracts/source/interfaces/iissuer
interface IIssuer {
    // Views
    function anySynthOrSNXRateIsInvalid() external view returns (bool anyRateInvalid);

    function availableCurrencyKeys() external view returns (bytes32[] memory);

    function availableSynthCount() external view returns (uint);

    function availableSynths(uint index) external view returns (ISynth);

    function canBurnSynths(address account) external view returns (bool);

    function collateral(address account) external view returns (uint);

    function collateralisationRatio(address issuer) external view returns (uint);

    function collateralisationRatioAndAnyRatesInvalid(address _issuer)
        external
        view
        returns (uint cratio, bool anyRateIsInvalid);

    function debtBalanceOf(address issuer, bytes32 currencyKey) external view returns (uint debtBalance);

    function issuanceRatio() external view returns (uint);

    function lastIssueEvent(address account) external view returns (uint);

    function maxIssuableSynths(address issuer) external view returns (uint maxIssuable);

    function minimumStakeTime() external view returns (uint);

    function remainingIssuableSynths(address issuer)
        external
        view
        returns (
            uint maxIssuable,
            uint alreadyIssued,
            uint totalSystemDebt
        );

    function synths(bytes32 currencyKey) external view returns (ISynth);

    function getSynths(bytes32[] calldata currencyKeys) external view returns (ISynth[] memory);

    function synthsByAddress(address synthAddress) external view returns (bytes32);

    function totalIssuedSynths(bytes32 currencyKey, bool excludeEtherCollateral) external view returns (uint);

    function transferableSynthetixAndAnyRateIsInvalid(address account, uint balance)
        external
        view
        returns (uint transferable, bool anyRateIsInvalid);

    // Restricted: used internally to Synthetix
    function issueSynths(address from, uint amount) external;

    function issueSynthsOnBehalf(
        address issueFor,
        address from,
        uint amount
    ) external;

    function issueMaxSynths(address from) external;

    function issueMaxSynthsOnBehalf(address issueFor, address from) external;

    function burnSynths(address from, uint amount) external;

    function burnSynthsOnBehalf(
        address burnForAddress,
        address from,
        uint amount
    ) external;

    function burnSynthsToTarget(address from) external;

    function burnSynthsToTargetOnBehalf(address burnForAddress, address from) external;

    function liquidateDelinquentAccount(
        address account,
        uint susdAmount,
        address liquidator
    ) external returns (uint totalRedeemed, uint amountToLiquidate);
}


// Inheritance


// Internal references


// https://docs.synthetix.io/contracts/source/contracts/addressresolver
contract AddressResolver is Owned, IAddressResolver {
    mapping(bytes32 => address) public repository;

    constructor(address _owner) public Owned(_owner) {}

    /* ========== RESTRICTED FUNCTIONS ========== */

    function importAddresses(bytes32[] calldata names, address[] calldata destinations) external onlyOwner {
        require(names.length == destinations.length, "Input lengths must match");

        for (uint i = 0; i < names.length; i++) {
            bytes32 name = names[i];
            address destination = destinations[i];
            repository[name] = destination;
            emit AddressImported(name, destination);
        }
    }

    /* ========= PUBLIC FUNCTIONS ========== */

    function rebuildCaches(MixinResolver[] calldata destinations) external {
        for (uint i = 0; i < destinations.length; i++) {
            destinations[i].rebuildCache();
        }
    }

    /* ========== VIEWS ========== */

    function areAddressesImported(bytes32[] calldata names, address[] calldata destinations) external view returns (bool) {
        for (uint i = 0; i < names.length; i++) {
            if (repository[names[i]] != destinations[i]) {
                return false;
            }
        }
        return true;
    }

    function getAddress(bytes32 name) external view returns (address) {
        return repository[name];
    }

    function requireAndGetAddress(bytes32 name, string calldata reason) external view returns (address) {
        address _foundAddress = repository[name];
        require(_foundAddress != address(0), reason);
        return _foundAddress;
    }

    function getSynth(bytes32 key) external view returns (address) {
        IIssuer issuer = IIssuer(repository["Issuer"]);
        require(address(issuer) != address(0), "Cannot find Issuer address");
        return address(issuer.synths(key));
    }

    /* ========== EVENTS ========== */

    event AddressImported(bytes32 name, address destination);
}


// solhint-disable payable-fallback

// https://docs.synthetix.io/contracts/source/contracts/readproxy
contract ReadProxy is Owned {
    address public target;

    constructor(address _owner) public Owned(_owner) {}

    function setTarget(address _target) external onlyOwner {
        target = _target;
        emit TargetUpdated(target);
    }

    function() external {
        // The basics of a proxy read call
        // Note that msg.sender in the underlying will always be the address of this contract.
        assembly {
            calldatacopy(0, 0, calldatasize)

            // Use of staticcall - this will revert if the underlying function mutates state
            let result := staticcall(gas, sload(target_slot), 0, calldatasize, 0, 0)
            returndatacopy(0, 0, returndatasize)

            if iszero(result) {
                revert(0, returndatasize)
            }
            return(0, returndatasize)
        }
    }

    event TargetUpdated(address newTarget);
}


// Inheritance


// Internal references


// https://docs.synthetix.io/contracts/source/contracts/mixinresolver
contract MixinResolver {
    AddressResolver public resolver;

    mapping(bytes32 => address) private addressCache;

    constructor(address _resolver) internal {
        resolver = AddressResolver(_resolver);
    }

    /* ========== INTERNAL FUNCTIONS ========== */

    function combineArrays(bytes32[] memory first, bytes32[] memory second)
        internal
        pure
        returns (bytes32[] memory combination)
    {
        combination = new bytes32[](first.length + second.length);

        for (uint i = 0; i < first.length; i++) {
            combination[i] = first[i];
        }

        for (uint j = 0; j < second.length; j++) {
            combination[first.length + j] = second[j];
        }
    }

    /* ========== PUBLIC FUNCTIONS ========== */

    // Note: this function is public not external in order for it to be overridden and invoked via super in subclasses
    function resolverAddressesRequired() public view returns (bytes32[] memory addresses) {}

    function rebuildCache() public {
        bytes32[] memory requiredAddresses = resolverAddressesRequired();
        // The resolver must call this function whenver it updates its state
        for (uint i = 0; i < requiredAddresses.length; i++) {
            bytes32 name = requiredAddresses[i];
            // Note: can only be invoked once the resolver has all the targets needed added
            address destination = resolver.requireAndGetAddress(
                name,
                string(abi.encodePacked("Resolver missing target: ", name))
            );
            addressCache[name] = destination;
            emit CacheUpdated(name, destination);
        }
    }

    /* ========== VIEWS ========== */

    function isResolverCached() external view returns (bool) {
        bytes32[] memory requiredAddresses = resolverAddressesRequired();
        for (uint i = 0; i < requiredAddresses.length; i++) {
            bytes32 name = requiredAddresses[i];
            // false if our cache is invalid or if the resolver doesn't have the required address
            if (resolver.getAddress(name) != addressCache[name] || addressCache[name] == address(0)) {
                return false;
            }
        }

        return true;
    }

    /* ========== INTERNAL FUNCTIONS ========== */

    function requireAndGetAddress(bytes32 name) internal view returns (address) {
        address _foundAddress = addressCache[name];
        require(_foundAddress != address(0), string(abi.encodePacked("Missing address: ", name)));
        return _foundAddress;
    }

    /* ========== EVENTS ========== */

    event CacheUpdated(bytes32 name, address destination);
}


// https://docs.synthetix.io/contracts/source/interfaces/iflexiblestorage
interface IFlexibleStorage {
    // Views
    function getUIntValue(bytes32 contractName, bytes32 record) external view returns (uint);

    function getUIntValues(bytes32 contractName, bytes32[] calldata records) external view returns (uint[] memory);

    function getIntValue(bytes32 contractName, bytes32 record) external view returns (int);

    function getIntValues(bytes32 contractName, bytes32[] calldata records) external view returns (int[] memory);

    function getAddressValue(bytes32 contractName, bytes32 record) external view returns (address);

    function getAddressValues(bytes32 contractName, bytes32[] calldata records) external view returns (address[] memory);

    function getBoolValue(bytes32 contractName, bytes32 record) external view returns (bool);

    function getBoolValues(bytes32 contractName, bytes32[] calldata records) external view returns (bool[] memory);

    function getBytes32Value(bytes32 contractName, bytes32 record) external view returns (bytes32);

    function getBytes32Values(bytes32 contractName, bytes32[] calldata records) external view returns (bytes32[] memory);

    // Mutative functions
    function deleteUIntValue(bytes32 contractName, bytes32 record) external;

    function deleteIntValue(bytes32 contractName, bytes32 record) external;

    function deleteAddressValue(bytes32 contractName, bytes32 record) external;

    function deleteBoolValue(bytes32 contractName, bytes32 record) external;

    function deleteBytes32Value(bytes32 contractName, bytes32 record) external;

    function setUIntValue(
        bytes32 contractName,
        bytes32 record,
        uint value
    ) external;

    function setUIntValues(
        bytes32 contractName,
        bytes32[] calldata records,
        uint[] calldata values
    ) external;

    function setIntValue(
        bytes32 contractName,
        bytes32 record,
        int value
    ) external;

    function setIntValues(
        bytes32 contractName,
        bytes32[] calldata records,
        int[] calldata values
    ) external;

    function setAddressValue(
        bytes32 contractName,
        bytes32 record,
        address value
    ) external;

    function setAddressValues(
        bytes32 contractName,
        bytes32[] calldata records,
        address[] calldata values
    ) external;

    function setBoolValue(
        bytes32 contractName,
        bytes32 record,
        bool value
    ) external;

    function setBoolValues(
        bytes32 contractName,
        bytes32[] calldata records,
        bool[] calldata values
    ) external;

    function setBytes32Value(
        bytes32 contractName,
        bytes32 record,
        bytes32 value
    ) external;

    function setBytes32Values(
        bytes32 contractName,
        bytes32[] calldata records,
        bytes32[] calldata values
    ) external;
}


// Internal references


// https://docs.synthetix.io/contracts/source/contracts/mixinsystemsettings
contract MixinSystemSettings is MixinResolver {
    bytes32 internal constant SETTING_CONTRACT_NAME = "SystemSettings";

    bytes32 internal constant SETTING_WAITING_PERIOD_SECS = "waitingPeriodSecs";
    bytes32 internal constant SETTING_PRICE_DEVIATION_THRESHOLD_FACTOR = "priceDeviationThresholdFactor";
    bytes32 internal constant SETTING_ISSUANCE_RATIO = "issuanceRatio";
    bytes32 internal constant SETTING_FEE_PERIOD_DURATION = "feePeriodDuration";
    bytes32 internal constant SETTING_TARGET_THRESHOLD = "targetThreshold";
    bytes32 internal constant SETTING_LIQUIDATION_DELAY = "liquidationDelay";
    bytes32 internal constant SETTING_LIQUIDATION_RATIO = "liquidationRatio";
    bytes32 internal constant SETTING_LIQUIDATION_PENALTY = "liquidationPenalty";
    bytes32 internal constant SETTING_RATE_STALE_PERIOD = "rateStalePeriod";
    bytes32 internal constant SETTING_EXCHANGE_FEE_RATE = "exchangeFeeRate";
    bytes32 internal constant SETTING_MINIMUM_STAKE_TIME = "minimumStakeTime";
    bytes32 internal constant SETTING_AGGREGATOR_WARNING_FLAGS = "aggregatorWarningFlags";
    bytes32 internal constant SETTING_TRADING_REWARDS_ENABLED = "tradingRewardsEnabled";
    bytes32 internal constant SETTING_DEBT_SNAPSHOT_STALE_TIME = "debtSnapshotStaleTime";
    bytes32 internal constant SETTING_CROSS_DOMAIN_DEPOSIT_GAS_LIMIT = "crossDomainDepositGasLimit";
    bytes32 internal constant SETTING_CROSS_DOMAIN_ESCROW_GAS_LIMIT = "crossDomainEscrowGasLimit";
    bytes32 internal constant SETTING_CROSS_DOMAIN_REWARD_GAS_LIMIT = "crossDomainRewardGasLimit";
    bytes32 internal constant SETTING_CROSS_DOMAIN_WITHDRAWAL_GAS_LIMIT = "crossDomainWithdrawalGasLimit";

    bytes32 internal constant CONTRACT_FLEXIBLESTORAGE = "FlexibleStorage";

    enum CrossDomainMessageGasLimits {Deposit, Escrow, Reward, Withdrawal}

    constructor(address _resolver) internal MixinResolver(_resolver) {}

    function resolverAddressesRequired() public view returns (bytes32[] memory addresses) {
        addresses = new bytes32[](1);
        addresses[0] = CONTRACT_FLEXIBLESTORAGE;
    }

    function flexibleStorage() internal view returns (IFlexibleStorage) {
        return IFlexibleStorage(requireAndGetAddress(CONTRACT_FLEXIBLESTORAGE));
    }

    function _getGasLimitSetting(CrossDomainMessageGasLimits gasLimitType) internal pure returns (bytes32) {
        if (gasLimitType == CrossDomainMessageGasLimits.Deposit) {
            return SETTING_CROSS_DOMAIN_DEPOSIT_GAS_LIMIT;
        } else if (gasLimitType == CrossDomainMessageGasLimits.Escrow) {
            return SETTING_CROSS_DOMAIN_ESCROW_GAS_LIMIT;
        } else if (gasLimitType == CrossDomainMessageGasLimits.Reward) {
            return SETTING_CROSS_DOMAIN_REWARD_GAS_LIMIT;
        } else if (gasLimitType == CrossDomainMessageGasLimits.Withdrawal) {
            return SETTING_CROSS_DOMAIN_WITHDRAWAL_GAS_LIMIT;
        } else {
            revert("Unknown gas limit type");
        }
    }

    function getCrossDomainMessageGasLimit(CrossDomainMessageGasLimits gasLimitType) internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, _getGasLimitSetting(gasLimitType));
    }

    function getTradingRewardsEnabled() internal view returns (bool) {
        return flexibleStorage().getBoolValue(SETTING_CONTRACT_NAME, SETTING_TRADING_REWARDS_ENABLED);
    }

    function getWaitingPeriodSecs() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_WAITING_PERIOD_SECS);
    }

    function getPriceDeviationThresholdFactor() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_PRICE_DEVIATION_THRESHOLD_FACTOR);
    }

    function getIssuanceRatio() internal view returns (uint) {
        // lookup on flexible storage directly for gas savings (rather than via SystemSettings)
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_ISSUANCE_RATIO);
    }

    function getFeePeriodDuration() internal view returns (uint) {
        // lookup on flexible storage directly for gas savings (rather than via SystemSettings)
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_FEE_PERIOD_DURATION);
    }

    function getTargetThreshold() internal view returns (uint) {
        // lookup on flexible storage directly for gas savings (rather than via SystemSettings)
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_TARGET_THRESHOLD);
    }

    function getLiquidationDelay() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_LIQUIDATION_DELAY);
    }

    function getLiquidationRatio() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_LIQUIDATION_RATIO);
    }

    function getLiquidationPenalty() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_LIQUIDATION_PENALTY);
    }

    function getRateStalePeriod() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_RATE_STALE_PERIOD);
    }

    function getExchangeFeeRate(bytes32 currencyKey) internal view returns (uint) {
        return
            flexibleStorage().getUIntValue(
                SETTING_CONTRACT_NAME,
                keccak256(abi.encodePacked(SETTING_EXCHANGE_FEE_RATE, currencyKey))
            );
    }

    function getMinimumStakeTime() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_MINIMUM_STAKE_TIME);
    }

    function getAggregatorWarningFlags() internal view returns (address) {
        return flexibleStorage().getAddressValue(SETTING_CONTRACT_NAME, SETTING_AGGREGATOR_WARNING_FLAGS);
    }

    function getDebtSnapshotStaleTime() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_DEBT_SNAPSHOT_STALE_TIME);
    }
}


pragma experimental ABIEncoderV2;


interface ISynthetixBridgeToOptimism {
    // Invoked by the relayer on L1
    function completeWithdrawal(address account, uint amount) external;

    // The following functions can be invoked by users on L1
    function initiateDeposit(uint amount) external;

    function initiateEscrowMigration(uint256[][] calldata entryIDs) external;

    function initiateRewardDeposit(uint amount) external;

    function depositAndMigrateEscrow(uint256 depositAmount, uint256[][] calldata entryIDs) external;
}


interface IVirtualSynth {
    // Views
    function balanceOfUnderlying(address account) external view returns (uint);

    function rate() external view returns (uint);

    function readyToSettle() external view returns (bool);

    function secsLeftInWaitingPeriod() external view returns (uint);

    function settled() external view returns (bool);

    function synth() external view returns (ISynth);

    // Mutative functions
    function settle(address account) external;
}


// https://docs.synthetix.io/contracts/source/interfaces/isynthetix
interface ISynthetix {
    // Views
    function anySynthOrSNXRateIsInvalid() external view returns (bool anyRateInvalid);

    function availableCurrencyKeys() external view returns (bytes32[] memory);

    function availableSynthCount() external view returns (uint);

    function availableSynths(uint index) external view returns (ISynth);

    function collateral(address account) external view returns (uint);

    function collateralisationRatio(address issuer) external view returns (uint);

    function debtBalanceOf(address issuer, bytes32 currencyKey) external view returns (uint);

    function isWaitingPeriod(bytes32 currencyKey) external view returns (bool);

    function maxIssuableSynths(address issuer) external view returns (uint maxIssuable);

    function remainingIssuableSynths(address issuer)
        external
        view
        returns (
            uint maxIssuable,
            uint alreadyIssued,
            uint totalSystemDebt
        );

    function synths(bytes32 currencyKey) external view returns (ISynth);

    function synthsByAddress(address synthAddress) external view returns (bytes32);

    function totalIssuedSynths(bytes32 currencyKey) external view returns (uint);

    function totalIssuedSynthsExcludeEtherCollateral(bytes32 currencyKey) external view returns (uint);

    function transferableSynthetix(address account) external view returns (uint transferable);

    // Mutative Functions
    function burnSynths(uint amount) external;

    function burnSynthsOnBehalf(address burnForAddress, uint amount) external;

    function burnSynthsToTarget() external;

    function burnSynthsToTargetOnBehalf(address burnForAddress) external;

    function exchange(
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey
    ) external returns (uint amountReceived);

    function exchangeOnBehalf(
        address exchangeForAddress,
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey
    ) external returns (uint amountReceived);

    function exchangeWithTracking(
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey,
        address originator,
        bytes32 trackingCode
    ) external returns (uint amountReceived);

    function exchangeOnBehalfWithTracking(
        address exchangeForAddress,
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey,
        address originator,
        bytes32 trackingCode
    ) external returns (uint amountReceived);

    function exchangeWithVirtual(
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey,
        bytes32 trackingCode
    ) external returns (uint amountReceived, IVirtualSynth vSynth);

    function issueMaxSynths() external;

    function issueMaxSynthsOnBehalf(address issueForAddress) external;

    function issueSynths(uint amount) external;

    function issueSynthsOnBehalf(address issueForAddress, uint amount) external;

    function mint() external returns (bool);

    function settle(bytes32 currencyKey)
        external
        returns (
            uint reclaimed,
            uint refunded,
            uint numEntries
        );

    // Liquidations
    function liquidateDelinquentAccount(address account, uint susdAmount) external returns (bool);

    // Restricted Functions

    function mintSecondary(address account, uint amount) external;

    function mintSecondaryRewards(uint amount) external;

    function burnSecondary(address account, uint amount) external;
}


// https://docs.synthetix.io/contracts/source/interfaces/ierc20
interface IERC20 {
    // ERC20 Optional Views
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    // Views
    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(address owner, address spender) external view returns (uint);

    // Mutative functions
    function transfer(address to, uint value) external returns (bool);

    function approve(address spender, uint value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint value
    ) external returns (bool);

    // Events
    event Transfer(address indexed from, address indexed to, uint value);

    event Approval(address indexed owner, address indexed spender, uint value);
}


library VestingEntries {
    struct VestingEntry {
        uint64 endTime;
        uint256 escrowAmount;
    }
    struct VestingEntryWithID {
        uint64 endTime;
        uint256 escrowAmount;
        uint256 entryID;
    }
}


interface IRewardEscrowV2 {
    // Views
    function balanceOf(address account) external view returns (uint);

    function numVestingEntries(address account) external view returns (uint);

    function totalEscrowedAccountBalance(address account) external view returns (uint);

    function totalVestedAccountBalance(address account) external view returns (uint);

    function getVestingQuantity(address account, uint256[] calldata entryIDs) external view returns (uint);

    function getVestingSchedules(
        address account,
        uint256 index,
        uint256 pageSize
    ) external view returns (VestingEntries.VestingEntryWithID[] memory);

    function getAccountVestingEntryIDs(
        address account,
        uint256 index,
        uint256 pageSize
    ) external view returns (uint256[] memory);

    function getVestingEntryClaimable(address account, uint256 entryID) external view returns (uint);

    function getVestingEntry(address account, uint256 entryID) external view returns (uint64, uint256);

    // Mutative functions
    function vest(uint256[] calldata entryIDs) external;

    function createEscrowEntry(
        address beneficiary,
        uint256 deposit,
        uint256 duration
    ) external;

    function appendVestingEntry(
        address account,
        uint256 quantity,
        uint256 duration
    ) external;

    function migrateVestingSchedule(address _addressToMigrate) external;

    function migrateAccountEscrowBalances(
        address[] calldata accounts,
        uint256[] calldata escrowBalances,
        uint256[] calldata vestedBalances
    ) external;

    // Account Merging
    function startMergingWindow() external;

    function mergeAccount(address accountToMerge, uint256[] calldata entryIDs) external;

    function nominateAccountToMerge(address account) external;

    function accountMergingIsOpen() external view returns (bool);

    // L2 Migration
    function importVestingEntries(
        address account,
        uint256 escrowedAmount,
        VestingEntries.VestingEntry[] calldata vestingEntries
    ) external;

    // Return amount of SNX transfered to SynthetixBridgeToOptimism deposit contract
    function burnForMigration(address account, uint256[] calldata entryIDs)
        external
        returns (uint256 escrowedAccountBalance, VestingEntries.VestingEntry[] memory vestingEntries);
}


interface ISynthetixBridgeToBase {
    // invoked by users on L2
    function initiateWithdrawal(uint amount) external;

    //  // The following functions can only be invoked by the xDomain messenger on L2
    function completeDeposit(address account, uint depositAmount) external;

    // invoked by the xDomain messenger on L2
    function completeEscrowMigration(
        address account,
        uint256 escrowedAmount,
        VestingEntries.VestingEntry[] calldata vestingEntries
    ) external;

    // invoked by the xDomain messenger on L2
    function completeRewardDeposit(uint amount) external;
}


// SPDX-License-Identifier: UNLICENSED


/**
 * @title iOVM_BaseCrossDomainMessenger
 */
interface iOVM_BaseCrossDomainMessenger {
    /**********************
     * Contract Variables *
     **********************/
    function xDomainMessageSender() external view returns (address);

    /********************
     * Public Functions *
     ********************/

    /**
     * Sends a cross domain message to the target messenger.
     * @param _target Target contract address.
     * @param _message Message to send to the target.
     * @param _gasLimit Gas limit for the provided message.
     */
    function sendMessage(
        address _target,
        bytes calldata _message,
        uint32 _gasLimit
    ) external;
}


// Inheritance


// Internal references


// solhint-disable indent


contract SynthetixBridgeToOptimism is Owned, MixinSystemSettings, ISynthetixBridgeToOptimism {
    /* ========== ADDRESS RESOLVER CONFIGURATION ========== */
    bytes32 private constant CONTRACT_EXT_MESSENGER = "ext:Messenger";
    bytes32 private constant CONTRACT_SYNTHETIX = "Synthetix";
    bytes32 private constant CONTRACT_ISSUER = "Issuer";
    bytes32 private constant CONTRACT_REWARDSDISTRIBUTION = "RewardsDistribution";
    bytes32 private constant CONTRACT_REWARDESCROW = "RewardEscrowV2";
    bytes32 private constant CONTRACT_OVM_SYNTHETIXBRIDGETOBASE = "ovm:SynthetixBridgeToBase";

    uint8 private constant MAX_ENTRIES_MIGRATED_PER_MESSAGE = 26;

    bool public activated;

    // ========== CONSTRUCTOR ==========

    constructor(address _owner, address _resolver) public Owned(_owner) MixinSystemSettings(_resolver) {
        activated = true;
    }

    //
    // ========== INTERNALS ============

    function messenger() internal view returns (iOVM_BaseCrossDomainMessenger) {
        return iOVM_BaseCrossDomainMessenger(requireAndGetAddress(CONTRACT_EXT_MESSENGER));
    }

    function synthetix() internal view returns (ISynthetix) {
        return ISynthetix(requireAndGetAddress(CONTRACT_SYNTHETIX));
    }

    function synthetixERC20() internal view returns (IERC20) {
        return IERC20(requireAndGetAddress(CONTRACT_SYNTHETIX));
    }

    function issuer() internal view returns (IIssuer) {
        return IIssuer(requireAndGetAddress(CONTRACT_ISSUER));
    }

    function rewardsDistribution() internal view returns (address) {
        return requireAndGetAddress(CONTRACT_REWARDSDISTRIBUTION);
    }

    function rewardEscrowV2() internal view returns (IRewardEscrowV2) {
        return IRewardEscrowV2(requireAndGetAddress(CONTRACT_REWARDESCROW));
    }

    function synthetixBridgeToBase() internal view returns (address) {
        return requireAndGetAddress(CONTRACT_OVM_SYNTHETIXBRIDGETOBASE);
    }

    function isActive() internal view {
        require(activated, "Function deactivated");
    }

    function hasZeroDebt() internal view {
        require(issuer().debtBalanceOf(msg.sender, "sUSD") == 0, "Cannot deposit or migrate with debt");
    }

    /* ========== VIEWS ========== */

    function resolverAddressesRequired() public view returns (bytes32[] memory addresses) {
        bytes32[] memory existingAddresses = MixinSystemSettings.resolverAddressesRequired();
        bytes32[] memory newAddresses = new bytes32[](6);
        newAddresses[0] = CONTRACT_EXT_MESSENGER;
        newAddresses[1] = CONTRACT_SYNTHETIX;
        newAddresses[2] = CONTRACT_ISSUER;
        newAddresses[3] = CONTRACT_REWARDSDISTRIBUTION;
        newAddresses[4] = CONTRACT_OVM_SYNTHETIXBRIDGETOBASE;
        newAddresses[5] = CONTRACT_REWARDESCROW;
        addresses = combineArrays(existingAddresses, newAddresses);
    }

    // ========== MODIFIERS ============

    modifier requireActive() {
        isActive();
        _;
    }

    modifier requireZeroDebt() {
        hasZeroDebt();
        _;
    }

    // ========== PUBLIC FUNCTIONS =========

    function initiateDeposit(uint256 depositAmount) external requireActive requireZeroDebt {
        _initiateDeposit(depositAmount);
    }

    function initiateEscrowMigration(uint256[][] memory entryIDs) public requireActive requireZeroDebt {
        _initiateEscrowMigration(entryIDs);
    }

    // invoked by a generous user on L1
    function initiateRewardDeposit(uint amount) external requireActive {
        // move the SNX into this contract
        synthetixERC20().transferFrom(msg.sender, address(this), amount);

        _initiateRewardDeposit(amount);
    }

    // ========= RESTRICTED FUNCTIONS ==============

    // invoked by Messenger on L1 after L2 waiting period elapses
    function completeWithdrawal(address account, uint256 amount) external requireActive {
        // ensure function only callable from L2 Bridge via messenger (aka relayer)
        require(msg.sender == address(messenger()), "Only the relayer can call this");
        require(messenger().xDomainMessageSender() == synthetixBridgeToBase(), "Only the L2 bridge can invoke");

        // transfer amount back to user
        synthetixERC20().transfer(account, amount);

        // no escrow actions - escrow remains on L2
        emit WithdrawalCompleted(account, amount);
    }

    // invoked by the owner for migrating the contract to the new version that will allow for withdrawals
    function migrateBridge(address newBridge) external onlyOwner requireActive {
        require(newBridge != address(0), "Cannot migrate to address 0");
        activated = false;

        IERC20 ERC20Synthetix = synthetixERC20();
        // get the current contract balance and transfer it to the new SynthetixL1ToL2Bridge contract
        uint256 contractBalance = ERC20Synthetix.balanceOf(address(this));
        ERC20Synthetix.transfer(newBridge, contractBalance);

        emit BridgeMigrated(address(this), newBridge, contractBalance);
    }

    // invoked by RewardsDistribution on L1 (takes SNX)
    function notifyRewardAmount(uint256 amount) external requireActive {
        require(msg.sender == address(rewardsDistribution()), "Caller is not RewardsDistribution contract");

        // to be here means I've been given an amount of SNX to distribute onto L2
        _initiateRewardDeposit(amount);
    }

    function depositAndMigrateEscrow(uint256 depositAmount, uint256[][] memory entryIDs)
        public
        requireActive
        requireZeroDebt
    {
        if (entryIDs.length > 0) {
            _initiateEscrowMigration(entryIDs);
        }

        if (depositAmount > 0) {
            _initiateDeposit(depositAmount);
        }
    }

    // ========== PRIVATE/INTERNAL FUNCTIONS =========

    function _initiateRewardDeposit(uint256 _amount) internal {
        // create message payload for L2
        ISynthetixBridgeToBase bridgeToBase;
        bytes memory messageData = abi.encodeWithSelector(bridgeToBase.completeRewardDeposit.selector, _amount);

        // relay the message to this contract on L2 via L1 Messenger
        messenger().sendMessage(
            synthetixBridgeToBase(),
            messageData,
            uint32(getCrossDomainMessageGasLimit(CrossDomainMessageGasLimits.Reward))
        );

        emit RewardDeposit(msg.sender, _amount);
    }

    function _initiateDeposit(uint256 _depositAmount) private {
        // Transfer SNX to L2
        // First, move the SNX into this contract
        synthetixERC20().transferFrom(msg.sender, address(this), _depositAmount);
        // create message payload for L2
        ISynthetixBridgeToBase bridgeToBase;
        bytes memory messageData = abi.encodeWithSelector(bridgeToBase.completeDeposit.selector, msg.sender, _depositAmount);

        // relay the message to this contract on L2 via L1 Messenger
        messenger().sendMessage(
            synthetixBridgeToBase(),
            messageData,
            uint32(getCrossDomainMessageGasLimit(CrossDomainMessageGasLimits.Deposit))
        );
        emit Deposit(msg.sender, _depositAmount);
    }

    function _initiateEscrowMigration(uint256[][] memory _entryIDs) private {
        // loop through the entryID array
        for (uint256 i = 0; i < _entryIDs.length; i++) {
            // Cannot send more than MAX_ENTRIES_MIGRATED_PER_MESSAGE entries due to ovm gas restrictions
            require(_entryIDs[i].length <= MAX_ENTRIES_MIGRATED_PER_MESSAGE, "Exceeds max entries per migration");
            // Burn their reward escrow first
            // Note: escrowSummary would lose the fidelity of the weekly escrows, so this may not be sufficient
            uint256 escrowedAccountBalance;
            VestingEntries.VestingEntry[] memory vestingEntries;
            (escrowedAccountBalance, vestingEntries) = rewardEscrowV2().burnForMigration(msg.sender, _entryIDs[i]);
            // if there is an escrow amount to be migrated
            if (escrowedAccountBalance > 0) {
                // create message payload for L2
                ISynthetixBridgeToBase bridgeToBase;
                bytes memory messageData = abi.encodeWithSelector(
                    bridgeToBase.completeEscrowMigration.selector,
                    msg.sender,
                    escrowedAccountBalance,
                    vestingEntries
                );
                // relay the message to this contract on L2 via L1 Messenger
                messenger().sendMessage(
                    synthetixBridgeToBase(),
                    messageData,
                    uint32(getCrossDomainMessageGasLimit(CrossDomainMessageGasLimits.Escrow))
                );
                emit ExportedVestingEntries(msg.sender, escrowedAccountBalance, vestingEntries);
            }
        }
    }

    // ========== EVENTS ==========

    event BridgeMigrated(address oldBridge, address newBridge, uint256 amount);
    event Deposit(address indexed account, uint256 amount);
    event ExportedVestingEntries(
        address indexed account,
        uint256 escrowedAccountBalance,
        VestingEntries.VestingEntry[] vestingEntries
    );
    event RewardDeposit(address indexed account, uint256 amount);
    event WithdrawalCompleted(address indexed account, uint256 amount);
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_resolver","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldBridge","type":"address"},{"indexed":false,"internalType":"address","name":"newBridge","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgeMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":false,"internalType":"address","name":"destination","type":"address"}],"name":"CacheUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"escrowedAccountBalance","type":"uint256"},{"components":[{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint256","name":"escrowAmount","type":"uint256"}],"indexed":false,"internalType":"struct VestingEntries.VestingEntry[]","name":"vestingEntries","type":"tuple[]"}],"name":"ExportedVestingEntries","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawalCompleted","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"completeWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256[][]","name":"entryIDs","type":"uint256[][]"}],"name":"depositAndMigrateEscrow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"initiateDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[][]","name":"entryIDs","type":"uint256[][]"}],"name":"initiateEscrowMigration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"initiateRewardDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isResolverCached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newBridge","type":"address"}],"name":"migrateBridge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebuildCache","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"resolver","outputs":[{"internalType":"contract AddressResolver","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"resolverAddressesRequired","outputs":[{"internalType":"bytes32[]","name":"addresses","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200237438038062002374833981016040819052620000349162000108565b8080836001600160a01b038116620000695760405162461bcd60e51b81526004016200006090620001c4565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0383161781556040517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91620000b69184906200019e565b60405180910390a150600280546001600160a01b0319166001600160a01b039290921691909117905550506004805460ff19166001179055506200021f565b8051620001028162000205565b92915050565b600080604083850312156200011c57600080fd5b60006200012a8585620000f5565b92505060206200013d85828601620000f5565b9150509250929050565b6200015281620001f1565b82525050565b6200015281620001df565b600062000172601983620001d6565b7f4f776e657220616464726573732063616e6e6f74206265203000000000000000815260200192915050565b60408101620001ae828562000147565b620001bd602083018462000158565b9392505050565b60208082528101620001028162000163565b90815260200190565b60006001600160a01b03821662000102565b6000620001028260006200010282620001df565b6200021081620001df565b81146200021c57600080fd5b50565b612145806200022f6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806379ba509711610097578063cb82747411610066578063cb827474146101d0578063ccce9506146101e3578063d7f5b359146101f6578063e2ff2d431461020957610100565b806379ba509714610198578063899ffef4146101a05780638da5cb5b146101b5578063a18e2307146101bd57610100565b80633c6b16ab116100d35780633c6b16ab1461015557806353a47bb7146101685780636bfd78351461017d578063741853601461019057610100565b806304f3bcec146101055780631627540c14610123578063186601ca146101385780632af64bd31461014d575b600080fd5b61010d61021c565b60405161011a9190611f1f565b60405180910390f35b6101366101313660046116fe565b61022b565b005b610140610289565b60405161011a9190611ec7565b610140610292565b6101366101633660046117cf565b6103aa565b6101706103ff565b60405161011a9190611d96565b61013661018b36600461177c565b61040e565b610136610427565b61013661057d565b6101a8610619565b60405161011a9190611eb6565b610170610760565b6101366101cb36600461180b565b61076f565b6101366101de3660046117cf565b61079e565b6101366101f13660046117cf565b6107b7565b6101366102043660046116fe565b610852565b610136610217366004611742565b6109e0565b6002546001600160a01b031681565b610233610b9c565b600180546001600160a01b0319166001600160a01b0383161790556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229061027e908390611d96565b60405180910390a150565b60045460ff1681565b6000606061029e610619565b905060005b81518110156103a05760008282815181106102ba57fe5b602090810291909101810151600081815260039092526040918290205460025492516321f8a72160e01b81529193506001600160a01b039081169216906321f8a7219061030b908590600401611ed5565b60206040518083038186803b15801561032357600080fd5b505afa158015610337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061035b9190810190611724565b6001600160a01b031614158061038657506000818152600360205260409020546001600160a01b0316155b1561039757600093505050506103a7565b506001016102a3565b5060019150505b90565b6103b2610bc8565b6103ba610bea565b6001600160a01b0316336001600160a01b0316146103f35760405162461bcd60e51b81526004016103ea90611fae565b60405180910390fd5b6103fc81610c10565b50565b6001546001600160a01b031681565b610416610bc8565b61041e610d23565b6103fc81610dc3565b6060610431610619565b905060005b815181101561057957600082828151811061044d57fe5b602002602001015190506000600260009054906101000a90046001600160a01b03166001600160a01b031663dacb2d01838460405160200161048f9190611d8b565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016104bb929190611eff565b60206040518083038186803b1580156104d357600080fd5b505afa1580156104e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061050b9190810190611724565b6000838152600360205260409081902080546001600160a01b0319166001600160a01b038416179055519091507f88a93678a3692f6789d9546fc621bf7234b101ddb7d4fe479455112831b8aa68906105679084908490611ee3565b60405180910390a15050600101610436565b5050565b6001546001600160a01b031633146105a75760405162461bcd60e51b81526004016103ea90611f3e565b6000546001546040517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c926105ea926001600160a01b0391821692911690611e5e565b60405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b606080610624610fd5565b60408051600680825260e08201909252919250606091906020820160c0803883390190505090506c32bc3a1d26b2b9b9b2b733b2b960991b8160008151811061066957fe5b602002602001018181525050680a6f2dce8d0cae8d2f60bb1b8160018151811061068f57fe5b6020026020010181815250506524b9b9bab2b960d11b816002815181106106b257fe5b602002602001018181525050722932bbb0b93239a234b9ba3934b13aba34b7b760691b816003815181106106e257fe5b602002602001018181525050786f766d3a53796e746865746978427269646765546f4261736560381b8160048151811061071857fe5b6020026020010181815250506d2932bbb0b93222b9b1b937bbab1960911b8160058151811061074357fe5b6020026020010181815250506107598282611026565b9250505090565b6000546001600160a01b031681565b610777610bc8565b61077f610d23565b80511561078f5761078f81610dc3565b811561057957610579826110e2565b6107a6610bc8565b6107ae610d23565b6103fc816110e2565b6107bf610bc8565b6107c7611274565b6001600160a01b03166323b872dd3330846040518463ffffffff1660e01b81526004016107f693929190611da4565b602060405180830381600087803b15801561081057600080fd5b505af1158015610824573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061084891908101906117b1565b506103fc81610c10565b61085a610b9c565b610862610bc8565b6001600160a01b0381166108885760405162461bcd60e51b81526004016103ea90611fbe565b6004805460ff19169055600061089c611274565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016108cc9190611d96565b60206040518083038186803b1580156108e457600080fd5b505afa1580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061091c91908101906117ed565b60405163a9059cbb60e01b81529091506001600160a01b0383169063a9059cbb9061094d9086908590600401611e06565b602060405180830381600087803b15801561096757600080fd5b505af115801561097b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061099f91908101906117b1565b507fa1bbeeb6860c5db529c582b6bdbc57a2e9862ef771e5bed3a082f7d9da54904a3084836040516109d393929190611e79565b60405180910390a1505050565b6109e8610bc8565b6109f061128b565b6001600160a01b0316336001600160a01b031614610a205760405162461bcd60e51b81526004016103ea90611f9e565b610a286112a6565b6001600160a01b0316610a3961128b565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610aa99190810190611724565b6001600160a01b031614610acf5760405162461bcd60e51b81526004016103ea90611f4e565b610ad7611274565b6001600160a01b031663a9059cbb83836040518363ffffffff1660e01b8152600401610b04929190611e06565b602060405180830381600087803b158015610b1e57600080fd5b505af1158015610b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b5691908101906117b1565b50816001600160a01b03167f1a39b9c5044b9f0ff56c5951e30c1ebe24911353aafcceb9250e83a24fe158c482604051610b909190611ed5565b60405180910390a25050565b6000546001600160a01b03163314610bc65760405162461bcd60e51b81526004016103ea90611f8e565b565b60045460ff16610bc65760405162461bcd60e51b81526004016103ea90611f6e565b6000610c0b722932bbb0b93239a234b9ba3934b13aba34b7b760691b6112c9565b905090565b60405160009060609063f69053c560e01b90610c30908590602401611ed5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050610c6c61128b565b6001600160a01b0316633dbb202b610c826112a6565b83610c8d600261132f565b6040518463ffffffff1660e01b8152600401610cab93929190611e87565b600060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b50505050336001600160a01b03167f95bf5847357310d24f8d03d8bad76c8ee329dfd3a3cb200df21c7bd1619e93bd84604051610d169190611ed5565b60405180910390a2505050565b610d2b6113d5565b6001600160a01b031663d37c4d8b336040518263ffffffff1660e01b8152600401610d569190611dec565b60206040518083038186803b158015610d6e57600080fd5b505afa158015610d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610da691908101906117ed565b15610bc65760405162461bcd60e51b81526004016103ea90611f7e565b60005b815181101561057957601a60ff16828281518110610de057fe5b6020026020010151511115610e075760405162461bcd60e51b81526004016103ea90611f5e565b60006060610e136113e9565b6001600160a01b03166380d46f5833868681518110610e2e57fe5b60200260200101516040518363ffffffff1660e01b8152600401610e53929190611dcc565b600060405180830381600087803b158015610e6d57600080fd5b505af1158015610e81573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ea99190810190611853565b90925090508115610fcb5760405160009060609063355bf0e160e11b90610ed890339087908790602401611e28565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050610f1461128b565b6001600160a01b0316633dbb202b610f2a6112a6565b83610f35600161132f565b6040518463ffffffff1660e01b8152600401610f5393929190611e87565b600060405180830381600087803b158015610f6d57600080fd5b505af1158015610f81573d6000803e3d6000fd5b50505050336001600160a01b03167f4dc5956ab6218a4dfa2cc5e5c50d98d039dde03aabfc504c54b601b6f56226968585604051610fc0929190611fde565b60405180910390a250505b5050600101610dc6565b604080516001808252818301909252606091602080830190803883390190505090506e466c657869626c6553746f7261676560881b8160008151811061101757fe5b60200260200101818152505090565b60608151835101604051908082528060200260200182016040528015611056578160200160208202803883390190505b50905060005b83518110156110985783818151811061107157fe5b602002602001015182828151811061108557fe5b602090810291909101015260010161105c565b5060005b82518110156110db578281815181106110b157fe5b60200260200101518282865101815181106110c857fe5b602090810291909101015260010161109c565b5092915050565b6110ea611274565b6001600160a01b03166323b872dd3330846040518463ffffffff1660e01b815260040161111993929190611da4565b602060405180830381600087803b15801561113357600080fd5b505af1158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061116b91908101906117b1565b506040516000906060906309853aff60e11b9061118e9033908690602401611e06565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290506111ca61128b565b6001600160a01b0316633dbb202b6111e06112a6565b836111eb600061132f565b6040518463ffffffff1660e01b815260040161120993929190611e87565b600060405180830381600087803b15801561122357600080fd5b505af1158015611237573d6000803e3d6000fd5b50505050336001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c84604051610d169190611ed5565b6000610c0b680a6f2dce8d0cae8d2f60bb1b6112c9565b6000610c0b6c32bc3a1d26b2b9b9b2b733b2b960991b6112c9565b6000610c0b786f766d3a53796e746865746978427269646765546f4261736560381b5b60008181526003602090815260408083205490516001600160a01b0390911691821515916112f991869101611d6b565b604051602081830303815290604052906113265760405162461bcd60e51b81526004016103ea9190611f2d565b5090505b919050565b6000611339611405565b6001600160a01b03166323257c2b6d53797374656d53657474696e677360901b61136285611422565b6040518363ffffffff1660e01b815260040161137f929190611ef1565b60206040518083038186803b15801561139757600080fd5b505afa1580156113ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113cf91908101906117ed565b92915050565b6000610c0b6524b9b9bab2b960d11b6112c9565b6000610c0b6d2932bbb0b93222b9b1b937bbab1960911b6112c9565b6000610c0b6e466c657869626c6553746f7261676560881b6112c9565b60008082600381111561143157fe5b141561145e57507f63726f7373446f6d61696e4465706f7369744761734c696d697400000000000061132a565b600182600381111561146c57fe5b141561149957507f63726f7373446f6d61696e457363726f774761734c696d69740000000000000061132a565b60028260038111156114a757fe5b14156114d457507f63726f7373446f6d61696e5265776172644761734c696d69740000000000000061132a565b60038260038111156114e257fe5b141561150f57507f63726f7373446f6d61696e5769746864726177616c4761734c696d697400000061132a565b60405162461bcd60e51b81526004016103ea90611fce565b80356113cf816120d3565b80516113cf816120d3565b600082601f83011261154e57600080fd5b813561156161155c82612025565b611ffe565b81815260209384019390925082018360005b8381101561159f5781358601611589888261161b565b8452506020928301929190910190600101611573565b5050505092915050565b600082601f8301126115ba57600080fd5b81516115c861155c82612025565b915081818352602084019350602081019050838560408402820111156115ed57600080fd5b60005b8381101561159f57816116038882611696565b845250602090920191604091909101906001016115f0565b600082601f83011261162c57600080fd5b813561163a61155c82612025565b9150818183526020840193506020810190508385602084028201111561165f57600080fd5b60005b8381101561159f578161167588826116dd565b8452506020928301929190910190600101611662565b80516113cf816120e7565b6000604082840312156116a857600080fd5b6116b26040611ffe565b905060006116c084846116f3565b82525060206116d1848483016116e8565b60208301525092915050565b80356113cf816120f0565b80516113cf816120f0565b80516113cf816120f9565b60006020828403121561171057600080fd5b600061171c8484611527565b949350505050565b60006020828403121561173657600080fd5b600061171c8484611532565b6000806040838503121561175557600080fd5b60006117618585611527565b9250506020611772858286016116dd565b9150509250929050565b60006020828403121561178e57600080fd5b813567ffffffffffffffff8111156117a557600080fd5b61171c8482850161153d565b6000602082840312156117c357600080fd5b600061171c848461168b565b6000602082840312156117e157600080fd5b600061171c84846116dd565b6000602082840312156117ff57600080fd5b600061171c84846116e8565b6000806040838503121561181e57600080fd5b600061182a85856116dd565b925050602083013567ffffffffffffffff81111561184757600080fd5b6117728582860161153d565b6000806040838503121561186657600080fd5b600061187285856116e8565b925050602083015167ffffffffffffffff81111561188f57600080fd5b611772858286016115a9565b60006118a783836119d9565b505060200190565b60006118bb8383611d2f565b505060400190565b6118cc8161208b565b82525050565b6118cc81612059565b60006118e68261204c565b6118f08185612050565b93506118fb83612046565b8060005b83811015611929578151611913888261189b565b975061191e83612046565b9250506001016118ff565b509495945050505050565b600061193f8261204c565b6119498185612050565b935061195483612046565b8060005b8381101561192957815161196c88826118af565b975061197783612046565b925050600101611958565b600061198d8261204c565b6119978185612050565b93506119a283612046565b8060005b838110156119295781516119ba888261189b565b97506119c583612046565b9250506001016119a6565b6118cc81612064565b6118cc816103a7565b6118cc6119ee826103a7565b6103a7565b60006119fe8261204c565b611a088185612050565b9350611a1881856020860161209d565b611a21816120c9565b9093019392505050565b6118cc81612092565b6000611a41603583612050565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7581527402063616e20616363657074206f776e65727368697605c1b602082015260400192915050565b6000611a98601d83612050565b7f4f6e6c7920746865204c32206272696467652063616e20696e766f6b65000000815260200192915050565b6000611ad1602183612050565b7f45786365656473206d617820656e747269657320706572206d6967726174696f8152603760f91b602082015260400192915050565b6000611b14601483612050565b73119d5b98dd1a5bdb8819195858dd1a5d985d195960621b815260200192915050565b6000611b4460118361132a565b70026b4b9b9b4b7339030b2323932b9b99d1607d1b815260110192915050565b6000611b71602383612050565b7f43616e6e6f74206465706f736974206f72206d6967726174652077697468206481526219589d60ea1b602082015260400192915050565b6000611bb6602f83612050565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726681526e37b936903a3434b99030b1ba34b7b760891b602082015260400192915050565b631cd554d160e21b9052565b6000611c13601e83612050565b7f4f6e6c79207468652072656c617965722063616e2063616c6c20746869730000815260200192915050565b6000611c4c60198361132a565b7f5265736f6c766572206d697373696e67207461726765743a2000000000000000815260190192915050565b6000611c85602a83612050565b7f43616c6c6572206973206e6f742052657761726473446973747269627574696f8152691b8818dbdb9d1c9858dd60b21b602082015260400192915050565b6000611cd1601b83612050565b7f43616e6e6f74206d69677261746520746f206164647265737320300000000000815260200192915050565b6000611d0a601683612050565b75556e6b6e6f776e20676173206c696d6974207479706560501b815260200192915050565b80516040830190611d408482611d62565b506020820151611d5360208501826119d9565b50505050565b6118cc81612075565b6118cc8161207e565b6000611d7682611b37565b9150611d8282846119e2565b50602001919050565b6000611d7682611c3f565b602081016113cf82846118d2565b60608101611db282866118c3565b611dbf60208301856118d2565b61171c60408301846119d9565b60408101611dda82856118c3565b818103602083015261171c8184611982565b60408101611dfa82846118c3565b6113cf60208301611bfa565b60408101611e1482856118d2565b611e2160208301846119d9565b9392505050565b60608101611e3682866118d2565b611e4360208301856119d9565b8181036040830152611e558184611934565b95945050505050565b60408101611e6c82856118d2565b611e2160208301846118d2565b60608101611db282866118d2565b60608101611e9582866118d2565b8181036020830152611ea781856119f3565b905061171c6040830184611d59565b60208082528101611e2181846118db565b602081016113cf82846119d0565b602081016113cf82846119d9565b60408101611e6c82856119d9565b60408101611e1482856119d9565b60408101611f0d82856119d9565b818103602083015261171c81846119f3565b602081016113cf8284611a2b565b60208082528101611e2181846119f3565b602080825281016113cf81611a34565b602080825281016113cf81611a8b565b602080825281016113cf81611ac4565b602080825281016113cf81611b07565b602080825281016113cf81611b64565b602080825281016113cf81611ba9565b602080825281016113cf81611c06565b602080825281016113cf81611c78565b602080825281016113cf81611cc4565b602080825281016113cf81611cfd565b60408101611fec82856119d9565b818103602083015261171c8184611934565b60405181810167ffffffffffffffff8111828210171561201d57600080fd5b604052919050565b600067ffffffffffffffff82111561203c57600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b60006113cf82612069565b151590565b6001600160a01b031690565b63ffffffff1690565b67ffffffffffffffff1690565b60006113cf825b60006113cf82612059565b60005b838110156120b85781810151838201526020016120a0565b83811115611d535750506000910152565b601f01601f191690565b6120dc81612059565b81146103fc57600080fd5b6120dc81612064565b6120dc816103a7565b6120dc8161207e56fea365627a7a723158200d11a8cff7227cbc4528143740c418a2f4d7185f28be3065ea838f7a9c1a75806c6578706572696d656e74616cf564736f6c63430005100040000000000000000000000000b64ff7a4a33acdf48d97dab0d764afd0f6176882000000000000000000000000242a3df52c375bee81b1c668741d7c63af68fdd2

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000b64ff7a4a33acdf48d97dab0d764afd0f6176882000000000000000000000000242a3df52c375bee81b1c668741d7c63af68fdd2

-----Decoded View---------------
Arg [0] : _owner (address): 0xb64ff7a4a33acdf48d97dab0d764afd0f6176882
Arg [1] : _resolver (address): 0x242a3df52c375bee81b1c668741d7c63af68fdd2

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b64ff7a4a33acdf48d97dab0d764afd0f6176882
Arg [1] : 000000000000000000000000242a3df52c375bee81b1c668741d7c63af68fdd2


Library Used

SafeDecimalMath : 0x1a60e2e2a8be0bc2b6381dd31fd3fd5f9a28de4c

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading