Address Details
contract

0x4d67E77aD6CBe472A66164EB8959062BC6Ee7EE4

Creator
0x4c828d–78dc3e at 0xc803b4–3a97c5
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
20 Transactions
Transfers
0 Transfers
Gas Used
1,292,957
Last Balance Update
11827942
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
UbeswapOrderBook




Optimization enabled
true
Compiler version
v0.8.11+commit.d7f03943




Optimization runs
1000000
EVM Version
london




Verified at
2022-03-06T03:10:22.727186Z

contracts/UbeswapOrderBook.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.8.11;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

import "./OrderBook.sol";

/// @title Public Ubeswap order book
contract UbeswapOrderBook is OrderBook, Ownable {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    /// @notice Maximum fee is 10 bps
    uint256 public constant MAX_FEE = 1_000;
    /// @notice Denominator for the fee
    uint256 public constant FEE_DENOMINATOR = 1_000_000;

    /// @notice Fee for broadcasting an order. Always divided by FEE_DENOMINATOR
    uint256 public fee;

    /// @notice Fee recipient
    address public feeRecipient;

    event FeeChanged(uint256 oldFee, uint256 newFee);
    event FeeRecipientChanged(address oldFeeRecipient, address newFeeRecipient);

    constructor(
        LimitOrderProtocol _limitOrderProtocol,
        uint256 _fee,
        address _feeRecipient
    ) OrderBook(_limitOrderProtocol) {
        require(_fee <= MAX_FEE, "UOB: Fee exceeds MAX_FEE");
        fee = _fee;
        feeRecipient = _feeRecipient;
    }

    function changeFee(uint256 _fee) external onlyOwner {
        require(_fee <= MAX_FEE, "UOB: Fee exceeds MAX_FEE");
        emit FeeChanged(fee, _fee);
        fee = _fee;
    }

    function changeFeeRecipient(address _feeRecipient) external onlyOwner {
        emit FeeRecipientChanged(feeRecipient, _feeRecipient);
        feeRecipient = _feeRecipient;
    }

    function broadcastOrder(
        LimitOrderProtocol.Order memory _order,
        bytes calldata _signature
    ) public {
        if (feeRecipient != address(0) && fee > 0) {
            uint256 feeAmount = _order.makingAmount.mul(fee).div(FEE_DENOMINATOR);
            if (feeAmount > 0) {
                IERC20(_order.makerAsset).safeTransferFrom(
                    msg.sender,
                    feeRecipient,
                    feeAmount
                );
            }
        }
        _broadcastOrder(_order, _signature);
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_limitOrderProtocol","internalType":"contract LimitOrderProtocol"},{"type":"uint256","name":"_fee","internalType":"uint256"},{"type":"address","name":"_feeRecipient","internalType":"address"}]},{"type":"event","name":"FeeChanged","inputs":[{"type":"uint256","name":"oldFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"newFee","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"FeeRecipientChanged","inputs":[{"type":"address","name":"oldFeeRecipient","internalType":"address","indexed":false},{"type":"address","name":"newFeeRecipient","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OrderBroadcasted","inputs":[{"type":"address","name":"maker","internalType":"address","indexed":true},{"type":"bytes32","name":"orderHash","internalType":"bytes32","indexed":true},{"type":"tuple","name":"order","internalType":"struct OrderMixin.Order","indexed":false,"components":[{"type":"uint256","name":"salt","internalType":"uint256"},{"type":"address","name":"makerAsset","internalType":"address"},{"type":"address","name":"takerAsset","internalType":"address"},{"type":"address","name":"maker","internalType":"address"},{"type":"address","name":"receiver","internalType":"address"},{"type":"address","name":"allowedSender","internalType":"address"},{"type":"uint256","name":"makingAmount","internalType":"uint256"},{"type":"uint256","name":"takingAmount","internalType":"uint256"},{"type":"bytes","name":"makerAssetData","internalType":"bytes"},{"type":"bytes","name":"takerAssetData","internalType":"bytes"},{"type":"bytes","name":"getMakerAmount","internalType":"bytes"},{"type":"bytes","name":"getTakerAmount","internalType":"bytes"},{"type":"bytes","name":"predicate","internalType":"bytes"},{"type":"bytes","name":"permit","internalType":"bytes"},{"type":"bytes","name":"interaction","internalType":"bytes"}]},{"type":"bytes","name":"signature","internalType":"bytes","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":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"FEE_DENOMINATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_FEE","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"broadcastOrder","inputs":[{"type":"tuple","name":"_order","internalType":"struct OrderMixin.Order","components":[{"type":"uint256","name":"salt","internalType":"uint256"},{"type":"address","name":"makerAsset","internalType":"address"},{"type":"address","name":"takerAsset","internalType":"address"},{"type":"address","name":"maker","internalType":"address"},{"type":"address","name":"receiver","internalType":"address"},{"type":"address","name":"allowedSender","internalType":"address"},{"type":"uint256","name":"makingAmount","internalType":"uint256"},{"type":"uint256","name":"takingAmount","internalType":"uint256"},{"type":"bytes","name":"makerAssetData","internalType":"bytes"},{"type":"bytes","name":"takerAssetData","internalType":"bytes"},{"type":"bytes","name":"getMakerAmount","internalType":"bytes"},{"type":"bytes","name":"getTakerAmount","internalType":"bytes"},{"type":"bytes","name":"predicate","internalType":"bytes"},{"type":"bytes","name":"permit","internalType":"bytes"},{"type":"bytes","name":"interaction","internalType":"bytes"}]},{"type":"bytes","name":"_signature","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeFee","inputs":[{"type":"uint256","name":"_fee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeFeeRecipient","inputs":[{"type":"address","name":"_feeRecipient","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"fee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"feeRecipient","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract LimitOrderProtocol"}],"name":"limitOrderProtocol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
              

Contract Creation Code

0x60a06040523480156200001157600080fd5b5060405162001a0938038062001a09833981016040819052620000349162000138565b6001600160a01b0383166080526200004c33620000cf565b6103e8821115620000a35760405162461bcd60e51b815260206004820152601860248201527f554f423a204665652065786365656473204d41585f4645450000000000000000604482015260640160405180910390fd5b600191909155600280546001600160a01b0319166001600160a01b039092169190911790555062000180565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200013557600080fd5b50565b6000806000606084860312156200014e57600080fd5b83516200015b816200011f565b60208501516040860151919450925062000175816200011f565b809150509250925092565b608051611866620001a36000396000818161016001526107f601526118666000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80637f94dd3311610081578063d73792a91161005b578063d73792a9146101b7578063ddca3f43146101c1578063f2fde38b146101ca57600080fd5b80637f94dd331461015b5780638da5cb5b14610182578063bc063e1a146101a057600080fd5b80636a1db1bf116100b25780636a1db1bf1461012d578063715018a6146101405780637bea11b81461014857600080fd5b806323604071146100ce57806346904840146100e3575b600080fd5b6100e16100dc366004611074565b6101dd565b005b6002546101039073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100e161013b36600461108f565b6102fe565b6100e161042c565b6100e16101563660046111ee565b6104b9565b6101037f000000000000000000000000000000000000000000000000000000000000000081565b60005473ffffffffffffffffffffffffffffffffffffffff16610103565b6101a96103e881565b604051908152602001610124565b6101a9620f424081565b6101a960015481565b6100e16101d8366004611074565b610557565b60005473ffffffffffffffffffffffffffffffffffffffff163314610263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6002546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527f0bc21fe5c3ab742ff1d15b5c4477ffbacf1167e618228078fa625edebe7f331d910160405180910390a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461037f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161025a565b6103e88111156103eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f554f423a204665652065786365656473204d41585f4645450000000000000000604482015260640161025a565b60015460408051918252602082018390527f5fc463da23c1b063e66f9e352006a7fbe8db7223c455dc429e881a2dfe2f94f1910160405180910390a1600155565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161025a565b6104b76000610687565b565b60025473ffffffffffffffffffffffffffffffffffffffff16158015906104e257506000600154115b1561054757600061050f620f42406105096001548760c001516106fc90919063ffffffff16565b9061070f565b905080156105455760025460208501516105459173ffffffffffffffffffffffffffffffffffffffff918216913391168461071b565b505b6105528383836107b6565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161025a565b73ffffffffffffffffffffffffffffffffffffffff811661067b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161025a565b61068481610687565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006107088284611410565b9392505050565b6000610708828461144d565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526107b0908590610976565b50505050565b6040517ffa1cb9f200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063fa1cb9f29061082b9087906004016116ad565b602060405180830381865afa158015610848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c91906116c0565b90506108b384606001518285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a8292505050565b610919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4f423a20626164207369676e6174757265000000000000000000000000000000604482015260640161025a565b80846060015173ffffffffffffffffffffffffffffffffffffffff167fc1624a2e52e06ce4ecf1f54498e7975056bb10117cd7fd48b6277fe4aa14ee1d868686604051610968939291906116d9565b60405180910390a350505050565b60006109d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610c719092919063ffffffff16565b80519091501561055257808060200190518101906109f6919061173d565b610552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161025a565b6000806000610a918585610c88565b90925090506000816004811115610aaa57610aaa61175f565b148015610ae257508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15610af257600192505050610708565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b8888604051602401610b2792919061178e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610bb091906117a7565b600060405180830381855afa9150503d8060008114610beb576040519150601f19603f3d011682016040523d82523d6000602084013e610bf0565b606091505b5091509150818015610c03575080516020145b8015610c65575080517f1626ba7e0000000000000000000000000000000000000000000000000000000090610c4190830160209081019084016117c3565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b98975050505050505050565b6060610c808484600085610cf8565b949350505050565b600080825160411415610cbf5760208301516040840151606085015160001a610cb387828585610e8e565b94509450505050610cf1565b825160401415610ce95760208301516040840151610cde868383610fa6565b935093505050610cf1565b506000905060025b9250929050565b606082471015610d8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161025a565b73ffffffffffffffffffffffffffffffffffffffff85163b610e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161025a565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610e3191906117a7565b60006040518083038185875af1925050503d8060008114610e6e576040519150601f19603f3d011682016040523d82523d6000602084013e610e73565b606091505b5091509150610e83828286610ff8565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610ec55750600090506003610f9d565b8460ff16601b14158015610edd57508460ff16601c14155b15610eee5750600090506004610f9d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610f42573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610f9657600060019250925050610f9d565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831681610fdc60ff86901c601b611805565b9050610fea87828885610e8e565b935093505050935093915050565b60608315611007575081610708565b8251156110175782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025a919061181d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461106f57600080fd5b919050565b60006020828403121561108657600080fd5b6107088261104b565b6000602082840312156110a157600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101e0810167ffffffffffffffff811182821017156110fb576110fb6110a8565b60405290565b600082601f83011261111257600080fd5b813567ffffffffffffffff8082111561112d5761112d6110a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611173576111736110a8565b8160405283815286602085880101111561118c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008083601f8401126111be57600080fd5b50813567ffffffffffffffff8111156111d657600080fd5b602083019150836020828501011115610cf157600080fd5b60008060006040848603121561120357600080fd5b833567ffffffffffffffff8082111561121b57600080fd5b908501906101e0828803121561123057600080fd5b6112386110d7565b823581526112486020840161104b565b60208201526112596040840161104b565b604082015261126a6060840161104b565b606082015261127b6080840161104b565b608082015261128c60a0840161104b565b60a082015260c083013560c082015260e083013560e082015261010080840135838111156112b957600080fd5b6112c58a828701611101565b82840152505061012080840135838111156112df57600080fd5b6112eb8a828701611101565b828401525050610140808401358381111561130557600080fd5b6113118a828701611101565b828401525050610160808401358381111561132b57600080fd5b6113378a828701611101565b828401525050610180808401358381111561135157600080fd5b61135d8a828701611101565b8284015250506101a0808401358381111561137757600080fd5b6113838a828701611101565b8284015250506101c0808401358381111561139d57600080fd5b6113a98a828701611101565b8284015250508095505060208601359150808211156113c757600080fd5b506113d4868287016111ac565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611448576114486113e1565b500290565b600082611483577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b838110156114a357818101518382015260200161148b565b838111156107b05750506000910152565b600081518084526114cc816020860160208601611488565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006101e082518452602083015161152e602086018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151611556604086018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015161157e606086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060808301516115a6608086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a08301516115ce60a086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015160c085015260e083015160e08501526101008084015182828701526115fb838701826114b4565b92505050610120808401518583038287015261161783826114b4565b92505050610140808401518583038287015261163383826114b4565b92505050610160808401518583038287015261164f83826114b4565b92505050610180808401518583038287015261166b83826114b4565b925050506101a0808401518583038287015261168783826114b4565b925050506101c080840151858303828701526116a383826114b4565b9695505050505050565b60208152600061070860208301846114fe565b6000602082840312156116d257600080fd5b5051919050565b6040815260006116ec60408301866114fe565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b60006020828403121561174f57600080fd5b8151801515811461070857600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b828152604060208201526000610c8060408301846114b4565b600082516117b9818460208701611488565b9190910192915050565b6000602082840312156117d557600080fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461070857600080fd5b60008219821115611818576118186113e1565b500190565b60208152600061070860208301846114b456fea26469706673582212202b82cf79827d00453bf66024c1b7ec54cc22d41b586bb9a557ab173617633dc564736f6c634300080b00330000000000000000000000008a9869c4ba45041a1b853b81fb3006739c98c5eb00000000000000000000000000000000000000000000000000000000000001f400000000000000000000000097a9681612482a22b7877afbf8430edc76159cae

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100c95760003560e01c80637f94dd3311610081578063d73792a91161005b578063d73792a9146101b7578063ddca3f43146101c1578063f2fde38b146101ca57600080fd5b80637f94dd331461015b5780638da5cb5b14610182578063bc063e1a146101a057600080fd5b80636a1db1bf116100b25780636a1db1bf1461012d578063715018a6146101405780637bea11b81461014857600080fd5b806323604071146100ce57806346904840146100e3575b600080fd5b6100e16100dc366004611074565b6101dd565b005b6002546101039073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100e161013b36600461108f565b6102fe565b6100e161042c565b6100e16101563660046111ee565b6104b9565b6101037f0000000000000000000000008a9869c4ba45041a1b853b81fb3006739c98c5eb81565b60005473ffffffffffffffffffffffffffffffffffffffff16610103565b6101a96103e881565b604051908152602001610124565b6101a9620f424081565b6101a960015481565b6100e16101d8366004611074565b610557565b60005473ffffffffffffffffffffffffffffffffffffffff163314610263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6002546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527f0bc21fe5c3ab742ff1d15b5c4477ffbacf1167e618228078fa625edebe7f331d910160405180910390a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461037f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161025a565b6103e88111156103eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f554f423a204665652065786365656473204d41585f4645450000000000000000604482015260640161025a565b60015460408051918252602082018390527f5fc463da23c1b063e66f9e352006a7fbe8db7223c455dc429e881a2dfe2f94f1910160405180910390a1600155565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161025a565b6104b76000610687565b565b60025473ffffffffffffffffffffffffffffffffffffffff16158015906104e257506000600154115b1561054757600061050f620f42406105096001548760c001516106fc90919063ffffffff16565b9061070f565b905080156105455760025460208501516105459173ffffffffffffffffffffffffffffffffffffffff918216913391168461071b565b505b6105528383836107b6565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161025a565b73ffffffffffffffffffffffffffffffffffffffff811661067b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161025a565b61068481610687565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006107088284611410565b9392505050565b6000610708828461144d565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526107b0908590610976565b50505050565b6040517ffa1cb9f200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008a9869c4ba45041a1b853b81fb3006739c98c5eb169063fa1cb9f29061082b9087906004016116ad565b602060405180830381865afa158015610848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c91906116c0565b90506108b384606001518285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a8292505050565b610919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4f423a20626164207369676e6174757265000000000000000000000000000000604482015260640161025a565b80846060015173ffffffffffffffffffffffffffffffffffffffff167fc1624a2e52e06ce4ecf1f54498e7975056bb10117cd7fd48b6277fe4aa14ee1d868686604051610968939291906116d9565b60405180910390a350505050565b60006109d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610c719092919063ffffffff16565b80519091501561055257808060200190518101906109f6919061173d565b610552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161025a565b6000806000610a918585610c88565b90925090506000816004811115610aaa57610aaa61175f565b148015610ae257508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15610af257600192505050610708565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b8888604051602401610b2792919061178e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610bb091906117a7565b600060405180830381855afa9150503d8060008114610beb576040519150601f19603f3d011682016040523d82523d6000602084013e610bf0565b606091505b5091509150818015610c03575080516020145b8015610c65575080517f1626ba7e0000000000000000000000000000000000000000000000000000000090610c4190830160209081019084016117c3565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b98975050505050505050565b6060610c808484600085610cf8565b949350505050565b600080825160411415610cbf5760208301516040840151606085015160001a610cb387828585610e8e565b94509450505050610cf1565b825160401415610ce95760208301516040840151610cde868383610fa6565b935093505050610cf1565b506000905060025b9250929050565b606082471015610d8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161025a565b73ffffffffffffffffffffffffffffffffffffffff85163b610e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161025a565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610e3191906117a7565b60006040518083038185875af1925050503d8060008114610e6e576040519150601f19603f3d011682016040523d82523d6000602084013e610e73565b606091505b5091509150610e83828286610ff8565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610ec55750600090506003610f9d565b8460ff16601b14158015610edd57508460ff16601c14155b15610eee5750600090506004610f9d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610f42573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610f9657600060019250925050610f9d565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831681610fdc60ff86901c601b611805565b9050610fea87828885610e8e565b935093505050935093915050565b60608315611007575081610708565b8251156110175782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025a919061181d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461106f57600080fd5b919050565b60006020828403121561108657600080fd5b6107088261104b565b6000602082840312156110a157600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101e0810167ffffffffffffffff811182821017156110fb576110fb6110a8565b60405290565b600082601f83011261111257600080fd5b813567ffffffffffffffff8082111561112d5761112d6110a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611173576111736110a8565b8160405283815286602085880101111561118c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008083601f8401126111be57600080fd5b50813567ffffffffffffffff8111156111d657600080fd5b602083019150836020828501011115610cf157600080fd5b60008060006040848603121561120357600080fd5b833567ffffffffffffffff8082111561121b57600080fd5b908501906101e0828803121561123057600080fd5b6112386110d7565b823581526112486020840161104b565b60208201526112596040840161104b565b604082015261126a6060840161104b565b606082015261127b6080840161104b565b608082015261128c60a0840161104b565b60a082015260c083013560c082015260e083013560e082015261010080840135838111156112b957600080fd5b6112c58a828701611101565b82840152505061012080840135838111156112df57600080fd5b6112eb8a828701611101565b828401525050610140808401358381111561130557600080fd5b6113118a828701611101565b828401525050610160808401358381111561132b57600080fd5b6113378a828701611101565b828401525050610180808401358381111561135157600080fd5b61135d8a828701611101565b8284015250506101a0808401358381111561137757600080fd5b6113838a828701611101565b8284015250506101c0808401358381111561139d57600080fd5b6113a98a828701611101565b8284015250508095505060208601359150808211156113c757600080fd5b506113d4868287016111ac565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611448576114486113e1565b500290565b600082611483577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b838110156114a357818101518382015260200161148b565b838111156107b05750506000910152565b600081518084526114cc816020860160208601611488565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006101e082518452602083015161152e602086018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151611556604086018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015161157e606086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060808301516115a6608086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a08301516115ce60a086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015160c085015260e083015160e08501526101008084015182828701526115fb838701826114b4565b92505050610120808401518583038287015261161783826114b4565b92505050610140808401518583038287015261163383826114b4565b92505050610160808401518583038287015261164f83826114b4565b92505050610180808401518583038287015261166b83826114b4565b925050506101a0808401518583038287015261168783826114b4565b925050506101c080840151858303828701526116a383826114b4565b9695505050505050565b60208152600061070860208301846114fe565b6000602082840312156116d257600080fd5b5051919050565b6040815260006116ec60408301866114fe565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b60006020828403121561174f57600080fd5b8151801515811461070857600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b828152604060208201526000610c8060408301846114b4565b600082516117b9818460208701611488565b9190910192915050565b6000602082840312156117d557600080fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461070857600080fd5b60008219821115611818576118186113e1565b500190565b60208152600061070860208301846114b456fea26469706673582212202b82cf79827d00453bf66024c1b7ec54cc22d41b586bb9a557ab173617633dc564736f6c634300080b0033