Contract
0xcaf870dad882b00f4b20d714bbf7fceada5e4195
2
Contract Overview
Balance:
0 MATIC
My Name Tag:
Not Available
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x790f993f1f787e0a791400059e6bde5a3b147d2db5fa85418b3d27de2a33c589 | 0x60c06040 | 28197314 | 189 days 12 hrs ago | 0xfa9da51631268a30ec3ddd1ccbf46c65fad99251 | IN | Create: AnycallProxy_SushiSwap | 0 MATIC | 0.006008155033 |
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
AnycallProxy_SushiSwap
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-10-10 */ // SPDX-License-Identifier: GPL-3.0-or-later // Sources flattened with hardhat v2.11.2 https://hardhat.org // File contracts/access/MPCManageable.sol pragma solidity ^0.8.10; abstract contract MPCManageable { address public mpc; address public pendingMPC; uint256 public constant delay = 2 days; uint256 public delayMPC; modifier onlyMPC() { require(msg.sender == mpc, "MPC: only mpc"); _; } event LogChangeMPC( address indexed oldMPC, address indexed newMPC, uint256 effectiveTime ); event LogApplyMPC( address indexed oldMPC, address indexed newMPC, uint256 applyTime ); constructor(address _mpc) { require(_mpc != address(0), "MPC: mpc is the zero address"); mpc = _mpc; emit LogChangeMPC(address(0), mpc, block.timestamp); } function changeMPC(address _mpc) external onlyMPC { require(_mpc != address(0), "MPC: mpc is the zero address"); pendingMPC = _mpc; delayMPC = block.timestamp + delay; emit LogChangeMPC(mpc, pendingMPC, delayMPC); } // only the `pendingMPC` can `apply` // except when `pendingMPC` is a contract, then `mpc` can also `apply` // in case `pendingMPC` has no `apply` wrapper method and cannot `apply` function applyMPC() external { require( msg.sender == pendingMPC || (msg.sender == mpc && address(pendingMPC).code.length > 0), "MPC: only pending mpc" ); require( delayMPC > 0 && block.timestamp >= delayMPC, "MPC: time before delayMPC" ); emit LogApplyMPC(mpc, pendingMPC, block.timestamp); mpc = pendingMPC; pendingMPC = address(0); delayMPC = 0; } } // File contracts/router/interfaces/IAnycallProxy.sol pragma solidity ^0.8.10; /// IAnycallProxy interface of the anycall proxy /// Note: `receiver` is the `fallback receive address` when exec failed. interface IAnycallProxy { function exec( address token, address receiver, uint256 amount, bytes calldata data ) external returns (bool success, bytes memory result); } // File contracts/router/proxy/AnycallProxyBase.sol pragma solidity ^0.8.10; abstract contract AnycallProxyBase is MPCManageable, IAnycallProxy { mapping(address => bool) public supportedCaller; modifier onlyAuth() { require(supportedCaller[msg.sender], "AnycallProxyBase: only auth"); _; } constructor(address mpc_, address caller_) MPCManageable(mpc_) { supportedCaller[caller_] = true; } function addSupportedCaller(address caller) external onlyMPC { supportedCaller[caller] = true; } function removeSupportedCaller(address caller) external onlyMPC { supportedCaller[caller] = false; } } // File contracts/router/interfaces/IwNATIVE.sol pragma solidity ^0.8.10; interface IwNATIVE { function deposit() external payable; function withdraw(uint256) external; } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/router/proxy/SushiSwapProxy.sol pragma solidity ^0.8.10; library SafeMathSushiswap { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { unchecked { require((z = x + y) >= x, "ds-math-add-overflow"); } } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { unchecked { require((z = x - y) <= x, "ds-math-sub-underflow"); } } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { unchecked { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } } } interface ISushiswapV2Factory { function getPair(address tokenA, address tokenB) external view returns (address pair); } interface ISushiswapV2Pair { function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; } library SushiswapV2Library { using SafeMathSushiswap for uint256; // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "SushiswapV2Library: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "SushiswapV2Library: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external calls function pairFor( address factory, address tokenA, address tokenB ) internal view returns (address pair) { return ISushiswapV2Factory(factory).getPair(tokenA, tokenB); } // fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = ISushiswapV2Pair( pairFor(factory, tokenA, tokenB) ).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, "SushiswapV2Library: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "SushiswapV2Library: INSUFFICIENT_LIQUIDITY" ); uint256 amountInWithFee = amountIn.mul(997); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require( amountOut > 0, "SushiswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT" ); require( reserveIn > 0 && reserveOut > 0, "SushiswapV2Library: INSUFFICIENT_LIQUIDITY" ); uint256 numerator = reserveIn.mul(amountOut).mul(1000); uint256 denominator = reserveOut.sub(amountOut).mul(997); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "SushiswapV2Library: INVALID_PATH"); amounts = new uint256[](path.length); amounts[0] = amountIn; for (uint256 i; i < path.length - 1; i++) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i], path[i + 1] ); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "SushiswapV2Library: INVALID_PATH"); amounts = new uint256[](path.length); amounts[amounts.length - 1] = amountOut; for (uint256 i = path.length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i - 1], path[i] ); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } } contract AnycallProxy_SushiSwap is AnycallProxyBase { using SafeMathSushiswap for uint256; using SafeERC20 for IERC20; address public immutable sushiFactory; address public immutable wNATIVE; event TokenSwap( address indexed token, address indexed receiver, uint256 amount ); event TokenBack( address indexed token, address indexed receiver, uint256 amount ); event ExecFailed(); constructor( address mpc_, address caller_, address sushiV2Factory_, address wNATIVE_ ) AnycallProxyBase(mpc_, caller_) { sushiFactory = sushiV2Factory_; wNATIVE = wNATIVE_; } struct AnycallInfo { uint256 amountOut; uint256 amountOutMin; uint256 amountInMax; address[] path; address receiver; uint256 deadline; bool toNative; } struct AnycallRes { address recvToken; address receiver; uint256 recvAmount; } function encode_anycall_info(AnycallInfo calldata info) public pure returns (bytes memory) { return abi.encode(info); } function decode_anycall_info(bytes memory data) public pure returns (AnycallInfo memory) { return abi.decode(data, (AnycallInfo)); } // impl `IAnycallProxy` interface // Note: take care of the situation when do the business failed. function exec( address token, address receiver, uint256 amount, bytes calldata data ) external onlyAuth returns (bool success, bytes memory result) { try this.execSwap(token, amount, data) returns ( bool succ, bytes memory res ) { (success, result) = (succ, res); } catch Error(string memory reason) { result = bytes(reason); } catch (bytes memory reason) { result = reason; } if (!success) { // process failure situation (eg. return token) IERC20(token).safeTransfer(receiver, amount); emit ExecFailed(); } } function execSwap( address token, uint256 amount, bytes calldata data ) external returns (bool success, bytes memory result) { require(msg.sender == address(this)); AnycallInfo memory anycallInfo = decode_anycall_info(data); require( anycallInfo.deadline >= block.timestamp, "SushiSwapAnycallProxy: EXPIRED" ); address receiver = anycallInfo.receiver; require(receiver != address(0), "SushiSwapAnycallProxy: zero receiver"); address[] memory path = anycallInfo.path; require(path.length >= 2, "SushiSwapAnycallProxy: invalid path length"); require( path[0] == token, "SushiSwapAnycallProxy: source token mismatch" ); require( anycallInfo.amountInMax <= amount, "SushiSwapAnycallProxy:EXCESSIVE_INPUT_AMOUNT" ); uint256 amountInMax = anycallInfo.amountInMax == 0 ? amount : anycallInfo.amountInMax; uint256[] memory amounts; if (anycallInfo.amountOut == 0) { amounts = swapExactTokensForTokens(anycallInfo, amountInMax); } else { amounts = swapTokensForExactTokens(anycallInfo, amountInMax); } IERC20(path[0]).safeTransfer( SushiswapV2Library.pairFor(sushiFactory, path[0], path[1]), amounts[0] ); address recvToken; uint256 recvAmount; if (anycallInfo.toNative) { require( path[path.length - 1] == wNATIVE, "SushiSwapAnycallProxy:INVALID_PATH" ); (recvToken, recvAmount) = _swap(amounts, path, address(this)); IwNATIVE(wNATIVE).withdraw(recvAmount); Address.sendValue(payable(receiver), recvAmount); recvToken = address(0); } else { (recvToken, recvAmount) = _swap(amounts, path, receiver); } emit TokenSwap(recvToken, receiver, recvAmount); uint256 leftAmount = amount.sub(amounts[0]); if (leftAmount > 0) { IERC20(path[0]).safeTransfer(receiver, leftAmount); emit TokenBack(token, receiver, leftAmount); } return (true, abi.encode(recvToken, recvAmount)); } function swapTokensForExactTokens( AnycallInfo memory anycallInfo, uint256 amountInMax ) internal view returns (uint256[] memory amounts) { amounts = SushiswapV2Library.getAmountsIn( sushiFactory, anycallInfo.amountOut, anycallInfo.path ); require( amounts[0] <= amountInMax, "SushiSwapAnycallProxy: EXCESSIVE_INPUT_AMOUNT" ); } function swapExactTokensForTokens( AnycallInfo memory anycallInfo, uint256 amountInMax ) internal view returns (uint256[] memory amounts) { amounts = SushiswapV2Library.getAmountsOut( sushiFactory, amountInMax, anycallInfo.path ); require( amounts[amounts.length - 1] >= anycallInfo.amountOutMin, "SushiSwapAnycallProxy: INSUFFICIENT_OUTPUT_AMOUNT" ); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap( uint256[] memory amounts, address[] memory path, address _to ) internal virtual returns (address, uint256) { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = SushiswapV2Library.sortTokens(input, output); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < path.length - 2 ? SushiswapV2Library.pairFor(sushiFactory, output, path[i + 2]) : _to; ISushiswapV2Pair( SushiswapV2Library.pairFor(sushiFactory, input, output) ).swap(amount0Out, amount1Out, to, new bytes(0)); } return (path[path.length - 1], amounts[amounts.length - 1]); } fallback() external payable { assert(msg.sender == wNATIVE); // only accept Native via fallback from the wNative contract } receive() external payable { assert(msg.sender == wNATIVE); // only accept Native via fallback from the wNative contract } // this contract is designed as a handler (not token pool) // it should have no token balance, but if it has we can withdraw them function skim(address token, address to) external onlyMPC { IERC20(token).safeTransfer(to, IERC20(token).balanceOf(address(this))); } }
[{"inputs":[{"internalType":"address","name":"mpc_","type":"address"},{"internalType":"address","name":"caller_","type":"address"},{"internalType":"address","name":"sushiV2Factory_","type":"address"},{"internalType":"address","name":"wNATIVE_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"ExecFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMPC","type":"address"},{"indexed":true,"internalType":"address","name":"newMPC","type":"address"},{"indexed":false,"internalType":"uint256","name":"applyTime","type":"uint256"}],"name":"LogApplyMPC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMPC","type":"address"},{"indexed":true,"internalType":"address","name":"newMPC","type":"address"},{"indexed":false,"internalType":"uint256","name":"effectiveTime","type":"uint256"}],"name":"LogChangeMPC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenSwap","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"addSupportedCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyMPC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mpc","type":"address"}],"name":"changeMPC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"decode_anycall_info","outputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"toNative","type":"bool"}],"internalType":"struct AnycallProxy_SushiSwap.AnycallInfo","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayMPC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"toNative","type":"bool"}],"internalType":"struct AnycallProxy_SushiSwap.AnycallInfo","name":"info","type":"tuple"}],"name":"encode_anycall_info","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"exec","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"execSwap","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mpc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingMPC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"removeSupportedCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supportedCaller","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wNATIVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162002b9138038062002b9183398101604081905262000034916200013b565b8383816001600160a01b038116620000925760405162461bcd60e51b815260206004820152601c60248201527f4d50433a206d706320697320746865207a65726f206164647265737300000000604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040514281529091907f581f388e3dd32e1bbf62a290f509c8245f9d0b71ef82614fb2b967ad0a10d5b99060200160405180910390a3506001600160a01b039081166000908152600360205260409020805460ff19166001179055928316608052501660a05250620001989050565b80516001600160a01b03811681146200013657600080fd5b919050565b600080600080608085870312156200015257600080fd5b6200015d856200011e565b93506200016d602086016200011e565b92506200017d604086016200011e565b91506200018d606086016200011e565b905092959194509250565b60805160a051612994620001fd6000396000818161010701528181610141015281816102e701528181610b980152610c6e0152600081816101c901528181610ae101528181610ffc015281816110c3015281816112d9015261131c01526129946000f3fe6080604052600436106100f75760003560e01c80637ba95c0d1161008a578063dc77b06511610059578063dc77b0651461033e578063e43b2d7a1461037e578063f75c2664146103ab578063f830e7b4146103cb57610136565b80637ba95c0d146102a85780638fd903f5146102d5578063a273487014610309578063b63b38d01461032957610136565b8063580e70d5116100c6578063580e70d5146102315780635b7b018c146102515780636a42b8f814610271578063712b772f1461028857610136565b806308cb277f1461016e578063160f10531461018e57806322984b24146101b757806328b7b0361461020357610136565b3661013657336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461013457610134611f20565b005b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461013457610134611f20565b34801561017a57600080fd5b50610134610189366004611f5e565b6103eb565b34801561019a57600080fd5b506101a460025481565b6040519081526020015b60405180910390f35b3480156101c357600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101ae565b34801561020f57600080fd5b5061022361021e366004611fbc565b61043f565b6040516101ae92919061207e565b34801561023d57600080fd5b5061013461024c366004611f5e565b6105c8565b34801561025d57600080fd5b5061013461026c366004611f5e565b610616565b34801561027d57600080fd5b506101a46202a30081565b34801561029457600080fd5b506101346102a3366004612099565b61070e565b3480156102b457600080fd5b506102c86102c3366004612163565b6107bb565b6040516101ae91906121e8565b3480156102e157600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031557600080fd5b5061022361032436600461228f565b610820565b34801561033557600080fd5b50610134610e23565b34801561034a57600080fd5b5061036e610359366004611f5e565b60036020526000908152604090205460ff1681565b60405190151581526020016101ae565b34801561038a57600080fd5b5061039e6103993660046122ea565b610f75565b6040516101ae9190612324565b3480156103b757600080fd5b506000546101eb906001600160a01b031681565b3480156103d757600080fd5b506001546101eb906001600160a01b031681565b6000546001600160a01b0316331461041e5760405162461bcd60e51b815260040161041590612337565b60405180910390fd5b6001600160a01b03166000908152600360205260409020805460ff19169055565b3360009081526003602052604081205460609060ff166104a15760405162461bcd60e51b815260206004820152601b60248201527f416e7963616c6c50726f7879426173653a206f6e6c79206175746800000000006044820152606401610415565b604051630a27348760e41b8152309063a2734870906104ca908a9089908990899060040161235e565b6000604051808303816000875af192505050801561050a57506040513d6000823e601f3d908101601f1916820160405261050791908101906123bf565b60015b61057557610516612456565b806308c379a00361053c575061052a612472565b80610535575061053e565b905061057b565b505b3d808015610568576040519150601f19603f3d011682016040523d82523d6000602084013e61056d565b606091505b50905061057b565b90925090505b816105be576105946001600160a01b0388168787610f9e565b6040517fe69286e288e25c909ac0af2692544679c0a9006c720e282a6e9a257bb2b1442790600090a15b9550959350505050565b6000546001600160a01b031633146105f25760405162461bcd60e51b815260040161041590612337565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000546001600160a01b031633146106405760405162461bcd60e51b815260040161041590612337565b6001600160a01b0381166106965760405162461bcd60e51b815260206004820152601c60248201527f4d50433a206d706320697320746865207a65726f2061646472657373000000006044820152606401610415565b600180546001600160a01b0319166001600160a01b0383161790556106be6202a30042612511565b60028190556001546000546040519283526001600160a01b03918216929116907f581f388e3dd32e1bbf62a290f509c8245f9d0b71ef82614fb2b967ad0a10d5b99060200160405180910390a350565b6000546001600160a01b031633146107385760405162461bcd60e51b815260040161041590612337565b6040516370a0823160e01b81523060048201526107b79082906001600160a01b038516906370a0823190602401602060405180830381865afa158015610782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a69190612524565b6001600160a01b0385169190610f9e565b5050565b6108066040518060e001604052806000815260200160008152602001600081526020016060815260200160006001600160a01b03168152602001600081526020016000151581525090565b8180602001905181019061081a91906125d1565b92915050565b6000606033301461083057600080fd5b600061087185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506107bb92505050565b9050428160a0015110156108c75760405162461bcd60e51b815260206004820152601e60248201527f537573686953776170416e7963616c6c50726f78793a204558504952454400006044820152606401610415565b60808101516001600160a01b03811661092e5760405162461bcd60e51b8152602060048201526024808201527f537573686953776170416e7963616c6c50726f78793a207a65726f207265636560448201526334bb32b960e11b6064820152608401610415565b60608201518051600211156109985760405162461bcd60e51b815260206004820152602a60248201527f537573686953776170416e7963616c6c50726f78793a20696e76616c696420706044820152690c2e8d040d8cadccee8d60b31b6064820152608401610415565b886001600160a01b0316816000815181106109b5576109b5612687565b60200260200101516001600160a01b031614610a285760405162461bcd60e51b815260206004820152602c60248201527f537573686953776170416e7963616c6c50726f78793a20736f7572636520746f60448201526b0d6cadc40dad2e6dac2e8c6d60a31b6064820152608401610415565b8783604001511115610a915760405162461bcd60e51b815260206004820152602c60248201527f537573686953776170416e7963616c6c50726f78793a4558434553534956455f60448201526b125394155517d05353d5539560a21b6064820152608401610415565b60008360400151600014610aa9578360400151610aab565b885b905060608460000151600003610acc57610ac58583610ff5565b9050610ad9565b610ad685836110bc565b90505b610b89610b3b7f000000000000000000000000000000000000000000000000000000000000000085600081518110610b1357610b13612687565b602002602001015186600181518110610b2e57610b2e612687565b6020026020010151611173565b82600081518110610b4e57610b4e612687565b602002602001015185600081518110610b6957610b69612687565b60200260200101516001600160a01b0316610f9e9092919063ffffffff16565b6000808660c0015115610ce5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168560018751610bcf919061269d565b81518110610bdf57610bdf612687565b60200260200101516001600160a01b031614610c485760405162461bcd60e51b815260206004820152602260248201527f537573686953776170416e7963616c6c50726f78793a494e56414c49445f50416044820152610a8960f31b6064820152608401610415565b610c538386306111f3565b604051632e1a7d4d60e01b81526004810182905291935091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015610cba57600080fd5b505af1158015610cce573d6000803e3d6000fd5b50505050610cdc8682611446565b60009150610cf6565b610cf08386886111f3565b90925090505b856001600160a01b0316826001600160a01b03167f9d3e64e0b9bc617a229c24a7aa25ef6c9c775a1998f32e31dde4da03c467dc0e83604051610d3b91815260200190565b60405180910390a36000610d7284600081518110610d5b57610d5b612687565b60200260200101518e61155f90919063ffffffff16565b90508015610de057610d92878288600081518110610b6957610b69612687565b866001600160a01b03168e6001600160a01b03167f353a6c8294e9701b5dc4d2c67c534aec1a7ddca8daee2a72b026add9d52102d083604051610dd791815260200190565b60405180910390a35b604080516001600160a01b038516602082015290810183905260019060600160405160208183030381529060405299509950505050505050505094509492505050565b6001546001600160a01b0316331480610e5c57506000546001600160a01b031633148015610e5c57506001546001600160a01b03163b15155b610ea05760405162461bcd60e51b81526020600482015260156024820152744d50433a206f6e6c792070656e64696e67206d706360581b6044820152606401610415565b6000600254118015610eb457506002544210155b610f005760405162461bcd60e51b815260206004820152601960248201527f4d50433a2074696d65206265666f72652064656c61794d5043000000000000006044820152606401610415565b6001546000546040514281526001600160a01b0392831692909116907f8d32c9dd498e08090b44a0f77fe9ec0278851f9dffc4b430428411243e7df0769060200160405180910390a360018054600080546001600160a01b03199081166001600160a01b038416178255909116909155600255565b606081604051602001610f889190612704565b6040516020818303038152906040529050919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ff09084906115aa565b505050565b60606110267f000000000000000000000000000000000000000000000000000000000000000083856060015161167c565b90508260200151816001835161103c919061269d565b8151811061104c5761104c612687565b6020026020010151101561081a5760405162461bcd60e51b815260206004820152603160248201527f537573686953776170416e7963616c6c50726f78793a20494e5355464649434960448201527011539517d3d55514155517d05353d55395607a1b6064820152608401610415565b60606110f17f000000000000000000000000000000000000000000000000000000000000000084600001518560600151611806565b9050818160008151811061110757611107612687565b6020026020010151111561081a5760405162461bcd60e51b815260206004820152602d60248201527f537573686953776170416e7963616c6c50726f78793a2045584345535349564560448201526c17d25394155517d05353d55395609a1b6064820152608401610415565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a4390590604401602060405180830381865afa1580156111c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e991906127c2565b90505b9392505050565b60008060005b60018551611207919061269d565b8110156113eb5760008086838151811061122357611223612687565b6020026020010151878460016112399190612511565b8151811061124957611249612687565b60200260200101519150915060006112618383611986565b509050600089611272866001612511565b8151811061128257611282612687565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146112b0578260006112b4565b6000835b91509150600060028c516112c8919061269d565b88106112d4578a611315565b6113157f0000000000000000000000000000000000000000000000000000000000000000878e6113058c6002612511565b81518110610b2e57610b2e612687565b90506113427f00000000000000000000000000000000000000000000000000000000000000008888611173565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561137f576020820181803683370190505b506040518563ffffffff1660e01b815260040161139f94939291906127df565b600060405180830381600087803b1580156113b957600080fd5b505af11580156113cd573d6000803e3d6000fd5b505050505050505050505080806113e39061280c565b9150506111f9565b5083600185516113fb919061269d565b8151811061140b5761140b612687565b60200260200101518560018751611422919061269d565b8151811061143257611432612687565b602002602001015191509150935093915050565b804710156114965760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610415565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146114e3576040519150601f19603f3d011682016040523d82523d6000602084013e6114e8565b606091505b5050905080610ff05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610415565b8082038281111561081a5760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610415565b60006115ff826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a7f9092919063ffffffff16565b805190915015610ff0578080602001905181019061161d9190612825565b610ff05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610415565b60606002825110156116d05760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a20494e56414c49445f504154486044820152606401610415565b81516001600160401b038111156116e9576116e96120d2565b604051908082528060200260200182016040528015611712578160200160208202803683370190505b509050828160008151811061172957611729612687565b60200260200101818152505060005b60018351611746919061269d565b8110156117fe576000806117998786858151811061176657611766612687565b60200260200101518786600161177c9190612511565b8151811061178c5761178c612687565b6020026020010151611a8e565b915091506117c18484815181106117b2576117b2612687565b60200260200101518383611b58565b846117cd856001612511565b815181106117dd576117dd612687565b602002602001018181525050505080806117f69061280c565b915050611738565b509392505050565b606060028251101561185a5760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a20494e56414c49445f504154486044820152606401610415565b81516001600160401b03811115611873576118736120d2565b60405190808252806020026020018201604052801561189c578160200160208202803683370190505b5090508281600183516118af919061269d565b815181106118bf576118bf612687565b6020026020010181815250506000600183516118db919061269d565b90505b80156117fe5760008061192187866118f760018761269d565b8151811061190757611907612687565b602002602001015187868151811061178c5761178c612687565b9150915061194984848151811061193a5761193a612687565b60200260200101518383611c38565b8461195560018661269d565b8151811061196557611965612687565b6020026020010181815250505050808061197e90612842565b9150506118de565b600080826001600160a01b0316846001600160a01b0316036119fa5760405162461bcd60e51b815260206004820152602760248201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446044820152664452455353455360c81b6064820152608401610415565b826001600160a01b0316846001600160a01b031610611a1a578284611a1d565b83835b90925090506001600160a01b038216611a785760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a205a45524f5f414444524553536044820152606401610415565b9250929050565b60606111e98484600085611d13565b6000806000611a9d8585611986565b509050600080611aae888888611173565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611aeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0f9190612870565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614611b46578082611b49565b81815b90999098509650505050505050565b6000808411611bbf5760405162461bcd60e51b815260206004820152602d60248201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460448201526c17d25394155517d05353d55395609a1b6064820152608401610415565b600083118015611bcf5750600082115b611beb5760405162461bcd60e51b8152600401610415906128c0565b6000611bf9856103e5611e39565b90506000611c078285611e39565b90506000611c2183611c1b886103e8611e39565b90611e9d565b9050611c2d8183612920565b979650505050505050565b6000808411611ca05760405162461bcd60e51b815260206004820152602e60248201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460448201526d17d3d55514155517d05353d5539560921b6064820152608401610415565b600083118015611cb05750600082115b611ccc5760405162461bcd60e51b8152600401610415906128c0565b6000611ce46103e8611cde8688611e39565b90611e39565b90506000611cf86103e5611cde868961155f565b9050611d096001611c1b8385612920565b9695505050505050565b606082471015611d745760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610415565b6001600160a01b0385163b611dcb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610415565b600080866001600160a01b03168587604051611de79190612942565b60006040518083038185875af1925050503d8060008114611e24576040519150601f19603f3d011682016040523d82523d6000602084013e611e29565b606091505b5091509150611c2d828286611ee7565b6000811580611e5a57505080820282828281611e5757611e5761290a565b04145b61081a5760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b6044820152606401610415565b8082018281101561081a5760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b6044820152606401610415565b60608315611ef65750816111ec565b825115611f065782518084602001fd5b8160405162461bcd60e51b81526004016104159190612324565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114611f4b57600080fd5b50565b8035611f5981611f36565b919050565b600060208284031215611f7057600080fd5b81356111ec81611f36565b60008083601f840112611f8d57600080fd5b5081356001600160401b03811115611fa457600080fd5b602083019150836020828501011115611a7857600080fd5b600080600080600060808688031215611fd457600080fd5b8535611fdf81611f36565b94506020860135611fef81611f36565b93506040860135925060608601356001600160401b0381111561201157600080fd5b61201d88828901611f7b565b969995985093965092949392505050565b60005b83811015612049578181015183820152602001612031565b50506000910152565b6000815180845261206a81602086016020860161202e565b601f01601f19169290920160200192915050565b82151581526040602082015260006111e96040830184612052565b600080604083850312156120ac57600080fd5b82356120b781611f36565b915060208301356120c781611f36565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561210d5761210d6120d2565b6040525050565b60405160e081016001600160401b0381118282101715612136576121366120d2565b60405290565b60006001600160401b03821115612155576121556120d2565b50601f01601f191660200190565b60006020828403121561217557600080fd5b81356001600160401b0381111561218b57600080fd5b8201601f8101841361219c57600080fd5b80356121a78161213c565b6040516121b482826120e8565b8281528660208486010111156121c957600080fd5b8260208501602083013760009281016020019290925250949350505050565b60006020808352610100830184518285015281850151604085015260408501516060850152606085015160e06080860152818151808452610120870191508483019350600092505b808310156122595783516001600160a01b03168252928401926001929092019190840190612230565b5060808701516001600160a01b03811660a0880152935060a087015160c087015260c08701519350611d0960e087018515159052565b600080600080606085870312156122a557600080fd5b84356122b081611f36565b93506020850135925060408501356001600160401b038111156122d257600080fd5b6122de87828801611f7b565b95989497509550505050565b6000602082840312156122fc57600080fd5b81356001600160401b0381111561231257600080fd5b820160e081850312156111ec57600080fd5b6020815260006111ec6020830184612052565b6020808252600d908201526c4d50433a206f6e6c79206d706360981b604082015260600190565b6001600160a01b0385168152602081018490526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b8015158114611f4b57600080fd5b8051611f59816123a6565b600080604083850312156123d257600080fd5b82516123dd816123a6565b60208401519092506001600160401b038111156123f957600080fd5b8301601f8101851361240a57600080fd5b80516124158161213c565b60405161242282826120e8565b82815287602084860101111561243757600080fd5b61244883602083016020870161202e565b809450505050509250929050565b600060033d111561246f5760046000803e5060005160e01c5b90565b600060443d10156124805790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156124af57505050505090565b82850191508151818111156124c75750505050505090565b843d87010160208285010111156124e15750505050505090565b6124f0602082860101876120e8565b509095945050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561081a5761081a6124fb565b60006020828403121561253657600080fd5b5051919050565b8051611f5981611f36565b600082601f83011261255957600080fd5b815160206001600160401b03821115612574576125746120d2565b8160051b604051612587838301826120e8565b928352848101820192828101878511156125a057600080fd5b83870192505b848310156125c65782516125b981611f36565b81529183019183016125a6565b509695505050505050565b6000602082840312156125e357600080fd5b81516001600160401b03808211156125fa57600080fd5b9083019060e0828603121561260e57600080fd5b612616612114565b82518152602083015160208201526040830151604082015260608301518281111561264057600080fd5b61264c87828601612548565b60608301525061265e6080840161253d565b608082015260a083015160a082015261267960c084016123b4565b60c082015295945050505050565b634e487b7160e01b600052603260045260246000fd5b8181038181111561081a5761081a6124fb565b8183526000602080850194508260005b858110156126ee5781356126d381611f36565b6001600160a01b0316875295820195908201906001016126c0565b509495945050505050565b8035611f59816123a6565b6020815281356020820152602082013560408201526040820135606082015260006060830135601e1984360301811261273c57600080fd5b83016020810190356001600160401b0381111561275857600080fd5b8060051b360382131561276a57600080fd5b60e06080850152612780610100850182846126b0565b91505061278f60808501611f4e565b6001600160a01b03811660a08501525060a084013560c08401526127b560c085016126f9565b80151560e08501526117fe565b6000602082840312156127d457600080fd5b81516111ec81611f36565b84815283602082015260018060a01b0383166040820152608060608201526000611d096080830184612052565b60006001820161281e5761281e6124fb565b5060010190565b60006020828403121561283757600080fd5b81516111ec816123a6565b600081612851576128516124fb565b506000190190565b80516001600160701b0381168114611f5957600080fd5b60008060006060848603121561288557600080fd5b61288e84612859565b925061289c60208501612859565b9150604084015163ffffffff811681146128b557600080fd5b809150509250925092565b6020808252602a908201527f53757368697377617056324c6962726172793a20494e53554646494349454e546040820152695f4c495155494449545960b01b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261293d57634e487b7160e01b600052601260045260246000fd5b500490565b6000825161295481846020870161202e565b919091019291505056fea2646970667358221220fc6f1a71731c8a57461d996f90dde8db1cb52dcd23434c386575dfc198f197f364736f6c63430008110033000000000000000000000000b3f91051cd787a0d14ef806fbb7a11c8479668690000000000000000000000006afcff9189e8ed3fcc1cffa184feb1276f6a82a5000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c40000000000000000000000000bd19f6447cd676255c7c7b00428462b3da67e3a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b3f91051cd787a0d14ef806fbb7a11c8479668690000000000000000000000006afcff9189e8ed3fcc1cffa184feb1276f6a82a5000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c40000000000000000000000000bd19f6447cd676255c7c7b00428462b3da67e3a
-----Decoded View---------------
Arg [0] : mpc_ (address): 0xb3f91051cd787a0d14ef806fbb7a11c847966869
Arg [1] : caller_ (address): 0x6afcff9189e8ed3fcc1cffa184feb1276f6a82a5
Arg [2] : sushiV2Factory_ (address): 0xc35dadb65012ec5796536bd9864ed8773abc74c4
Arg [3] : wNATIVE_ (address): 0x0bd19f6447cd676255c7c7b00428462b3da67e3a
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000b3f91051cd787a0d14ef806fbb7a11c847966869
Arg [1] : 0000000000000000000000006afcff9189e8ed3fcc1cffa184feb1276f6a82a5
Arg [2] : 000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
Arg [3] : 0000000000000000000000000bd19f6447cd676255c7c7b00428462b3da67e3a
Deployed ByteCode Sourcemap
27097:7289:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33997:10;-1:-1:-1;;;;;34011:7:0;33997:21;;33990:29;;;;:::i;:::-;27097:7289;;33853:10;-1:-1:-1;;;;;33867:7:0;33853:21;;33846:29;;;;:::i;2891:114::-;;;;;;;;;;-1:-1:-1;2891:114:0;;;;;:::i;:::-;;:::i;330:23::-;;;;;;;;;;;;;;;;;;;819:25:1;;;807:2;792:18;330:23:0;;;;;;;;27233:37;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1128:32:1;;;1110:51;;1098:2;1083:18;27233:37:0;964:203:1;28647:722:0;;;;;;;;;;-1:-1:-1;28647:722:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2773:110::-;;;;;;;;;;-1:-1:-1;2773:110:0;;;;;:::i;:::-;;:::i;915:256::-;;;;;;;;;;-1:-1:-1;915:256:0;;;;;:::i;:::-;;:::i;285:38::-;;;;;;;;;;;;317:6;285:38;;34236:147;;;;;;;;;;-1:-1:-1;34236:147:0;;;;;:::i;:::-;;:::i;28352:178::-;;;;;;;;;;-1:-1:-1;28352:178:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27277:32::-;;;;;;;;;;;;;;;29377:2380;;;;;;;;;;-1:-1:-1;29377:2380:0;;;;;:::i;:::-;;:::i;1375:496::-;;;;;;;;;;;;;:::i;2470:47::-;;;;;;;;;;-1:-1:-1;2470:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7190:14:1;;7183:22;7165:41;;7153:2;7138:18;2470:47:0;7025:187:1;28179:165:0;;;;;;;;;;-1:-1:-1;28179:165:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;226:18::-;;;;;;;;;;-1:-1:-1;226:18:0;;;;-1:-1:-1;;;;;226:18:0;;;251:25;;;;;;;;;;-1:-1:-1;251:25:0;;;;-1:-1:-1;;;;;251:25:0;;;2891:114;414:3;;-1:-1:-1;;;;;414:3:0;400:10;:17;392:43;;;;-1:-1:-1;;;392:43:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;2966:23:0::1;2992:5;2966:23:::0;;;:15:::1;:23;::::0;;;;:31;;-1:-1:-1;;2966:31:0::1;::::0;;2891:114::o;28647:722::-;2581:10;28801:12;2565:27;;;:15;:27;;;;;;28815:19;;2565:27;;2557:67;;;;-1:-1:-1;;;2557:67:0;;8379:2:1;2557:67:0;;;8361:21:1;8418:2;8398:18;;;8391:30;8457:29;8437:18;;;8430:57;8504:18;;2557:67:0;8177:351:1;2557:67:0;28851:34:::1;::::0;-1:-1:-1;;;28851:34:0;;:4:::1;::::0;:13:::1;::::0;:34:::1;::::0;28865:5;;28872:6;;28880:4;;;;28851:34:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;28851:34:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;;;28847:327;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;29084:6:::0;-1:-1:-1;28847:327:0::1;;;;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;29156:6:0;-1:-1:-1;28847:327:0::1;;;28997:4:::0;;-1:-1:-1;29003:3:0;-1:-1:-1;28847:327:0::1;29189:7;29184:178;;29274:44;-1:-1:-1::0;;;;;29274:26:0;::::1;29301:8:::0;29311:6;29274:26:::1;:44::i;:::-;29338:12;::::0;::::1;::::0;;;::::1;29184:178;28647:722:::0;;;;;;;;:::o;2773:110::-;414:3;;-1:-1:-1;;;;;414:3:0;400:10;:17;392:43;;;;-1:-1:-1;;;392:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2845:23:0::1;;::::0;;;:15:::1;:23;::::0;;;;:30;;-1:-1:-1;;2845:30:0::1;2871:4;2845:30;::::0;;2773:110::o;915:256::-;414:3;;-1:-1:-1;;;;;414:3:0;400:10;:17;392:43;;;;-1:-1:-1;;;392:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;984:18:0;::::1;976:59;;;::::0;-1:-1:-1;;;976:59:0;;11248:2:1;976:59:0::1;::::0;::::1;11230:21:1::0;11287:2;11267:18;;;11260:30;11326;11306:18;;;11299:58;11374:18;;976:59:0::1;11046:352:1::0;976:59:0::1;1046:10;:17:::0;;-1:-1:-1;;;;;;1046:17:0::1;-1:-1:-1::0;;;;;1046:17:0;::::1;;::::0;;1085:23:::1;317:6;1085:15;:23;:::i;:::-;1074:8;:34:::0;;;1142:10:::1;::::0;::::1;1137:3:::0;1124:39:::1;::::0;819:25:1;;;-1:-1:-1;;;;;1142:10:0;;::::1;::::0;1137:3;::::1;::::0;1124:39:::1;::::0;807:2:1;792:18;1124:39:0::1;;;;;;;915:256:::0;:::o;34236:147::-;414:3;;-1:-1:-1;;;;;414:3:0;400:10;:17;392:43;;;;-1:-1:-1;;;392:43:0;;;;;;;:::i;:::-;34336:38:::1;::::0;-1:-1:-1;;;34336:38:0;;34368:4:::1;34336:38;::::0;::::1;1110:51:1::0;34305:70:0::1;::::0;34332:2;;-1:-1:-1;;;;;34336:23:0;::::1;::::0;::::1;::::0;1083:18:1;;34336:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34305:26:0;::::1;::::0;:70;:26:::1;:70::i;:::-;34236:147:::0;;:::o;28352:178::-;28448:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28448:18:0;28502:4;28491:31;;;;;;;;;;;;:::i;:::-;28484:38;28352:178;-1:-1:-1;;28352:178:0:o;29377:2380::-;29499:12;29513:19;29553:10;29575:4;29553:27;29545:36;;;;;;29592:30;29625:25;29645:4;;29625:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29625:19:0;;-1:-1:-1;;;29625:25:0:i;:::-;29592:58;;29707:15;29683:11;:20;;;:39;;29661:119;;;;-1:-1:-1;;;29661:119:0;;14018:2:1;29661:119:0;;;14000:21:1;14057:2;14037:18;;;14030:30;14096:32;14076:18;;;14069:60;14146:18;;29661:119:0;13816:354:1;29661:119:0;29810:20;;;;-1:-1:-1;;;;;29849:22:0;;29841:71;;;;-1:-1:-1;;;29841:71:0;;14377:2:1;29841:71:0;;;14359:21:1;14416:2;14396:18;;;14389:30;14455:34;14435:18;;;14428:62;-1:-1:-1;;;14506:18:1;;;14499:34;14550:19;;29841:71:0;14175:400:1;29841:71:0;29949:16;;;;29984:11;;29999:1;-1:-1:-1;29984:16:0;29976:71;;;;-1:-1:-1;;;29976:71:0;;14782:2:1;29976:71:0;;;14764:21:1;14821:2;14801:18;;;14794:30;14860:34;14840:18;;;14833:62;-1:-1:-1;;;14911:18:1;;;14904:40;14961:19;;29976:71:0;14580:406:1;29976:71:0;30091:5;-1:-1:-1;;;;;30080:16:0;:4;30085:1;30080:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30080:16:0;;30058:110;;;;-1:-1:-1;;;30058:110:0;;15325:2:1;30058:110:0;;;15307:21:1;15364:2;15344:18;;;15337:30;15403:34;15383:18;;;15376:62;-1:-1:-1;;;15454:18:1;;;15447:42;15506:19;;30058:110:0;15123:408:1;30058:110:0;30230:6;30203:11;:23;;;:33;;30181:127;;;;-1:-1:-1;;;30181:127:0;;15738:2:1;30181:127:0;;;15720:21:1;15777:2;15757:18;;;15750:30;15816:34;15796:18;;;15789:62;-1:-1:-1;;;15867:18:1;;;15860:42;15919:19;;30181:127:0;15536:408:1;30181:127:0;30321:19;30343:11;:23;;;30370:1;30343:28;:89;;30409:11;:23;;;30343:89;;;30387:6;30343:89;30321:111;;30445:24;30484:11;:21;;;30509:1;30484:26;30480:212;;30537:50;30562:11;30575;30537:24;:50::i;:::-;30527:60;;30480:212;;;30630:50;30655:11;30668;30630:24;:50::i;:::-;30620:60;;30480:212;30704:137;30747:58;30774:12;30788:4;30793:1;30788:7;;;;;;;;:::i;:::-;;;;;;;30797:4;30802:1;30797:7;;;;;;;;:::i;:::-;;;;;;;30747:26;:58::i;:::-;30820:7;30828:1;30820:10;;;;;;;;:::i;:::-;;;;;;;30711:4;30716:1;30711:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30704:28:0;;;:137;;;;;:::i;:::-;30854:17;30882:18;30915:11;:20;;;30911:499;;;31003:7;-1:-1:-1;;;;;30978:32:0;:4;30997:1;30983:4;:11;:15;;;;:::i;:::-;30978:21;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30978:32:0;;30952:128;;;;-1:-1:-1;;;30952:128:0;;16284:2:1;30952:128:0;;;16266:21:1;16323:2;16303:18;;;16296:30;16362:34;16342:18;;;16335:62;-1:-1:-1;;;16413:18:1;;;16406:32;16455:19;;30952:128:0;16082:398:1;30952:128:0;31121:35;31127:7;31136:4;31150;31121:5;:35::i;:::-;31171:38;;-1:-1:-1;;;31171:38:0;;;;;819:25:1;;;31095:61:0;;-1:-1:-1;31095:61:0;-1:-1:-1;31180:7:0;-1:-1:-1;;;;;31171:26:0;;;;792:18:1;;31171:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31224:48;31250:8;31261:10;31224:17;:48::i;:::-;31307:1;31287:22;;30911:499;;;31368:30;31374:7;31383:4;31389:8;31368:5;:30::i;:::-;31342:56;;-1:-1:-1;31342:56:0;-1:-1:-1;30911:499:0;31446:8;-1:-1:-1;;;;;31425:42:0;31435:9;-1:-1:-1;;;;;31425:42:0;;31456:10;31425:42;;;;819:25:1;;807:2;792:18;;673:177;31425:42:0;;;;;;;;31480:18;31501:22;31512:7;31520:1;31512:10;;;;;;;;:::i;:::-;;;;;;;31501:6;:10;;:22;;;;:::i;:::-;31480:43;-1:-1:-1;31538:14:0;;31534:155;;31569:50;31598:8;31608:10;31576:4;31581:1;31576:7;;;;;;;;:::i;31569:50::-;31656:8;-1:-1:-1;;;;;31639:38:0;31649:5;-1:-1:-1;;;;;31639:38:0;;31666:10;31639:38;;;;819:25:1;;807:2;792:18;;673:177;31639:38:0;;;;;;;;31534:155;31715:33;;;-1:-1:-1;;;;;16677:32:1;;31715:33:0;;;16659:51:1;16726:18;;;16719:34;;;31709:4:0;;16632:18:1;;31715:33:0;;;;;;;;;;;;31701:48;;;;;;;;;;;;29377:2380;;;;;;;:::o;1375:496::-;1451:10;;-1:-1:-1;;;;;1451:10:0;1437;:24;;:103;;-1:-1:-1;1497:3:0;;-1:-1:-1;;;;;1497:3:0;1483:10;:17;:56;;;;-1:-1:-1;1512:10:0;;-1:-1:-1;;;;;1512:10:0;1504:31;:35;;1483:56;1415:174;;;;-1:-1:-1;;;1415:174:0;;16966:2:1;1415:174:0;;;16948:21:1;17005:2;16985:18;;;16978:30;-1:-1:-1;;;17024:18:1;;;17017:51;17085:18;;1415:174:0;16764:345:1;1415:174:0;1633:1;1622:8;;:12;:43;;;;;1657:8;;1638:15;:27;;1622:43;1600:118;;;;-1:-1:-1;;;1600:118:0;;17316:2:1;1600:118:0;;;17298:21:1;17355:2;17335:18;;;17328:30;17394:27;17374:18;;;17367:55;17439:18;;1600:118:0;17114:349:1;1600:118:0;1751:10;;;1746:3;1734:45;;1763:15;819:25:1;;-1:-1:-1;;;;;1751:10:0;;;;1746:3;;;;1734:45;;807:2:1;792:18;1734:45:0;;;;;;;1796:10;;;;1790:16;;-1:-1:-1;;;;;;1790:16:0;;;-1:-1:-1;;;;;1796:10:0;;1790:16;;;1817:23;;;;;;1851:8;:12;1375:496::o;28179:165::-;28283:12;28331:4;28320:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;28313:23;;28179:165;;;:::o;17740:211::-;17884:58;;;-1:-1:-1;;;;;16677:32:1;;17884:58:0;;;16659:51:1;16726:18;;;;16719:34;;;17884:58:0;;;;;;;;;;16632:18:1;;;;17884:58:0;;;;;;;;-1:-1:-1;;;;;17884:58:0;-1:-1:-1;;;17884:58:0;;;17857:86;;17877:5;;17857:19;:86::i;:::-;17740:211;;;:::o;32230:484::-;32365:24;32412:127;32459:12;32486:11;32512;:16;;;32412:32;:127::i;:::-;32402:137;;32605:11;:24;;;32574:7;32599:1;32582:7;:14;:18;;;;:::i;:::-;32574:27;;;;;;;;:::i;:::-;;;;;;;:55;;32552:154;;;;-1:-1:-1;;;32552:154:0;;19643:2:1;32552:154:0;;;19625:21:1;19682:2;19662:18;;;19655:30;19721:34;19701:18;;;19694:62;-1:-1:-1;;;19772:18:1;;;19765:47;19829:19;;32552:154:0;19441:413:1;31765:457:0;31900:24;31947:136;31993:12;32020:11;:21;;;32056:11;:16;;;31947:31;:136::i;:::-;31937:146;;32130:11;32116:7;32124:1;32116:10;;;;;;;;:::i;:::-;;;;;;;:25;;32094:120;;;;-1:-1:-1;;;32094:120:0;;20061:2:1;32094:120:0;;;20043:21:1;20100:2;20080:18;;;20073:30;20139:34;20119:18;;;20112:62;-1:-1:-1;;;20190:18:1;;;20183:43;20243:19;;32094:120:0;19859:409:1;23422:215:0;23577:52;;-1:-1:-1;;;23577:52:0;;-1:-1:-1;;;;;20503:15:1;;;23577:52:0;;;20485:34:1;20555:15;;;20535:18;;;20528:43;23545:12:0;;23577:36;;;;;;20420:18:1;;23577:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23570:59;;23422:215;;;;;;:::o;32825:974::-;32962:7;32971;32996:9;32991:731;33025:1;33011:4;:11;:15;;;;:::i;:::-;33007:1;:19;32991:731;;;33049:13;33064:14;33083:4;33088:1;33083:7;;;;;;;;:::i;:::-;;;;;;;33092:4;33097:1;33101;33097:5;;;;:::i;:::-;33092:11;;;;;;;;:::i;:::-;;;;;;;33048:56;;;;33120:14;33140:44;33170:5;33177:6;33140:29;:44::i;:::-;-1:-1:-1;33119:65:0;-1:-1:-1;33199:17:0;33219:7;33227:5;:1;33231;33227:5;:::i;:::-;33219:14;;;;;;;;:::i;:::-;;;;;;;33199:34;;33249:18;33269;33300:6;-1:-1:-1;;;;;33291:15:0;:5;-1:-1:-1;;;;;33291:15:0;;:101;;33370:9;33389:1;33291:101;;;33335:1;33339:9;33291:101;33248:144;;;;33407:10;33438:1;33424:4;:11;:15;;;;:::i;:::-;33420:1;:19;:123;;33540:3;33420:123;;;33459:61;33486:12;33500:6;33508:4;33513:5;:1;33517;33513:5;:::i;:::-;33508:11;;;;;;;;:::i;33459:61::-;33407:136;;33593:55;33620:12;33634:5;33641:6;33593:26;:55::i;:::-;-1:-1:-1;;;;;33558:110:0;;33669:10;33681;33693:2;33707:1;33697:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33697:12:0;;33558:152;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33033:689;;;;;;;33028:3;;;;;:::i;:::-;;;;32991:731;;;;33740:4;33759:1;33745:4;:11;:15;;;;:::i;:::-;33740:21;;;;;;;;:::i;:::-;;;;;;;33763:7;33788:1;33771:7;:14;:18;;;;:::i;:::-;33763:27;;;;;;;;:::i;:::-;;;;;;;33732:59;;;;32825:974;;;;;;:::o;8592:317::-;8707:6;8682:21;:31;;8674:73;;;;-1:-1:-1;;;8674:73:0;;21643:2:1;8674:73:0;;;21625:21:1;21682:2;21662:18;;;21655:30;21721:31;21701:18;;;21694:59;21770:18;;8674:73:0;21441:353:1;8674:73:0;8761:12;8779:9;-1:-1:-1;;;;;8779:14:0;8801:6;8779:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8760:52;;;8831:7;8823:78;;;;-1:-1:-1;;;8823:78:0;;22211:2:1;8823:78:0;;;22193:21:1;22250:2;22230:18;;;22223:30;22289:34;22269:18;;;22262:62;22360:28;22340:18;;;22333:56;22406:19;;8823:78:0;22009:422:1;21833:174:0;21951:5;;;21946:16;;;;21938:50;;;;-1:-1:-1;;;21938:50:0;;22638:2:1;21938:50:0;;;22620:21:1;22677:2;22657:18;;;22650:30;-1:-1:-1;;;22696:18:1;;;22689:51;22757:18;;21938:50:0;22436:345:1;20807:716:0;21231:23;21257:69;21285:4;21257:69;;;;;;;;;;;;;;;;;21265:5;-1:-1:-1;;;;;21257:27:0;;;:69;;;;;:::i;:::-;21341:17;;21231:95;;-1:-1:-1;21341:21:0;21337:179;;21438:10;21427:30;;;;;;;;;;;;:::i;:::-;21419:85;;;;-1:-1:-1;;;21419:85:0;;23238:2:1;21419:85:0;;;23220:21:1;23277:2;23257:18;;;23250:30;23316:34;23296:18;;;23289:62;-1:-1:-1;;;23367:18:1;;;23360:40;23417:19;;21419:85:0;23036:406:1;25726:631:0;25864:24;25924:1;25909:4;:11;:16;;25901:61;;;;-1:-1:-1;;;25901:61:0;;23649:2:1;25901:61:0;;;23631:21:1;;;23668:18;;;23661:30;23727:34;23707:18;;;23700:62;23779:18;;25901:61:0;23447:356:1;25901:61:0;25997:4;:11;-1:-1:-1;;;;;25983:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25983:26:0;;25973:36;;26033:8;26020:7;26028:1;26020:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;26057:9;26052:298;26086:1;26072:4;:11;:15;;;;:::i;:::-;26068:1;:19;26052:298;;;26110:17;26129:18;26151:108;26181:7;26207:4;26212:1;26207:7;;;;;;;;:::i;:::-;;;;;;;26233:4;26238:1;26242;26238:5;;;;:::i;:::-;26233:11;;;;;;;;:::i;:::-;;;;;;;26151;:108::i;:::-;26109:150;;;;26291:47;26304:7;26312:1;26304:10;;;;;;;;:::i;:::-;;;;;;;26316:9;26327:10;26291:12;:47::i;:::-;26274:7;26282:5;:1;26286;26282:5;:::i;:::-;26274:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;26094:256;;26089:3;;;;;:::i;:::-;;;;26052:298;;;;25726:631;;;;;:::o;26438:652::-;26576:24;26636:1;26621:4;:11;:16;;26613:61;;;;-1:-1:-1;;;26613:61:0;;23649:2:1;26613:61:0;;;23631:21:1;;;23668:18;;;23661:30;23727:34;23707:18;;;23700:62;23779:18;;26613:61:0;23447:356:1;26613:61:0;26709:4;:11;-1:-1:-1;;;;;26695:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26695:26:0;;26685:36;;26762:9;26732:7;26757:1;26740:7;:14;:18;;;;:::i;:::-;26732:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;26787:9;26813:1;26799:4;:11;:15;;;;:::i;:::-;26787:27;;26782:301;26816:5;;26782:301;;26844:17;;26885:108;26915:7;26941:4;26946:5;26950:1;26946;:5;:::i;:::-;26941:11;;;;;;;;:::i;:::-;;;;;;;26971:4;26976:1;26971:7;;;;;;;;:::i;26885:108::-;26843:150;;;;27025:46;27037:7;27045:1;27037:10;;;;;;;;:::i;:::-;;;;;;;27049:9;27060:10;27025:11;:46::i;:::-;27008:7;27016:5;27020:1;27016;:5;:::i;:::-;27008:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;26828:255;;26823:3;;;;;:::i;:::-;;;;26782:301;;22919:411;23021:14;23037;23087:6;-1:-1:-1;;;;;23077:16:0;:6;-1:-1:-1;;;;;23077:16:0;;23069:68;;;;-1:-1:-1;;;23069:68:0;;24151:2:1;23069:68:0;;;24133:21:1;24190:2;24170:18;;;24163:30;24229:34;24209:18;;;24202:62;-1:-1:-1;;;24280:18:1;;;24273:37;24327:19;;23069:68:0;23949:403:1;23069:68:0;23176:6;-1:-1:-1;;;;;23167:15:0;:6;-1:-1:-1;;;;;23167:15:0;;:79;;23231:6;23239;23167:79;;;23199:6;23207;23167:79;23148:98;;-1:-1:-1;23148:98:0;-1:-1:-1;;;;;;23265:20:0;;23257:65;;;;-1:-1:-1;;;23257:65:0;;24559:2:1;23257:65:0;;;24541:21:1;;;24578:18;;;24571:30;24637:34;24617:18;;;24610:62;24689:18;;23257:65:0;24357:356:1;23257:65:0;22919:411;;;;;:::o;10076:229::-;10213:12;10245:52;10267:6;10275:4;10281:1;10284:12;10245:21;:52::i;23695:491::-;23822:16;23840;23870:14;23890:26;23901:6;23909;23890:10;:26::i;:::-;23869:47;;;23928:16;23946;23999:32;24007:7;24016:6;24024;23999:7;:32::i;:::-;-1:-1:-1;;;;;23968:86:0;;:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23927:129;-1:-1:-1;;;;;23927:129:0;;;-1:-1:-1;;;;;23927:129:0;;;24100:6;-1:-1:-1;;;;;24090:16:0;:6;-1:-1:-1;;;;;24090:16:0;;:88;;24159:8;24169;24090:88;;;24123:8;24133;24090:88;24067:111;;;;-1:-1:-1;23695:491:0;-1:-1:-1;;;;;;;23695:491:0:o;24308:613::-;24444:17;24493:1;24482:8;:12;24474:70;;;;-1:-1:-1;;;24474:70:0;;25568:2:1;24474:70:0;;;25550:21:1;25607:2;25587:18;;;25580:30;25646:34;25626:18;;;25619:62;-1:-1:-1;;;25697:18:1;;;25690:43;25750:19;;24474:70:0;25366:409:1;24474:70:0;24589:1;24577:9;:13;:31;;;;;24607:1;24594:10;:14;24577:31;24555:123;;;;-1:-1:-1;;;24555:123:0;;;;;;;:::i;:::-;24689:23;24715:17;:8;24728:3;24715:12;:17::i;:::-;24689:43;-1:-1:-1;24743:17:0;24763:31;24689:43;24783:10;24763:19;:31::i;:::-;24743:51;-1:-1:-1;24805:19:0;24827:40;24851:15;24827:19;:9;24841:4;24827:13;:19::i;:::-;:23;;:40::i;:::-;24805:62;-1:-1:-1;24890:23:0;24805:62;24890:9;:23;:::i;:::-;24878:35;24308:613;-1:-1:-1;;;;;;;24308:613:0:o;25042:602::-;25178:16;25241:1;25229:9;:13;25207:109;;;;-1:-1:-1;;;25207:109:0;;26747:2:1;25207:109:0;;;26729:21:1;26786:2;26766:18;;;26759:30;26825:34;26805:18;;;26798:62;-1:-1:-1;;;26876:18:1;;;26869:44;26930:19;;25207:109:0;26545:410:1;25207:109:0;25361:1;25349:9;:13;:31;;;;;25379:1;25366:10;:14;25349:31;25327:123;;;;-1:-1:-1;;;25327:123:0;;;;;;;:::i;:::-;25461:17;25481:34;25510:4;25481:24;:9;25495;25481:13;:24::i;:::-;:28;;:34::i;:::-;25461:54;-1:-1:-1;25526:19:0;25548:34;25578:3;25548:25;:10;25563:9;25548:14;:25::i;:34::-;25526:56;-1:-1:-1;25604:32:0;25634:1;25605:23;25526:56;25605:9;:23;:::i;25604:32::-;25593:43;25042:602;-1:-1:-1;;;;;;25042:602:0:o;11196:510::-;11366:12;11424:5;11399:21;:30;;11391:81;;;;-1:-1:-1;;;11391:81:0;;27162:2:1;11391:81:0;;;27144:21:1;27201:2;27181:18;;;27174:30;27240:34;27220:18;;;27213:62;-1:-1:-1;;;27291:18:1;;;27284:36;27337:19;;11391:81:0;26960:402:1;11391:81:0;-1:-1:-1;;;;;7626:19:0;;;11483:60;;;;-1:-1:-1;;;11483:60:0;;27569:2:1;11483:60:0;;;27551:21:1;27608:2;27588:18;;;27581:30;27647:31;27627:18;;;27620:59;27696:18;;11483:60:0;27367:353:1;11483:60:0;11557:12;11571:23;11598:6;-1:-1:-1;;;;;11598:11:0;11617:5;11624:4;11598:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11556:73;;;;11647:51;11664:7;11673:10;11685:12;11647:16;:51::i;22015:187::-;22073:9;22128:6;;;:30;;-1:-1:-1;;22143:5:0;;;22157:1;22152;22143:5;22152:1;22138:15;;;;:::i;:::-;;:20;22128:30;22120:63;;;;-1:-1:-1;;;22120:63:0;;28219:2:1;22120:63:0;;;28201:21:1;28258:2;28238:18;;;28231:30;-1:-1:-1;;;28277:18:1;;;28270:50;28337:18;;22120:63:0;28017:344:1;21652:173:0;21770:5;;;21765:16;;;;21757:49;;;;-1:-1:-1;;;21757:49:0;;28568:2:1;21757:49:0;;;28550:21:1;28607:2;28587:18;;;28580:30;-1:-1:-1;;;28626:18:1;;;28619:50;28686:18;;21757:49:0;28366:344:1;13882:762:0;14032:12;14061:7;14057:580;;;-1:-1:-1;14092:10:0;14085:17;;14057:580;14206:17;;:21;14202:424;;14454:10;14448:17;14515:15;14502:10;14498:2;14494:19;14487:44;14202:424;14597:12;14590:20;;-1:-1:-1;;;14590:20:0;;;;;;;;:::i;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;:::-;282:134;;;:::o;421:247::-;480:6;533:2;521:9;512:7;508:23;504:32;501:52;;;549:1;546;539:12;501:52;588:9;575:23;607:31;632:5;607:31;:::i;1172:347::-;1223:8;1233:6;1287:3;1280:4;1272:6;1268:17;1264:27;1254:55;;1305:1;1302;1295:12;1254:55;-1:-1:-1;1328:20:1;;-1:-1:-1;;;;;1360:30:1;;1357:50;;;1403:1;1400;1393:12;1357:50;1440:4;1432:6;1428:17;1416:29;;1492:3;1485:4;1476:6;1468;1464:19;1460:30;1457:39;1454:59;;;1509:1;1506;1499:12;1524:754;1621:6;1629;1637;1645;1653;1706:3;1694:9;1685:7;1681:23;1677:33;1674:53;;;1723:1;1720;1713:12;1674:53;1762:9;1749:23;1781:31;1806:5;1781:31;:::i;:::-;1831:5;-1:-1:-1;1888:2:1;1873:18;;1860:32;1901:33;1860:32;1901:33;:::i;:::-;1953:7;-1:-1:-1;2007:2:1;1992:18;;1979:32;;-1:-1:-1;2062:2:1;2047:18;;2034:32;-1:-1:-1;;;;;2078:30:1;;2075:50;;;2121:1;2118;2111:12;2075:50;2160:58;2210:7;2201:6;2190:9;2186:22;2160:58;:::i;:::-;1524:754;;;;-1:-1:-1;1524:754:1;;-1:-1:-1;2237:8:1;;2134:84;1524:754;-1:-1:-1;;;1524:754:1:o;2379:250::-;2464:1;2474:113;2488:6;2485:1;2482:13;2474:113;;;2564:11;;;2558:18;2545:11;;;2538:39;2510:2;2503:10;2474:113;;;-1:-1:-1;;2621:1:1;2603:16;;2596:27;2379:250::o;2634:270::-;2675:3;2713:5;2707:12;2740:6;2735:3;2728:19;2756:76;2825:6;2818:4;2813:3;2809:14;2802:4;2795:5;2791:16;2756:76;:::i;:::-;2886:2;2865:15;-1:-1:-1;;2861:29:1;2852:39;;;;2893:4;2848:50;;2634:270;-1:-1:-1;;2634:270:1:o;2909:298::-;3092:6;3085:14;3078:22;3067:9;3060:41;3137:2;3132;3121:9;3117:18;3110:30;3041:4;3157:44;3197:2;3186:9;3182:18;3174:6;3157:44;:::i;3212:388::-;3280:6;3288;3341:2;3329:9;3320:7;3316:23;3312:32;3309:52;;;3357:1;3354;3347:12;3309:52;3396:9;3383:23;3415:31;3440:5;3415:31;:::i;:::-;3465:5;-1:-1:-1;3522:2:1;3507:18;;3494:32;3535:33;3494:32;3535:33;:::i;:::-;3587:7;3577:17;;;3212:388;;;;;:::o;3605:127::-;3666:10;3661:3;3657:20;3654:1;3647:31;3697:4;3694:1;3687:15;3721:4;3718:1;3711:15;3737:249;3847:2;3828:13;;-1:-1:-1;;3824:27:1;3812:40;;-1:-1:-1;;;;;3867:34:1;;3903:22;;;3864:62;3861:88;;;3929:18;;:::i;:::-;3965:2;3958:22;-1:-1:-1;;3737:249:1:o;3991:248::-;4058:2;4052:9;4100:4;4088:17;;-1:-1:-1;;;;;4120:34:1;;4156:22;;;4117:62;4114:88;;;4182:18;;:::i;:::-;4218:2;4211:22;3991:248;:::o;4244:186::-;4292:4;-1:-1:-1;;;;;4317:6:1;4314:30;4311:56;;;4347:18;;:::i;:::-;-1:-1:-1;4413:2:1;4392:15;-1:-1:-1;;4388:29:1;4419:4;4384:40;;4244:186::o;4435:727::-;4503:6;4556:2;4544:9;4535:7;4531:23;4527:32;4524:52;;;4572:1;4569;4562:12;4524:52;4612:9;4599:23;-1:-1:-1;;;;;4637:6:1;4634:30;4631:50;;;4677:1;4674;4667:12;4631:50;4700:22;;4753:4;4745:13;;4741:27;-1:-1:-1;4731:55:1;;4782:1;4779;4772:12;4731:55;4818:2;4805:16;4840:31;4868:2;4840:31;:::i;:::-;4900:2;4894:9;4912:31;4940:2;4932:6;4912:31;:::i;:::-;4967:2;4959:6;4952:18;5007:7;5002:2;4997;4993;4989:11;4985:20;4982:33;4979:53;;;5028:1;5025;5018:12;4979:53;5084:2;5079;5075;5071:11;5066:2;5058:6;5054:15;5041:46;5129:1;5107:15;;;5124:2;5103:24;5096:35;;;;-1:-1:-1;5111:6:1;4435:727;-1:-1:-1;;;;4435:727:1:o;5167:1236::-;5317:4;5346:2;5375;5364:9;5357:21;5416:3;5405:9;5401:19;5462:6;5456:13;5451:2;5440:9;5436:18;5429:41;5524:2;5516:6;5512:15;5506:22;5501:2;5490:9;5486:18;5479:50;5583:2;5575:6;5571:15;5565:22;5560:2;5549:9;5545:18;5538:50;5635:2;5627:6;5623:15;5617:22;5676:4;5670:3;5659:9;5655:19;5648:33;5701:6;5736:12;5730:19;5773:6;5765;5758:22;5811:3;5800:9;5796:19;5789:26;;5856:2;5842:12;5838:21;5824:35;;5877:1;5868:10;;5887:195;5901:6;5898:1;5895:13;5887:195;;;5966:13;;-1:-1:-1;;;;;5962:39:1;5950:52;;6057:15;;;;5998:1;5916:9;;;;;6022:12;;;;5887:195;;;-1:-1:-1;6131:3:1;6119:16;;6113:23;-1:-1:-1;;;;;921:31:1;;6195:3;6180:19;;909:44;6113:23;-1:-1:-1;6255:3:1;6247:6;6243:16;6237:23;6231:3;6220:9;6216:19;6209:52;6310:3;6302:6;6298:16;6292:23;6270:45;;6324:53;6371:4;6360:9;6356:20;6340:14;2353:13;2346:21;2334:34;;2283:91;6408:612;6496:6;6504;6512;6520;6573:2;6561:9;6552:7;6548:23;6544:32;6541:52;;;6589:1;6586;6579:12;6541:52;6628:9;6615:23;6647:31;6672:5;6647:31;:::i;:::-;6697:5;-1:-1:-1;6749:2:1;6734:18;;6721:32;;-1:-1:-1;6804:2:1;6789:18;;6776:32;-1:-1:-1;;;;;6820:30:1;;6817:50;;;6863:1;6860;6853:12;6817:50;6902:58;6952:7;6943:6;6932:9;6928:22;6902:58;:::i;:::-;6408:612;;;;-1:-1:-1;6979:8:1;-1:-1:-1;;;;6408:612:1:o;7217:391::-;7307:6;7360:2;7348:9;7339:7;7335:23;7331:32;7328:52;;;7376:1;7373;7366:12;7328:52;7416:9;7403:23;-1:-1:-1;;;;;7441:6:1;7438:30;7435:50;;;7481:1;7478;7471:12;7435:50;7504:22;;7560:3;7542:16;;;7538:26;7535:46;;;7577:1;7574;7567:12;7613:217;7760:2;7749:9;7742:21;7723:4;7780:44;7820:2;7809:9;7805:18;7797:6;7780:44;:::i;7835:337::-;8037:2;8019:21;;;8076:2;8056:18;;;8049:30;-1:-1:-1;;;8110:2:1;8095:18;;8088:43;8163:2;8148:18;;7835:337::o;8533:559::-;-1:-1:-1;;;;;8746:32:1;;8728:51;;8810:2;8795:18;;8788:34;;;8858:2;8853;8838:18;;8831:30;;;8877:18;;8870:34;;;8897:6;8947;8941:3;8926:19;;8913:49;9012:1;8982:22;;;9006:3;8978:32;;;8971:43;;;;9075:2;9054:15;;;-1:-1:-1;;9050:29:1;9035:45;9031:55;;8533:559;-1:-1:-1;;;8533:559:1:o;9097:118::-;9183:5;9176:13;9169:21;9162:5;9159:32;9149:60;;9205:1;9202;9195:12;9220:132;9296:13;;9318:28;9296:13;9318:28;:::i;9357:824::-;9442:6;9450;9503:2;9491:9;9482:7;9478:23;9474:32;9471:52;;;9519:1;9516;9509:12;9471:52;9551:9;9545:16;9570:28;9592:5;9570:28;:::i;:::-;9666:2;9651:18;;9645:25;9617:5;;-1:-1:-1;;;;;;9682:30:1;;9679:50;;;9725:1;9722;9715:12;9679:50;9748:22;;9801:4;9793:13;;9789:27;-1:-1:-1;9779:55:1;;9830:1;9827;9820:12;9779:55;9859:2;9853:9;9881:31;9909:2;9881:31;:::i;:::-;9941:2;9935:9;9953:31;9981:2;9973:6;9953:31;:::i;:::-;10008:2;10000:6;9993:18;10048:7;10043:2;10038;10034;10030:11;10026:20;10023:33;10020:53;;;10069:1;10066;10059:12;10020:53;10082:68;10147:2;10142;10134:6;10130:15;10125:2;10121;10117:11;10082:68;:::i;:::-;10169:6;10159:16;;;;;;9357:824;;;;;:::o;10186:179::-;10221:3;10263:1;10245:16;10242:23;10239:120;;;10309:1;10306;10303;10288:23;-1:-1:-1;10346:1:1;10340:8;10335:3;10331:18;10239:120;10186:179;:::o;10370:671::-;10409:3;10451:4;10433:16;10430:26;10427:39;;;10370:671;:::o;10427:39::-;10493:2;10487:9;-1:-1:-1;;10558:16:1;10554:25;;10551:1;10487:9;10530:50;10609:4;10603:11;10633:16;-1:-1:-1;;;;;10739:2:1;10732:4;10724:6;10720:17;10717:25;10712:2;10704:6;10701:14;10698:45;10695:58;;;10746:5;;;;;10370:671;:::o;10695:58::-;10783:6;10777:4;10773:17;10762:28;;10819:3;10813:10;10846:2;10838:6;10835:14;10832:27;;;10852:5;;;;;;10370:671;:::o;10832:27::-;10936:2;10917:16;10911:4;10907:27;10903:36;10896:4;10887:6;10882:3;10878:16;10874:27;10871:69;10868:82;;;10943:5;;;;;;10370:671;:::o;10868:82::-;10959:57;11010:4;11001:6;10993;10989:19;10985:30;10979:4;10959:57;:::i;:::-;-1:-1:-1;11032:3:1;;10370:671;-1:-1:-1;;;;;10370:671:1:o;11403:127::-;11464:10;11459:3;11455:20;11452:1;11445:31;11495:4;11492:1;11485:15;11519:4;11516:1;11509:15;11535:125;11600:9;;;11621:10;;;11618:36;;;11634:18;;:::i;11665:184::-;11735:6;11788:2;11776:9;11767:7;11763:23;11759:32;11756:52;;;11804:1;11801;11794:12;11756:52;-1:-1:-1;11827:16:1;;11665:184;-1:-1:-1;11665:184:1:o;11854:138::-;11933:13;;11955:31;11933:13;11955:31;:::i;11997:825::-;12062:5;12115:3;12108:4;12100:6;12096:17;12092:27;12082:55;;12133:1;12130;12123:12;12082:55;12162:6;12156:13;12188:4;-1:-1:-1;;;;;12207:2:1;12204:26;12201:52;;;12233:18;;:::i;:::-;12279:2;12276:1;12272:10;12311:2;12305:9;12323:40;12359:2;12355;12351:11;12343:6;12323:40;:::i;:::-;12398:18;;;12474:15;;;12470:24;;;12432:15;;;12506;;;12503:35;;;12534:1;12531;12524:12;12503:35;12570:2;12562:6;12558:15;12547:26;;12582:210;12598:6;12593:3;12590:15;12582:210;;;12671:3;12665:10;12688:31;12713:5;12688:31;:::i;:::-;12732:18;;12615:12;;;;12770;;12582:210;;;-1:-1:-1;12810:6:1;11997:825;-1:-1:-1;;;;;;11997:825:1:o;12827:984::-;12926:6;12979:2;12967:9;12958:7;12954:23;12950:32;12947:52;;;12995:1;12992;12985:12;12947:52;13028:9;13022:16;-1:-1:-1;;;;;13098:2:1;13090:6;13087:14;13084:34;;;13114:1;13111;13104:12;13084:34;13137:22;;;;13193:4;13175:16;;;13171:27;13168:47;;;13211:1;13208;13201:12;13168:47;13237:17;;:::i;:::-;13283:2;13277:9;13270:5;13263:24;13333:2;13329;13325:11;13319:18;13314:2;13307:5;13303:14;13296:42;13384:2;13380;13376:11;13370:18;13365:2;13358:5;13354:14;13347:42;13428:2;13424;13420:11;13414:18;13457:2;13447:8;13444:16;13441:36;;;13473:1;13470;13463:12;13441:36;13509:67;13568:7;13557:8;13553:2;13549:17;13509:67;:::i;:::-;13504:2;13497:5;13493:14;13486:91;;13610:43;13648:3;13644:2;13640:12;13610:43;:::i;:::-;13604:3;13597:5;13593:15;13586:68;13701:3;13697:2;13693:12;13687:19;13681:3;13674:5;13670:15;13663:44;13740:40;13775:3;13771:2;13767:12;13740:40;:::i;:::-;13734:3;13723:15;;13716:65;13727:5;12827:984;-1:-1:-1;;;;;12827:984:1:o;14991:127::-;15052:10;15047:3;15043:20;15040:1;15033:31;15083:4;15080:1;15073:15;15107:4;15104:1;15097:15;15949:128;16016:9;;;16037:11;;;16034:37;;;16051:18;;:::i;17468:522::-;17568:6;17563:3;17556:19;17538:3;17594:4;17623:2;17618:3;17614:12;17607:19;;17649:5;17672:1;17682:283;17696:6;17693:1;17690:13;17682:283;;;17773:6;17760:20;17793:33;17818:7;17793:33;:::i;:::-;-1:-1:-1;;;;;17851:33:1;17839:46;;17905:12;;;;17940:15;;;;17881:1;17711:9;17682:283;;;-1:-1:-1;17981:3:1;;17468:522;-1:-1:-1;;;;;17468:522:1:o;17995:128::-;18060:20;;18089:28;18060:20;18089:28;:::i;18128:1308::-;18317:2;18306:9;18299:21;18369:6;18356:20;18351:2;18340:9;18336:18;18329:48;18438:2;18430:6;18426:15;18413:29;18408:2;18397:9;18393:18;18386:57;18504:2;18496:6;18492:15;18479:29;18474:2;18463:9;18459:18;18452:57;18280:4;18569:2;18561:6;18557:15;18544:29;18653:2;18649:7;18640:6;18624:14;18620:27;18616:41;18596:18;18592:66;18582:94;;18672:1;18669;18662:12;18582:94;18698:31;;18806:2;18795:14;;;18752:19;-1:-1:-1;;;;;18821:30:1;;18818:50;;;18864:1;18861;18854:12;18818:50;18920:6;18917:1;18913:14;18897;18893:35;18884:7;18880:49;18877:69;;;18942:1;18939;18932:12;18877:69;18983:4;18977:3;18966:9;18962:19;18955:33;19011:75;19081:3;19070:9;19066:19;19058:6;19049:7;19011:75;:::i;:::-;18997:89;;;19115:36;19146:3;19138:6;19134:16;19115:36;:::i;:::-;-1:-1:-1;;;;;921:31:1;;19208:3;19193:19;;909:44;19160:53;19275:3;19267:6;19263:16;19250:30;19244:3;19233:9;19229:19;19222:59;19312:33;19340:3;19332:6;19328:16;19312:33;:::i;:::-;2353:13;;2346:21;19401:4;19386:20;;2334:34;19354:53;2283:91;20582:251;20652:6;20705:2;20693:9;20684:7;20680:23;20676:32;20673:52;;;20721:1;20718;20711:12;20673:52;20753:9;20747:16;20772:31;20797:5;20772:31;:::i;20838:458::-;21069:6;21058:9;21051:25;21112:6;21107:2;21096:9;21092:18;21085:34;21184:1;21180;21175:3;21171:11;21167:19;21159:6;21155:32;21150:2;21139:9;21135:18;21128:60;21224:3;21219:2;21208:9;21204:18;21197:31;21032:4;21245:45;21285:3;21274:9;21270:19;21262:6;21245:45;:::i;21301:135::-;21340:3;21361:17;;;21358:43;;21381:18;;:::i;:::-;-1:-1:-1;21428:1:1;21417:13;;21301:135::o;22786:245::-;22853:6;22906:2;22894:9;22885:7;22881:23;22877:32;22874:52;;;22922:1;22919;22912:12;22874:52;22954:9;22948:16;22973:28;22995:5;22973:28;:::i;23808:136::-;23847:3;23875:5;23865:39;;23884:18;;:::i;:::-;-1:-1:-1;;;23920:18:1;;23808:136::o;24718:188::-;24797:13;;-1:-1:-1;;;;;24839:42:1;;24829:53;;24819:81;;24896:1;24893;24886:12;24911:450;24998:6;25006;25014;25067:2;25055:9;25046:7;25042:23;25038:32;25035:52;;;25083:1;25080;25073:12;25035:52;25106:40;25136:9;25106:40;:::i;:::-;25096:50;;25165:49;25210:2;25199:9;25195:18;25165:49;:::i;:::-;25155:59;;25257:2;25246:9;25242:18;25236:25;25301:10;25294:5;25290:22;25283:5;25280:33;25270:61;;25327:1;25324;25317:12;25270:61;25350:5;25340:15;;;24911:450;;;;;:::o;25780:406::-;25982:2;25964:21;;;26021:2;26001:18;;;25994:30;26060:34;26055:2;26040:18;;26033:62;-1:-1:-1;;;26126:2:1;26111:18;;26104:40;26176:3;26161:19;;25780:406::o;26191:127::-;26252:10;26247:3;26243:20;26240:1;26233:31;26283:4;26280:1;26273:15;26307:4;26304:1;26297:15;26323:217;26363:1;26389;26379:132;;26433:10;26428:3;26424:20;26421:1;26414:31;26468:4;26465:1;26458:15;26496:4;26493:1;26486:15;26379:132;-1:-1:-1;26525:9:1;;26323:217::o;27725:287::-;27854:3;27892:6;27886:13;27908:66;27967:6;27962:3;27955:4;27947:6;27943:17;27908:66;:::i;:::-;27990:16;;;;;27725:287;-1:-1:-1;;27725:287:1:o
Swarm Source
ipfs://fc6f1a71731c8a57461d996f90dde8db1cb52dcd23434c386575dfc198f197f3
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|