Contract
0x5EF960Eb78B8CFc11e654D03BeEB313BaDF5C7C0
11
Contract Overview
Balance:
0 AVAX
AVAX Value:
$0.00
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
WardenRouterV2
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-03-15 */ // SPDX-License-Identifier: MIT // ((/*, ,*((/,. // &&@@&&%#/*. .*(#&&@@@@%. // &&@@@@@@@&%(. ,#%&@@@@@@@@%. // &&@@@@@@@@@&&(, ,#&@@@@@@@@@@@%. // &&@@@@@@@@@@@&&/. .(&&@@@@@@@@@@@@%. // %&@@@@@@@@@@@@@&(, *#&@@@@@@@@@@@@@@%. // #&@@@@@@@@@@@@@@&#* .*#@@@@@@@@@@@@@@@&#. // #&@@@@@@@@@@@@@@@@#. ,%&@@@@@@@@@@@@@@@&#. // #&@@@@@@@@@@@@@@@@%(, ,(&@@@@@@@@@@@@@@@@&#. // #&@@@@@@@@@@@@@@@@&&/ .(%&@@@@@@@@@@@@@@@@&#. // #%@@@@@@@@@@@@@@@@@@(. ,(/,. .#&@@@@@@@@@@@@@@@@@&#. // (%@@@@@@@@@@@@@@@@@@#*. ./%&&&/. .*%@@@@@@@@@@@@@@@@@@%(. // (%@@@@@@@@@@@@@@@@@@#*. *#&@@@@&%*. .*%@@@@@@@@@@@@@@@@@@%(. // (%@@@@@@@@@@@@@@@@@@#/. ./#@@@@@@@@%(. ./%@@@@@@@@@@@@@@@@@@%(. // (%@@@@@@@@@@@@@@@@@@#/. ./&@@@@@@@@@@&(* ,/%@@@@@@@@@@@@@@@@@@%(. // (%@@@@@@@@@@@@@@@@@@%/. ,#&@@@@@@@@@@@@&#,. ,/%@@@@@@@@@@@@@@@@@@%(. // /%@@@@@@@@@@@@@@@@@@#/. *(&@@@@@@@@@@@@@@&&* ./%@@@@@@@@@@@@@@@@@&%(. // /%@@@@@@@@@@@@@@@@@@#/. .(&@@@@@@@@@@@@@@@@@#*. ,/%@@@@@@@@@@@@@@@@@&#/. // ,#@@@@@@@@@@@@@@@@@@#/. ./%@@@@@@@@@@@@@@@@@@&#, ,/%@@@@@@@@@@@@@@@@@&(, // /%&@@@@@@@@@@@@@@@@#/. *#&@@@@@@@@@@@@@@@@@@@&* ,/%@@@@@@@@@@@@@@@@&%* // .*#&@@@@@@@@@@@@@@@#/. /&&@@@@@@@@@@@@@@@@@@@&/. ,/%@@@@@@@@@@@@@@@@#*. // ,(&@@@@@@@@@@@@@@#/. /@@@@@@@@@@@@@@@@@@@@@&(, ,/%@@@@@@@@@@@@@@%(, // .*(&&@@@@@@@@@@@#/. /&&@@@@@@@@@@@@@@@@@@@&/, ,/%@@@@@@@@@@@&%/, // ./%&@@@@@@@@@#/. *#&@@@@@@@@@@@@@@@@@@@%* ,/%@@@@@@@@@&%* // ,/#%&&@@@@#/. ,#&@@@@@@@@@@@@@@@@@#/. ,/%@@@@&&%(/, // ./#&@@%/. ,/&@@@@@@@@@@@@@@%(, ,/%@@%#*. // .,,, ,/%&@@@@@@@@&%(* .,,,. // ,/%&@@@%(*. // .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,**((/*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, // // // Sources flattened with hardhat v2.9.1 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/libraries/TransferHelper.sol pragma solidity ^0.8.0; interface IERC20NoReturn { function transfer(address recipient, uint256 amount) external; function transferFrom( address sender, address recipient, uint256 amount ) external; } // helper methods for interacting with ERC20 tokens that do not consistently return boolean library TransferHelper { function safeTransfer(IERC20 token, address to, uint value) internal { try IERC20NoReturn(address(token)).transfer(to, value) { } catch Error(string memory reason) { // catch failing revert() and require() revert(reason); } catch { revert("TransferHelper: transfer failed"); } } function safeTransferFrom(IERC20 token, address from, address to, uint value) internal { try IERC20NoReturn(address(token)).transferFrom(from, to, value) { } catch Error(string memory reason) { // catch failing revert() and require() revert(reason); } catch { revert("TransferHelper: transferFrom failed"); } } } // File contracts/interface/IWETH.sol pragma solidity ^0.8.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } // File contracts/interface/IWardenPreTrade2.sol pragma solidity ^0.8.0; interface IWardenPreTrade2 { function preTradeAndFee( IERC20 _src, IERC20 _dest, uint256 _srcAmount, address _trader, address _receiver, uint256 _partnerId, uint256 _metaData ) external returns ( uint256[] memory _fees, address[] memory _collectors ); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (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)); } } /** * @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/interface/IWardenSwap2.sol pragma solidity ^0.8.0; interface IWardenSwap2 { function trade( bytes calldata _data, IERC20 _src, uint256 _srcAmount, uint256 _originalSrcAmount, IERC20 _dest, address _receiver, address _trader, uint256 _partnerId, uint256 _metaData ) external; function tradeSplit( bytes calldata _data, uint256[] calldata _volumes, IERC20 _src, uint256 _totalSrcAmount, uint256 _originalSrcAmount, IERC20 _dest, address _receiver, address _trader, uint256 _partnerId, uint256 _metaData ) external; } // File contracts/swap/WardenRouterV2.sol pragma solidity ^0.8.0; contract WardenRouterV2 is Ownable { using TransferHelper for IERC20; IWardenPreTrade2 public preTrade; IWETH public immutable weth; IERC20 private constant ETHER_ERC20 = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); event UpdatedWardenPreTrade( IWardenPreTrade2 indexed preTrade ); /** * @dev When fee is collected by WardenSwap for a trade, this event will be emitted * @param token Collected token * @param wallet Collector address * @param amount Amount of fee collected */ event ProtocolFee( IERC20 indexed token, address indexed wallet, uint256 amount ); /** * @dev When fee is collected by WardenSwap's partners for a trade, this event will be emitted * @param partnerId Partner ID * @param token Collected token * @param wallet Collector address * @param amount Amount of fee collected */ event PartnerFee( uint256 indexed partnerId, IERC20 indexed token, address indexed wallet, uint256 amount ); /** * @dev When the new trade occurs (and success), this event will be emitted. * @param srcAsset Source token * @param srcAmount Amount of source token * @param destAsset Destination token * @param destAmount Amount of destination token * @param trader User address */ event Trade( address indexed srcAsset, uint256 srcAmount, address indexed destAsset, uint256 destAmount, address indexed trader, address receiver, bool hasSplitted ); constructor( IWardenPreTrade2 _preTrade, IWETH _weth ) { preTrade = _preTrade; weth = _weth; emit UpdatedWardenPreTrade(_preTrade); } function updateWardenPreTrade( IWardenPreTrade2 _preTrade ) external onlyOwner { preTrade = _preTrade; emit UpdatedWardenPreTrade(_preTrade); } /** * @dev Performs a trade with single volume * @param _swap Warden Swap contract * @param _data Warden Swap payload * @param _deposits Source token receiver * @param _src Source token * @param _srcAmount Amount of source tokens * @param _dest Destination token * @param _minDestAmount Minimum of destination token amount * @param _receiver Destination token receiver * @param _partnerId Partner id for fee sharing / Referral * @param _metaData Reserved for upcoming features * @return _destAmount Amount of actual destination tokens */ function swap( IWardenSwap2 _swap, bytes calldata _data, address _deposits, IERC20 _src, uint256 _srcAmount, IERC20 _dest, uint256 _minDestAmount, address _receiver, uint256 _partnerId, uint256 _metaData ) external payable returns(uint256 _destAmount) { if (_receiver == address(0)) { _receiver = msg.sender; } // Collect fee uint256 newSrcAmount = _preTradeAndCollectFee( _src, _dest, _srcAmount, msg.sender, _receiver, _partnerId, _metaData ); // Wrap ETH if (ETHER_ERC20 == _src) { require(msg.value == _srcAmount, "WardenRouter::swap: Ether source amount mismatched"); weth.deposit{value: newSrcAmount}(); // Transfer user tokens to target IERC20(address(weth)).safeTransfer(_deposits, newSrcAmount); } else { // Transfer user tokens to target _src.safeTransferFrom(msg.sender, _deposits, newSrcAmount); } bytes memory payload = abi.encodeWithSelector(IWardenSwap2.trade.selector, _data, _src, newSrcAmount, _srcAmount, _dest, _receiver, msg.sender, _partnerId, _metaData ); _destAmount = _internalSwap( _swap, payload, _dest, _minDestAmount, _receiver ); emit Trade(address(_src), _srcAmount, address(_dest), _destAmount, msg.sender, _receiver, false); } /** * @dev Performs a trade by splitting volumes * @param _swap Warden Swap contract * @param _data Warden Swap payload * @param _deposits Source token receivers * @param _volumes Volume percentages * @param _src Source token * @param _totalSrcAmount Amount of source tokens * @param _dest Destination token * @param _minDestAmount Minimum of destination token amount * @param _receiver Destination token receiver * @param _partnerId Partner id for fee sharing / Referral * @param _metaData Reserved for upcoming features * @return _destAmount Amount of actual destination tokens */ function swapSplit( IWardenSwap2 _swap, bytes calldata _data, address[] memory _deposits, uint256[] memory _volumes, IERC20 _src, uint256 _totalSrcAmount, IERC20 _dest, uint256 _minDestAmount, address _receiver, uint256 _partnerId, uint256 _metaData ) external payable returns(uint256 _destAmount) { if (_receiver == address(0)) { _receiver = msg.sender; } // Collect fee uint256 newTotalSrcAmount = _preTradeAndCollectFee( _src, _dest, _totalSrcAmount, msg.sender, _receiver, _partnerId, _metaData ); // Wrap ETH if (ETHER_ERC20 == _src) { require(msg.value == _totalSrcAmount, "WardenRouter::swapSplit: Ether source amount mismatched"); weth.deposit{value: newTotalSrcAmount}(); } // Transfer user tokens to targets _depositVolumes( newTotalSrcAmount, _deposits, _volumes, _src ); bytes memory payload = abi.encodeWithSelector(IWardenSwap2.tradeSplit.selector, _data, _volumes, _src, newTotalSrcAmount, _totalSrcAmount, _dest, _receiver, msg.sender, _partnerId, _metaData ); _destAmount = _internalSwap( _swap, payload, _dest, _minDestAmount, _receiver ); emit Trade(address(_src), _totalSrcAmount, address(_dest), _destAmount, msg.sender, _receiver, true); } function _depositVolumes( uint256 newTotalSrcAmount, address[] memory _deposits, uint256[] memory _volumes, IERC20 _src ) private { { uint256 amountRemain = newTotalSrcAmount; for (uint i = 0; i < _deposits.length; i++) { uint256 amountForThisRound; if (i == _deposits.length - 1) { amountForThisRound = amountRemain; } else { amountForThisRound = newTotalSrcAmount * _volumes[i] / 100; amountRemain = amountRemain - amountForThisRound; } if (ETHER_ERC20 == _src) { IERC20(address(weth)).safeTransfer(_deposits[i], amountForThisRound); } else { _src.safeTransferFrom(msg.sender, _deposits[i], amountForThisRound); } } } } function _internalSwap( IWardenSwap2 _swap, bytes memory _payload, IERC20 _dest, uint256 _minDestAmount, address _receiver ) private returns (uint256 _destAmount) { // Record dest asset for later consistency check. uint256 destAmountBefore = ETHER_ERC20 == _dest ? _receiver.balance : _dest.balanceOf(_receiver); { // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory result) = address(_swap).call(_payload); if (!success) { // Next 5 lines from https://ethereum.stackexchange.com/a/83577 if (result.length < 68) revert(); assembly { result := add(result, 0x04) } revert(abi.decode(result, (string))); } } _destAmount = ETHER_ERC20 == _dest ? _receiver.balance - destAmountBefore : _dest.balanceOf(_receiver) - destAmountBefore; // Throw exception if destination amount doesn't meet user requirement. require(_destAmount >= _minDestAmount, "WardenRouter::_internalSwap: destination amount is too low."); } function _preTradeAndCollectFee( IERC20 _src, IERC20 _dest, uint256 _srcAmount, address _trader, address _receiver, uint256 _partnerId, uint256 _metaData ) private returns (uint256 _newSrcAmount) { // Collect fee (uint256[] memory fees, address[] memory feeWallets) = preTrade.preTradeAndFee( _src, _dest, _srcAmount, _trader, _receiver, _partnerId, _metaData ); _newSrcAmount = _srcAmount; if (fees.length > 0) { if (fees[0] > 0) { _collectFee( _trader, _src, fees[0], feeWallets[0] ); _newSrcAmount -= fees[0]; } if (fees.length == 2 && fees[1] > 0) { _partnerFee( _trader, _partnerId, // partner id _src, fees[1], feeWallets[1] ); _newSrcAmount -= fees[1]; } } } function _collectFee( address _trader, IERC20 _token, uint256 _fee, address _feeWallet ) private { if (ETHER_ERC20 == _token) { (bool success, ) = payable(_feeWallet).call{value: _fee}(""); // Send ether to fee collector require(success, "WardenRouter::_collectFee: Transfer fee of ether failed."); } else { _token.safeTransferFrom(_trader, _feeWallet, _fee); // Send token to fee collector } emit ProtocolFee(_token, _feeWallet, _fee); } function _partnerFee( address _trader, uint256 _partnerId, IERC20 _token, uint256 _fee, address _feeWallet ) private { if (ETHER_ERC20 == _token) { (bool success, ) = payable(_feeWallet).call{value: _fee}(""); // Send back ether to partner require(success, "WardenRouter::_partnerFee: Transfer fee of ether failed."); } else { _token.safeTransferFrom(_trader, _feeWallet, _fee); } emit PartnerFee(_partnerId, _token, _feeWallet, _fee); } /** * @dev Performs a trade ETH -> WETH * @param _receiver Receiver address * @return _destAmount Amount of actual destination tokens */ function tradeEthToWeth( address _receiver ) external payable returns(uint256 _destAmount) { if (_receiver == address(0)) { _receiver = msg.sender; } weth.deposit{value: msg.value}(); IERC20(address(weth)).safeTransfer(_receiver, msg.value); _destAmount = msg.value; emit Trade(address(ETHER_ERC20), msg.value, address(weth), _destAmount, msg.sender, _receiver, false); } /** * @dev Performs a trade WETH -> ETH * @param _srcAmount Amount of source tokens * @param _receiver Receiver address * @return _destAmount Amount of actual destination tokens */ function tradeWethToEth( uint256 _srcAmount, address _receiver ) external returns(uint256 _destAmount) { if (_receiver == address(0)) { _receiver = msg.sender; } IERC20(address(weth)).safeTransferFrom(msg.sender, address(this), _srcAmount); weth.withdraw(_srcAmount); (bool success, ) = _receiver.call{value: _srcAmount}(""); // Send back ether to receiver require(success, "WardenRouter::tradeWethToEth: Transfer ether back to receiver failed."); _destAmount = _srcAmount; emit Trade(address(weth), _srcAmount, address(ETHER_ERC20), _destAmount, msg.sender, _receiver, false); } // Receive ETH in case of trade WETH -> ETH receive() external payable { require(msg.sender == address(weth), "WardenRouter: Receive Ether only from WETH"); } // In case of an expected and unexpected event that has some token amounts remain in this contract, owner can call to collect them. function collectRemainingToken( IERC20 _token, uint256 _amount ) external onlyOwner { _token.safeTransfer(msg.sender, _amount); } // In case of an expected and unexpected event that has some ether amounts remain in this contract, owner can call to collect them. function collectRemainingEther( uint256 _amount ) external onlyOwner { (bool success, ) = msg.sender.call{value: _amount}(""); // Send back ether to sender require(success, "WardenRouter::collectRemainingEther: Transfer ether back to caller failed."); } }
[{"inputs":[{"internalType":"contract IWardenPreTrade2","name":"_preTrade","type":"address"},{"internalType":"contract IWETH","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"partnerId","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PartnerFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProtocolFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"srcAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"srcAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"destAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"destAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bool","name":"hasSplitted","type":"bool"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWardenPreTrade2","name":"preTrade","type":"address"}],"name":"UpdatedWardenPreTrade","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"collectRemainingEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"collectRemainingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preTrade","outputs":[{"internalType":"contract IWardenPreTrade2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWardenSwap2","name":"_swap","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address","name":"_deposits","type":"address"},{"internalType":"contract IERC20","name":"_src","type":"address"},{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_dest","type":"address"},{"internalType":"uint256","name":"_minDestAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_partnerId","type":"uint256"},{"internalType":"uint256","name":"_metaData","type":"uint256"}],"name":"swap","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IWardenSwap2","name":"_swap","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address[]","name":"_deposits","type":"address[]"},{"internalType":"uint256[]","name":"_volumes","type":"uint256[]"},{"internalType":"contract IERC20","name":"_src","type":"address"},{"internalType":"uint256","name":"_totalSrcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_dest","type":"address"},{"internalType":"uint256","name":"_minDestAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_partnerId","type":"uint256"},{"internalType":"uint256","name":"_metaData","type":"uint256"}],"name":"swapSplit","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeEthToWeth","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeWethToEth","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWardenPreTrade2","name":"_preTrade","type":"address"}],"name":"updateWardenPreTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200264a3803806200264a8339810160408190526200003491620000fe565b6200003f3362000095565b600180546001600160a01b0319166001600160a01b038481169182179092559082166080526040517f305e87b67e942ca51cbdcd6a078f76bcc9ed0c8db1000119f2d40ded1d9a1d7590600090a250506200013d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000fb57600080fd5b50565b600080604083850312156200011257600080fd5b82516200011f81620000e5565b60208401519092506200013281620000e5565b809150509250929050565b6080516124a5620001a56000396000818160db015281816101b2015281816103c8015281816106a2015281816106f90152818161088f01528181610a9d01528181610b1b01528181610b7401528181610ca001528181610d1e015261120101526124a56000f3fe6080604052600436106100cb5760003560e01c80638da5cb5b11610074578063ef2c822f1161004e578063ef2c822f146102b2578063f2fde38b146102c5578063f33c86cd146102e557600080fd5b80638da5cb5b146102615780638f64d73a1461027f578063dca489e01461029f57600080fd5b80635500c46d116100a55780635500c46d1461020c578063629e14251461022c578063715018a61461024c57600080fd5b8063053e59d41461017a5780633fc8cef3146101a05780634912dd14146101ec57600080fd5b3661017557336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101735760405162461bcd60e51b815260206004820152602a60248201527f57617264656e526f757465723a2052656365697665204574686572206f6e6c7960448201527f2066726f6d20574554480000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b005b600080fd5b61018d610188366004611c5f565b610305565b6040519081526020015b60405180910390f35b3480156101ac57600080fd5b506101d47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610197565b3480156101f857600080fd5b50610173610207366004611d6a565b610553565b34801561021857600080fd5b50610173610227366004611d96565b6105c5565b34801561023857600080fd5b5061018d610247366004611dba565b610681565b34801561025857600080fd5b506101736108e3565b34801561026d57600080fd5b506000546001600160a01b03166101d4565b34801561028b57600080fd5b5061017361029a366004611dea565b610949565b61018d6102ad366004611d96565b610a87565b61018d6102c0366004611e03565b610bdd565b3480156102d157600080fd5b506101736102e0366004611d96565b610e6c565b3480156102f157600080fd5b506001546101d4906001600160a01b031681565b60006001600160a01b038416610319573393505b600061032a89888a33898989610f4e565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038a16141561043b578734146103c65760405162461bcd60e51b815260206004820152603760248201527f57617264656e526f757465723a3a7377617053706c69743a204574686572207360448201527f6f7572636520616d6f756e74206d69736d617463686564000000000000000000606482015260840161016a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561042157600080fd5b505af1158015610435573d6000803e3d6000fd5b50505050505b610447818c8c8c611151565b6000632ead0eed60e01b8e8e8d8d868e8e8d338e8e6040516024016104769b9a99989796959493929190611ef9565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104e48f828a8a8a611291565b604080518b8152602081018390526001600160a01b038981168284015260016060830152915192955033928b8316928e16917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f8280919081900360800190a450509c9b505050505050505050505050565b6000546001600160a01b031633146105ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b6105c16001600160a01b0383163383611548565b5050565b6000546001600160a01b0316331461061f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f305e87b67e942ca51cbdcd6a078f76bcc9ed0c8db1000119f2d40ded1d9a1d7590600090a250565b60006001600160a01b038216610695573391505b6106ca6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333086611651565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561074557600080fd5b505af1158015610759573d6000803e3d6000fd5b505050506000826001600160a01b03168460405160006040518083038185875af1925050503d80600081146107aa576040519150601f19603f3d011682016040523d82523d6000602084013e6107af565b606091505b505090508061084c5760405162461bcd60e51b815260206004820152604560248201527f57617264656e526f757465723a3a747261646557657468546f4574683a20547260448201527f616e73666572206574686572206261636b20746f20726563656976657220666160648201527f696c65642e000000000000000000000000000000000000000000000000000000608482015260a40161016a565b60408051858152602081018690526001600160a01b0385811682840152600060608301529151869450339273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee927f0000000000000000000000000000000000000000000000000000000000000000909116917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f82809181900360800190a45092915050565b6000546001600160a01b0316331461093d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b610947600061176f565b565b6000546001600160a01b031633146109a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b604051600090339083908381818185875af1925050503d80600081146109e5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ea565b606091505b50509050806105c15760405162461bcd60e51b815260206004820152604a60248201527f57617264656e526f757465723a3a636f6c6c65637452656d61696e696e67457460448201527f6865723a205472616e73666572206574686572206261636b20746f2063616c6c60648201527f6572206661696c65642e00000000000000000000000000000000000000000000608482015260a40161016a565b60006001600160a01b038216610a9b573391505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610af657600080fd5b505af1158015610b0a573d6000803e3d6000fd5b50610b469350506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915084905034611548565b506040805134808252602082018190526001600160a01b0384811683850152600060608401529251909233927f00000000000000000000000000000000000000000000000000000000000000009091169173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f8280919081900360800190a4919050565b60006001600160a01b038416610bf1573393505b6000610c0289888a33898989610f4e565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038a161415610d4e57873414610c9e5760405162461bcd60e51b815260206004820152603260248201527f57617264656e526f757465723a3a737761703a20457468657220736f7572636560448201527f20616d6f756e74206d69736d6174636865640000000000000000000000000000606482015260840161016a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610cf957600080fd5b505af1158015610d0d573d6000803e3d6000fd5b50610d499350506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691508c905083611548565b610d63565b610d636001600160a01b038a16338c84611651565b600063eb766f9c60e01b8d8d8c858d8d8c338d8d604051602401610d909a99989796959493929190611fbe565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610dfe8e828a8a8a611291565b604080518b8152602081018390526001600160a01b038981168284015260006060830152915192955033928b8316928e16917fa1053ef90d92e668a06dbab8af812d6d99e04d80c0d5af298fd8fdd3ab5f8280919081900360800190a450509b9a5050505050505050505050565b6000546001600160a01b03163314610ec65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b6001600160a01b038116610f425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016a565b610f4b8161176f565b50565b6001546040517f2db71f200000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301528881166024830152604482018890528681166064830152858116608483015260a4820185905260c482018490526000928392839290911690632db71f209060e4016000604051808303816000875af1158015610fe7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261100f9190810190612092565b81518a95509193509150156111445760008260008151811061103357611033612159565b602002602001015111156110aa57611081878b8460008151811061105957611059612159565b60200260200101518460008151811061107457611074612159565b60200260200101516117d7565b8160008151811061109457611094612159565b6020026020010151836110a791906121b7565b92505b815160021480156110d557506000826001815181106110cb576110cb612159565b6020026020010151115b156111445761111b87868c856001815181106110f3576110f3612159565b60200260200101518560018151811061110e5761110e612159565b6020026020010151611933565b8160018151811061112e5761112e612159565b60200260200101518361114191906121b7565b92505b5050979650505050505050565b8360005b84518110156112895760006001865161116e91906121b7565b82141561117c5750816111bc565b606485838151811061119057611190612159565b6020026020010151886111a391906121ce565b6111ad919061220b565b90506111b981846121b7565b92505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038516141561123d576112388683815181106111f6576111f6612159565b6020026020010151827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166115489092919063ffffffff16565b611276565b6112763387848151811061125357611253612159565b602002602001015183876001600160a01b0316611651909392919063ffffffff16565b508061128181612246565b915050611155565b505050505050565b60008073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03861614611340576040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528616906370a0823190602401602060405180830381865afa158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b919061227f565b61134c565b826001600160a01b0316315b9050600080886001600160a01b03168860405161136991906122c4565b6000604051808303816000865af19150503d80600081146113a6576040519150601f19603f3d011682016040523d82523d6000602084013e6113ab565b606091505b5091509150816113f7576044815110156113c457600080fd5b600481019050808060200190518101906113de91906122e0565b60405162461bcd60e51b815260040161016a9190612378565b505073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038616146114b2576040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528291908716906370a0823190602401602060405180830381865afa15801561147f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a3919061227f565b6114ad91906121b7565b6114c6565b6114c6816001600160a01b038516316121b7565b91508382101561153e5760405162461bcd60e51b815260206004820152603b60248201527f57617264656e526f757465723a3a5f696e7465726e616c537761703a2064657360448201527f74696e6174696f6e20616d6f756e7420697320746f6f206c6f772e0000000000606482015260840161016a565b5095945050505050565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401600060405180830381600087803b1580156115ab57600080fd5b505af19250505080156115bc575060015b61164c576115c86123ab565b806308c379a0141561160257506115dd6123c7565b806115e85750611604565b8060405162461bcd60e51b815260040161016a9190612378565b505b60405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a207472616e73666572206661696c656400604482015260640161016a565b505050565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390528516906323b872dd90606401600060405180830381600087803b1580156116bc57600080fd5b505af19250505080156116cd575060015b611769576116d96123ab565b806308c379a014156116f957506116ee6123c7565b806115e857506116fb565b505b60405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a207472616e7366657246726f6d2066616960448201527f6c65640000000000000000000000000000000000000000000000000000000000606482015260840161016a565b50505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841614156118cb576000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114611849576040519150601f19603f3d011682016040523d82523d6000602084013e61184e565b606091505b50509050806118c55760405162461bcd60e51b815260206004820152603860248201527f57617264656e526f757465723a3a5f636f6c6c6563744665653a205472616e7360448201527f66657220666565206f66206574686572206661696c65642e0000000000000000606482015260840161016a565b506118e0565b6118e06001600160a01b038416858385611651565b806001600160a01b0316836001600160a01b03167f20e2995330eff898aba363dafa356ef1daadce6099c9cc7ca8d54eefe4592b4c8460405161192591815260200190565b60405180910390a350505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161415611a27576000816001600160a01b03168360405160006040518083038185875af1925050503d80600081146119a5576040519150601f19603f3d011682016040523d82523d6000602084013e6119aa565b606091505b5050905080611a215760405162461bcd60e51b815260206004820152603860248201527f57617264656e526f757465723a3a5f706172746e65724665653a205472616e7360448201527f66657220666565206f66206574686572206661696c65642e0000000000000000606482015260840161016a565b50611a3c565b611a3c6001600160a01b038416868385611651565b806001600160a01b0316836001600160a01b0316857f51819630bf3511ccdb6a21adf4073788982d983df3b6c609b201fd9dad81d2d985604051611a8291815260200190565b60405180910390a45050505050565b6001600160a01b0381168114610f4b57600080fd5b8035611ab181611a91565b919050565b60008083601f840112611ac857600080fd5b50813567ffffffffffffffff811115611ae057600080fd5b602083019150836020828501011115611af857600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611b5457611b54611aff565b6040525050565b600067ffffffffffffffff821115611b7557611b75611aff565b5060051b60200190565b600082601f830112611b9057600080fd5b81356020611b9d82611b5b565b604051611baa8282611b2e565b83815260059390931b8501820192828101915086841115611bca57600080fd5b8286015b84811015611bee578035611be181611a91565b8352918301918301611bce565b509695505050505050565b600082601f830112611c0a57600080fd5b81356020611c1782611b5b565b604051611c248282611b2e565b83815260059390931b8501820192828101915086841115611c4457600080fd5b8286015b84811015611bee5780358352918301918301611c48565b6000806000806000806000806000806000806101608d8f031215611c8257600080fd5b611c8b8d611aa6565b9b5067ffffffffffffffff60208e01351115611ca657600080fd5b611cb68e60208f01358f01611ab6565b909b50995067ffffffffffffffff60408e01351115611cd457600080fd5b611ce48e60408f01358f01611b7f565b985067ffffffffffffffff60608e01351115611cff57600080fd5b611d0f8e60608f01358f01611bf9565b9750611d1d60808e01611aa6565b965060a08d01359550611d3260c08e01611aa6565b945060e08d01359350611d486101008e01611aa6565b92506101208d013591506101408d013590509295989b509295989b509295989b565b60008060408385031215611d7d57600080fd5b8235611d8881611a91565b946020939093013593505050565b600060208284031215611da857600080fd5b8135611db381611a91565b9392505050565b60008060408385031215611dcd57600080fd5b823591506020830135611ddf81611a91565b809150509250929050565b600060208284031215611dfc57600080fd5b5035919050565b60008060008060008060008060008060006101408c8e031215611e2557600080fd5b8b35611e3081611a91565b9a5060208c013567ffffffffffffffff811115611e4c57600080fd5b611e588e828f01611ab6565b909b5099505060408c0135611e6c81611a91565b975060608c0135611e7c81611a91565b965060808c0135955060a08c0135611e9381611a91565b945060c08c0135935060e08c0135611eaa81611a91565b809350506101008c013591506101208c013590509295989b509295989b9093969950565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b61014081526000611f0f61014083018d8f611ece565b8281036020840152808c5180835260208301915060208e01925060005b81811015611f4a578351835260209384019390920191600101611f2c565b50506001600160a01b038c1660408501529150611f649050565b886060830152876080830152611f8560a08301886001600160a01b03169052565b6001600160a01b03861660c08301526001600160a01b03851660e083015261010082019390935261012001529998505050505050505050565b6000610120808352611fd38184018d8f611ece565b6001600160a01b039b8c166020850152604084019a909a5250506060810196909652938716608086015291861660a085015290941660c083015260e0820193909352610100019190915292915050565b600082601f83011261203457600080fd5b8151602061204182611b5b565b60405161204e8282611b2e565b83815260059390931b850182019282810191508684111561206e57600080fd5b8286015b84811015611bee57805161208581611a91565b8352918301918301612072565b600080604083850312156120a557600080fd5b825167ffffffffffffffff808211156120bd57600080fd5b818501915085601f8301126120d157600080fd5b815160206120de82611b5b565b6040516120eb8282611b2e565b83815260059390931b850182019282810191508984111561210b57600080fd5b948201945b8386101561212957855182529482019490820190612110565b9188015191965090935050508082111561214257600080fd5b5061214f85828601612023565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156121c9576121c9612188565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561220657612206612188565b500290565b600082612241577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561227857612278612188565b5060010190565b60006020828403121561229157600080fd5b5051919050565b60005b838110156122b357818101518382015260200161229b565b838111156117695750506000910152565b600082516122d6818460208701612298565b9190910192915050565b6000602082840312156122f257600080fd5b815167ffffffffffffffff8082111561230a57600080fd5b818401915084601f83011261231e57600080fd5b81518181111561233057612330611aff565b60405191506123496020601f19601f8401160183611b2e565b80825285602082850101111561235e57600080fd5b61236f816020840160208601612298565b50949350505050565b6020815260008251806020840152612397816040850160208701612298565b601f01601f19169190910160400192915050565b600060033d11156123c45760046000803e5060005160e01c5b90565b600060443d10156123d55790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561242357505050505090565b828501915081518181111561243b5750505050505090565b843d87010160208285010111156124555750505050505090565b61246460208286010187611b2e565b50909594505050505056fea2646970667358221220572f4a1a97074433928602a49880a0990076600d7096a3cd575f4d70c8ecb86064736f6c634300080a0033000000000000000000000000b048ed7234277fe37db6fa00ed4d3d54296c275b000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b048ed7234277fe37db6fa00ed4d3d54296c275b000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
-----Decoded View---------------
Arg [0] : _preTrade (address): 0xb048ed7234277fe37db6fa00ed4d3d54296c275b
Arg [1] : _weth (address): 0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b048ed7234277fe37db6fa00ed4d3d54296c275b
Arg [1] : 000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
Deployed ByteCode Sourcemap
24553:14455:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38138:10;-1:-1:-1;;;;;38160:4:0;38138:27;;38130:82;;;;-1:-1:-1;;;38130:82:0;;216:2:1;38130:82:0;;;198:21:1;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:12;345:18;;;338:40;395:19;;38130:82:0;;;;;;;;;24553:14455;;;;;29828:1877;;;;;;:::i;:::-;;:::i;:::-;;;5061:25:1;;;5049:2;5034:18;29828:1877:0;;;;;;;;24680:27;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5413:55:1;;;5395:74;;5383:2;5368:18;24680:27:0;5236:239:1;38365:186:0;;;;;;;;;;-1:-1:-1;38365:186:0;;;;;:::i;:::-;;:::i;26502:203::-;;;;;;;;;;-1:-1:-1;26502:203:0;;;;;:::i;:::-;;:::i;37310:725::-;;;;;;;;;;-1:-1:-1;37310:725:0;;;;;:::i;:::-;;:::i;5492:103::-;;;;;;;;;;;;;:::i;4841:87::-;;;;;;;;;;-1:-1:-1;4887:7:0;4914:6;-1:-1:-1;;;;;4914:6:0;4841:87;;38696:309;;;;;;;;;;-1:-1:-1;38696:309:0;;;;;:::i;:::-;;:::i;36592:495::-;;;;;;:::i;:::-;;:::i;27321:1841::-;;;;;;:::i;:::-;;:::i;5750:201::-;;;;;;;;;;-1:-1:-1;5750:201:0;;;;;:::i;:::-;;:::i;24639:32::-;;;;;;;;;;-1:-1:-1;24639:32:0;;;;-1:-1:-1;;;;;24639:32:0;;;29828:1877;30270:19;-1:-1:-1;;;;;30311:23:0;;30307:78;;30363:10;30351:22;;30307:78;30421:25;30449:200;30486:4;30505:5;30525:15;30555:10;30580:9;30604:10;30629:9;30449:22;:200::i;:::-;30421:228;-1:-1:-1;24759:42:0;-1:-1:-1;;;;;30687:19:0;;;30683:203;;;30744:15;30731:9;:28;30723:96;;;;-1:-1:-1;;;30723:96:0;;9103:2:1;30723:96:0;;;9085:21:1;9142:2;9122:18;;;9115:30;9181:34;9161:18;;;9154:62;9252:25;9232:18;;;9225:53;9295:19;;30723:96:0;8901:419:1;30723:96:0;30834:4;-1:-1:-1;;;;;30834:12:0;;30854:17;30834:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30683:203;30942:124;30972:17;31004:9;31028:8;31051:4;30942:15;:124::i;:::-;31089:20;31135:32;;;31182:5;;31202:8;31225:4;31244:17;31276:15;31306:5;31326:9;31350:10;31375;31400:9;31112:308;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;31112:308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31447:139:0;31475:5;31112:308;31517:5;31537:14;31566:9;31447:13;:139::i;:::-;31602:95;;;11333:25:1;;;11389:2;11374:18;;11367:34;;;-1:-1:-1;;;;;11437:55:1;;;11417:18;;;11410:83;31692:4:0;11524:2:1;11509:18;;11502:50;31602:95:0;;11367:34:1;;-1:-1:-1;31669:10:0;;31602:95;;;;;;;;;;;;;11320:3:1;31602:95:0;;;30296:1409;;29828:1877;;;;;;;;;;;;;;:::o;38365:186::-;4887:7;4914:6;-1:-1:-1;;;;;4914:6:0;3641:10;5061:23;5053:68;;;;-1:-1:-1;;;5053:68:0;;11765:2:1;5053:68:0;;;11747:21:1;;;11784:18;;;11777:30;11843:34;11823:18;;;11816:62;11895:18;;5053:68:0;11563:356:1;5053:68:0;38503:40:::1;-1:-1:-1::0;;;;;38503:19:0;::::1;38523:10;38535:7:::0;38503:19:::1;:40::i;:::-;38365:186:::0;;:::o;26502:203::-;4887:7;4914:6;-1:-1:-1;;;;;4914:6:0;3641:10;5061:23;5053:68;;;;-1:-1:-1;;;5053:68:0;;11765:2:1;5053:68:0;;;11747:21:1;;;11784:18;;;11777:30;11843:34;11823:18;;;11816:62;11895:18;;5053:68:0;11563:356:1;5053:68:0;26629:8:::1;:20:::0;;;::::1;-1:-1:-1::0;;;;;26629:20:0;::::1;::::0;;::::1;::::0;;;26665:32:::1;::::0;::::1;::::0;-1:-1:-1;;26665:32:0::1;26502:203:::0;:::o;37310:725::-;37441:19;-1:-1:-1;;;;;37482:23:0;;37478:78;;37534:10;37522:22;;37478:78;37568:77;-1:-1:-1;;;;;37583:4:0;37568:38;37607:10;37627:4;37634:10;37568:38;:77::i;:::-;37656:25;;;;;;;;5061::1;;;37656:4:0;-1:-1:-1;;;;;37656:13:0;;;;5034:18:1;;37656:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37693:12;37711:9;-1:-1:-1;;;;;37711:14:0;37733:10;37711:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37692:56;;;37798:7;37790:89;;;;-1:-1:-1;;;37790:89:0;;12336:2:1;37790:89:0;;;12318:21:1;12375:2;12355:18;;;12348:30;12414:34;12394:18;;;12387:62;12485:34;12465:18;;;12458:62;12557:7;12536:19;;;12529:36;12582:19;;37790:89:0;12134:473:1;37790:89:0;37930:97;;;11333:25:1;;;11389:2;11374:18;;11367:34;;;-1:-1:-1;;;;;11437:55:1;;;11417:18;;;11410:83;-1:-1:-1;11524:2:1;11509:18;;11502:50;37930:97:0;;11333:25:1;;-1:-1:-1;37998:10:0;;24759:42;;37944:4;37930:97;;;;;;;;;11320:3:1;37930:97:0;;;37467:568;37310:725;;;;:::o;5492:103::-;4887:7;4914:6;-1:-1:-1;;;;;4914:6:0;3641:10;5061:23;5053:68;;;;-1:-1:-1;;;5053:68:0;;11765:2:1;5053:68:0;;;11747:21:1;;;11784:18;;;11777:30;11843:34;11823:18;;;11816:62;11895:18;;5053:68:0;11563:356:1;5053:68:0;5557:30:::1;5584:1;5557:18;:30::i;:::-;5492:103::o:0;38696:309::-;4887:7;4914:6;-1:-1:-1;;;;;4914:6:0;3641:10;5061:23;5053:68;;;;-1:-1:-1;;;5053:68:0;;11765:2:1;5053:68:0;;;11747:21:1;;;11784:18;;;11777:30;11843:34;11823:18;;;11816:62;11895:18;;5053:68:0;11563:356:1;5053:68:0;38828:35:::1;::::0;38810:12:::1;::::0;38828:10:::1;::::0;38851:7;;38810:12;38828:35;38810:12;38828:35;38851:7;38828:10;:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38809:54;;;38911:7;38903:94;;;::::0;-1:-1:-1;;;38903:94:0;;12814:2:1;38903:94:0::1;::::0;::::1;12796:21:1::0;12853:2;12833:18;;;12826:30;12892:34;12872:18;;;12865:62;12963:34;12943:18;;;12936:62;13035:12;13014:19;;;13007:41;13065:19;;38903:94:0::1;12612:478:1::0;36592:495:0;36707:19;-1:-1:-1;;;;;36748:23:0;;36744:78;;36800:10;36788:22;;36744:78;36834:4;-1:-1:-1;;;;;36834:12:0;;36854:9;36834:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36877:56:0;;-1:-1:-1;;;;;;;36892:4:0;36877:34;;-1:-1:-1;36912:9:0;;-1:-1:-1;36923:9:0;36877:34;:56::i;:::-;-1:-1:-1;36983:96:0;;;36958:9;11333:25:1;;;11389:2;11374:18;;11367:34;;;-1:-1:-1;;;;;11437:55:1;;;11417:18;;;11410:83;-1:-1:-1;11524:2:1;11509:18;;11502:50;36983:96:0;;36958:9;;37050:10;;37030:4;36983:96;;;;24759:42;;36983:96;;;;;;11320:3:1;36983:96:0;;;36592:495;;;:::o;27321:1841::-;27712:19;-1:-1:-1;;;;;27753:23:0;;27749:78;;27805:10;27793:22;;27749:78;27863:20;27886:195;27923:4;27942:5;27962:10;27987;28012:9;28036:10;28061:9;27886:22;:195::i;:::-;27863:218;-1:-1:-1;24759:42:0;-1:-1:-1;;;;;28119:19:0;;;28115:461;;;28176:10;28163:9;:23;28155:86;;;;-1:-1:-1;;;28155:86:0;;13297:2:1;28155:86:0;;;13279:21:1;13336:2;13316:18;;;13309:30;13375:34;13355:18;;;13348:62;13446:20;13426:18;;;13419:48;13484:19;;28155:86:0;13095:414:1;28155:86:0;28256:4;-1:-1:-1;;;;;28256:12:0;;28276;28256:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28367:59:0;;-1:-1:-1;;;;;;;28382:4:0;28367:34;;-1:-1:-1;28402:9:0;;-1:-1:-1;28413:12:0;28367:34;:59::i;:::-;28115:461;;;28506:58;-1:-1:-1;;;;;28506:21:0;;28528:10;28540:9;28551:12;28506:21;:58::i;:::-;28588:20;28634:27;;;28676:5;;28696:4;28715:12;28742:10;28767:5;28787:9;28811:10;28836;28861:9;28611:270;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;28611:270:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28908:139:0;28936:5;28611:270;28978:5;28998:14;29027:9;28908:13;:139::i;:::-;29063:91;;;11333:25:1;;;11389:2;11374:18;;11367:34;;;-1:-1:-1;;;;;11437:55:1;;;11417:18;;;11410:83;-1:-1:-1;11524:2:1;11509:18;;11502:50;29063:91:0;;11367:34:1;;-1:-1:-1;29125:10:0;;29063:91;;;;;;;;;;;;;11320:3:1;29063:91:0;;;27738:1424;;27321:1841;;;;;;;;;;;;;:::o;5750:201::-;4887:7;4914:6;-1:-1:-1;;;;;4914:6:0;3641:10;5061:23;5053:68;;;;-1:-1:-1;;;5053:68:0;;11765:2:1;5053:68:0;;;11747:21:1;;;11784:18;;;11777:30;11843:34;11823:18;;;11816:62;11895:18;;5053:68:0;11563:356:1;5053:68:0;-1:-1:-1;;;;;5839:22:0;::::1;5831:73;;;::::0;-1:-1:-1;;;5831:73:0;;14685:2:1;5831:73:0::1;::::0;::::1;14667:21:1::0;14724:2;14704:18;;;14697:30;14763:34;14743:18;;;14736:62;14834:8;14814:18;;;14807:36;14860:19;;5831:73:0::1;14483:402:1::0;5831:73:0::1;5915:28;5934:8;5915:18;:28::i;:::-;5750:201:::0;:::o;33967:1279::-;34374:8;;:193;;;;;-1:-1:-1;;;;;15312:15:1;;;34374:193:0;;;15294:34:1;15364:15;;;15344:18;;;15337:43;15396:18;;;15389:34;;;15459:15;;;15439:18;;;15432:43;15512:15;;;15491:19;;;15484:44;15544:19;;;15537:35;;;15588:19;;;15581:35;;;34256:21:0;;;;;;34374:8;;;;:23;;15205:19:1;;34374:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34374:193:0;;;;;;;;;;;;:::i;:::-;34619:11;;34594:10;;-1:-1:-1;34319:248:0;;-1:-1:-1;34319:248:0;-1:-1:-1;34619:15:0;34615:624;;34665:1;34655:4;34660:1;34655:7;;;;;;;;:::i;:::-;;;;;;;:11;34651:248;;;34687:153;34721:7;34751:4;34778;34783:1;34778:7;;;;;;;;:::i;:::-;;;;;;;34808:10;34819:1;34808:13;;;;;;;;:::i;:::-;;;;;;;34687:11;:153::i;:::-;34876:4;34881:1;34876:7;;;;;;;;:::i;:::-;;;;;;;34859:24;;;;;:::i;:::-;;;34651:248;34917:4;:11;34932:1;34917:16;:31;;;;;34947:1;34937:4;34942:1;34937:7;;;;;;;;:::i;:::-;;;;;;;:11;34917:31;34913:315;;;34969:200;35003:7;35033:10;35080:4;35107;35112:1;35107:7;;;;;;;;:::i;:::-;;;;;;;35137:10;35148:1;35137:13;;;;;;;;:::i;:::-;;;;;;;34969:11;:200::i;:::-;35205:4;35210:1;35205:7;;;;;;;;:::i;:::-;;;;;;;35188:24;;;;;:::i;:::-;;;34913:315;34284:962;;33967:1279;;;;;;;;;:::o;31713:986::-;31957:17;31934:20;31989:692;32010:9;:16;32006:1;:20;31989:692;;;32052:26;32125:1;32106:9;:16;:20;;;;:::i;:::-;32101:1;:25;32097:285;;;-1:-1:-1;32172:12:0;32097:285;;;32288:3;32274:8;32283:1;32274:11;;;;;;;;:::i;:::-;;;;;;;32254:17;:31;;;;:::i;:::-;:37;;;;:::i;:::-;32233:58;-1:-1:-1;32329:33:0;32233:58;32329:12;:33;:::i;:::-;32314:48;;32097:285;24759:42;-1:-1:-1;;;;;32418:19:0;;;32414:252;;;32462:68;32497:9;32507:1;32497:12;;;;;;;;:::i;:::-;;;;;;;32511:18;32477:4;-1:-1:-1;;;;;32462:34:0;;;:68;;;;;:::i;:::-;32414:252;;;32579:67;32601:10;32613:9;32623:1;32613:12;;;;;;;;:::i;:::-;;;;;;;32627:18;32579:4;-1:-1:-1;;;;;32579:21:0;;;:67;;;;;;:::i;:::-;-1:-1:-1;32028:3:0;;;;:::i;:::-;;;;31989:692;;;;31919:773;31713:986;;;;:::o;32707:1252::-;32933:19;;24759:42;-1:-1:-1;;;;;33056:20:0;;;:69;;33099:26;;;;;-1:-1:-1;;;;;5413:55:1;;;33099:26:0;;;5395:74:1;33099:15:0;;;;;5368:18:1;;33099:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33056:69;;;33079:9;-1:-1:-1;;;;;33079:17:0;;33056:69;33029:96;;33218:12;33232:19;33263:5;-1:-1:-1;;;;;33255:19:0;33275:8;33255:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33217:67;;;;33304:7;33299:313;;33433:2;33417:6;:13;:18;33413:32;;;33437:8;;;33413:32;33518:4;33510:6;33506:17;33496:27;;33578:6;33567:28;;;;;;;;;;;;:::i;:::-;33560:36;;-1:-1:-1;;;33560:36:0;;;;;;;;:::i;33299:313::-;-1:-1:-1;;24759:42:0;-1:-1:-1;;;;;33649:20:0;;;:107;;33711:26;;;;;-1:-1:-1;;;;;5413:55:1;;;33711:26:0;;;5395:74:1;33740:16:0;;33711:15;;;;;;5368:18:1;;33711:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;;:::i;:::-;33649:107;;;33672:36;33692:16;-1:-1:-1;;;;;33672:17:0;;;:36;:::i;:::-;33635:121;;33873:14;33858:11;:29;;33850:101;;;;-1:-1:-1;;;33850:101:0;;21047:2:1;33850:101:0;;;21029:21:1;21086:2;21066:18;;;21059:30;21125:34;21105:18;;;21098:62;21196:29;21176:18;;;21169:57;21243:19;;33850:101:0;20845:423:1;33850:101:0;32959:1000;32707:1252;;;;;;;:::o;9621:361::-;9705:50;;;;;-1:-1:-1;;;;;21465:55:1;;;9705:50:0;;;21447:74:1;21537:18;;;21530:34;;;9705:39:0;;;;;21420:18:1;;9705:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9701:274;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;9880:6;9873:14;;-1:-1:-1;;;9873:14:0;;;;;;;;:::i;9701:274::-;;;9922:41;;-1:-1:-1;;;9922:41:0;;22697:2:1;9922:41:0;;;22679:21:1;22736:2;22716:18;;;22709:30;22775:33;22755:18;;;22748:61;22826:18;;9922:41:0;22495:355:1;9701:274:0;9621:361;;;:::o;9990:392::-;10092:60;;;;;-1:-1:-1;;;;;23136:15:1;;;10092:60:0;;;23118:34:1;23188:15;;;23168:18;;;23161:43;23220:18;;;23213:34;;;10092:43:0;;;;;23030:18:1;;10092:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10088:287;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;10318:45;;-1:-1:-1;;;10318:45:0;;23460:2:1;10318:45:0;;;23442:21:1;23499:2;23479:18;;;23472:30;23538:34;23518:18;;;23511:62;23609:5;23589:18;;;23582:33;23632:19;;10318:45:0;23258:399:1;10088:287:0;9990:392;;;;:::o;6111:191::-;6185:16;6204:6;;-1:-1:-1;;;;;6221:17:0;;;;;;;;;;6254:40;;6204:6;;;;;;;6254:40;;6185:16;6254:40;6174:128;6111:191;:::o;35258:574::-;24759:42;-1:-1:-1;;;;;35426:21:0;;;35422:350;;;35465:12;35491:10;-1:-1:-1;;;;;35483:24:0;35515:4;35483:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35464:60;;;35578:7;35570:76;;;;-1:-1:-1;;;35570:76:0;;23864:2:1;35570:76:0;;;23846:21:1;23903:2;23883:18;;;23876:30;23942:34;23922:18;;;23915:62;24013:26;23993:18;;;23986:54;24057:19;;35570:76:0;23662:420:1;35570:76:0;35449:209;35422:350;;;35679:50;-1:-1:-1;;;;;35679:23:0;;35703:7;35712:10;35724:4;35679:23;:50::i;:::-;35807:10;-1:-1:-1;;;;;35787:37:0;35799:6;-1:-1:-1;;;;;35787:37:0;;35819:4;35787:37;;;;5061:25:1;;5049:2;5034:18;;4915:177;35787:37:0;;;;;;;;35258:574;;;;:::o;35840:582::-;24759:42;-1:-1:-1;;;;;36037:21:0;;;36033:318;;;36076:12;36102:10;-1:-1:-1;;;;;36094:24:0;36126:4;36094:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36075:60;;;36188:7;36180:76;;;;-1:-1:-1;;;36180:76:0;;24289:2:1;36180:76:0;;;24271:21:1;24328:2;24308:18;;;24301:30;24367:34;24347:18;;;24340:62;24438:26;24418:18;;;24411:54;24482:19;;36180:76:0;24087:420:1;36180:76:0;36060:208;36033:318;;;36289:50;-1:-1:-1;;;;;36289:23:0;;36313:7;36322:10;36334:4;36289:23;:50::i;:::-;36397:10;-1:-1:-1;;;;;36366:48:0;36389:6;-1:-1:-1;;;;;36366:48:0;36377:10;36366:48;36409:4;36366:48;;;;5061:25:1;;5049:2;5034:18;;4915:177;36366:48:0;;;;;;;;35840:582;;;;;:::o;425:168:1:-;-1:-1:-1;;;;;518:5:1;514:54;507:5;504:65;494:93;;583:1;580;573:12;598:162;680:20;;709:45;680:20;709:45;:::i;:::-;598:162;;;:::o;765:347::-;816:8;826:6;880:3;873:4;865:6;861:17;857:27;847:55;;898:1;895;888:12;847:55;-1:-1:-1;921:20:1;;964:18;953:30;;950:50;;;996:1;993;986:12;950:50;1033:4;1025:6;1021:17;1009:29;;1085:3;1078:4;1069:6;1061;1057:19;1053:30;1050:39;1047:59;;;1102:1;1099;1092:12;1047:59;765:347;;;;;:::o;1117:184::-;1169:77;1166:1;1159:88;1266:4;1263:1;1256:15;1290:4;1287:1;1280:15;1306:308;-1:-1:-1;;1407:2:1;1401:4;1397:13;1393:86;1385:6;1381:99;1546:6;1534:10;1531:22;1510:18;1498:10;1495:34;1492:62;1489:88;;;1557:18;;:::i;:::-;1593:2;1586:22;-1:-1:-1;;1306:308:1:o;1619:183::-;1679:4;1712:18;1704:6;1701:30;1698:56;;;1734:18;;:::i;:::-;-1:-1:-1;1779:1:1;1775:14;1791:4;1771:25;;1619:183::o;1807:813::-;1861:5;1914:3;1907:4;1899:6;1895:17;1891:27;1881:55;;1932:1;1929;1922:12;1881:55;1968:6;1955:20;1994:4;2017:43;2057:2;2017:43;:::i;:::-;2089:2;2083:9;2101:31;2129:2;2121:6;2101:31;:::i;:::-;2167:18;;;2259:1;2255:10;;;;2243:23;;2239:32;;;2201:15;;;;-1:-1:-1;2283:15:1;;;2280:35;;;2311:1;2308;2301:12;2280:35;2347:2;2339:6;2335:15;2359:231;2375:6;2370:3;2367:15;2359:231;;;2455:3;2442:17;2472:45;2511:5;2472:45;:::i;:::-;2530:18;;2568:12;;;;2392;;2359:231;;;-1:-1:-1;2608:6:1;1807:813;-1:-1:-1;;;;;;1807:813:1:o;2625:724::-;2679:5;2732:3;2725:4;2717:6;2713:17;2709:27;2699:55;;2750:1;2747;2740:12;2699:55;2786:6;2773:20;2812:4;2835:43;2875:2;2835:43;:::i;:::-;2907:2;2901:9;2919:31;2947:2;2939:6;2919:31;:::i;:::-;2985:18;;;3077:1;3073:10;;;;3061:23;;3057:32;;;3019:15;;;;-1:-1:-1;3101:15:1;;;3098:35;;;3129:1;3126;3119:12;3098:35;3165:2;3157:6;3153:15;3177:142;3193:6;3188:3;3185:15;3177:142;;;3259:17;;3247:30;;3297:12;;;;3210;;3177:142;;3354:1556;3612:6;3620;3628;3636;3644;3652;3660;3668;3676;3684;3692:7;3701;3755:3;3743:9;3734:7;3730:23;3726:33;3723:53;;;3772:1;3769;3762:12;3723:53;3795:43;3828:9;3795:43;:::i;:::-;3785:53;;3887:18;3881:2;3870:9;3866:18;3853:32;3850:56;3847:76;;;3919:1;3916;3909:12;3847:76;3958:84;4034:7;4027:2;4016:9;4012:18;3999:32;3988:9;3984:48;3958:84;:::i;:::-;4061:8;;-1:-1:-1;4088:8:1;-1:-1:-1;4145:18:1;4139:2;4124:18;;4111:32;4108:56;4105:76;;;4177:1;4174;4167:12;4105:76;4200:87;4279:7;4272:2;4261:9;4257:18;4244:32;4233:9;4229:48;4200:87;:::i;:::-;4190:97;;4336:18;4330:2;4319:9;4315:18;4302:32;4299:56;4296:76;;;4368:1;4365;4358:12;4296:76;4391:87;4470:7;4463:2;4452:9;4448:18;4435:32;4424:9;4420:48;4391:87;:::i;:::-;4381:97;;4497:53;4545:3;4534:9;4530:19;4497:53;:::i;:::-;4487:63;;4597:3;4586:9;4582:19;4569:33;4559:43;;4621:53;4669:3;4658:9;4654:19;4621:53;:::i;:::-;4611:63;;4721:3;4710:9;4706:19;4693:33;4683:43;;4745:53;4793:3;4782:9;4778:19;4745:53;:::i;:::-;4735:63;;4846:3;4835:9;4831:19;4818:33;4807:44;;4899:3;4888:9;4884:19;4871:33;4860:44;;3354:1556;;;;;;;;;;;;;;:::o;5480:343::-;5562:6;5570;5623:2;5611:9;5602:7;5598:23;5594:32;5591:52;;;5639:1;5636;5629:12;5591:52;5678:9;5665:23;5697:45;5736:5;5697:45;:::i;:::-;5761:5;5813:2;5798:18;;;;5785:32;;-1:-1:-1;;;5480:343:1:o;5828:285::-;5911:6;5964:2;5952:9;5943:7;5939:23;5935:32;5932:52;;;5980:1;5977;5970:12;5932:52;6019:9;6006:23;6038:45;6077:5;6038:45;:::i;:::-;6102:5;5828:285;-1:-1:-1;;;5828:285:1:o;6118:329::-;6186:6;6194;6247:2;6235:9;6226:7;6222:23;6218:32;6215:52;;;6263:1;6260;6253:12;6215:52;6299:9;6286:23;6276:33;;6359:2;6348:9;6344:18;6331:32;6372:45;6411:5;6372:45;:::i;:::-;6436:5;6426:15;;;6118:329;;;;;:::o;6683:180::-;6742:6;6795:2;6783:9;6774:7;6770:23;6766:32;6763:52;;;6811:1;6808;6801:12;6763:52;-1:-1:-1;6834:23:1;;6683:180;-1:-1:-1;6683:180:1:o;7134:1507::-;7333:6;7341;7349;7357;7365;7373;7381;7389;7397;7405;7413:7;7467:3;7455:9;7446:7;7442:23;7438:33;7435:53;;;7484:1;7481;7474:12;7435:53;7523:9;7510:23;7542:45;7581:5;7542:45;:::i;:::-;7606:5;-1:-1:-1;7662:2:1;7647:18;;7634:32;7689:18;7678:30;;7675:50;;;7721:1;7718;7711:12;7675:50;7760:58;7810:7;7801:6;7790:9;7786:22;7760:58;:::i;:::-;7837:8;;-1:-1:-1;7734:84:1;-1:-1:-1;;7924:2:1;7909:18;;7896:32;7937:47;7896:32;7937:47;:::i;:::-;8003:7;-1:-1:-1;8062:2:1;8047:18;;8034:32;8075:47;8034:32;8075:47;:::i;:::-;8141:7;-1:-1:-1;8195:3:1;8180:19;;8167:33;;-1:-1:-1;8252:3:1;8237:19;;8224:33;8266:47;8224:33;8266:47;:::i;:::-;8332:7;-1:-1:-1;8386:3:1;8371:19;;8358:33;;-1:-1:-1;8443:3:1;8428:19;;8415:33;8457:47;8415:33;8457:47;:::i;:::-;8523:7;8513:17;;;8577:3;8566:9;8562:19;8549:33;8539:43;;8630:3;8619:9;8615:19;8602:33;8591:44;;7134:1507;;;;;;;;;;;;;;:::o;9325:325::-;9413:6;9408:3;9401:19;9465:6;9458:5;9451:4;9446:3;9442:14;9429:43;;9517:1;9510:4;9501:6;9496:3;9492:16;9488:27;9481:38;9383:3;9639:4;-1:-1:-1;;9564:2:1;9556:6;9552:15;9548:88;9543:3;9539:98;9535:109;9528:116;;9325:325;;;;:::o;9655:1448::-;10143:3;10132:9;10125:22;10106:4;10170:62;10227:3;10216:9;10212:19;10204:6;10196;10170:62;:::i;:::-;10280:9;10272:6;10268:22;10263:2;10252:9;10248:18;10241:50;10311:6;10346;10340:13;10377:6;10369;10362:22;10412:2;10404:6;10400:15;10393:22;;10450:2;10442:6;10438:15;10424:29;;10471:1;10481:169;10495:6;10492:1;10489:13;10481:169;;;10556:13;;10544:26;;10599:2;10625:15;;;;10590:12;;;;10517:1;10510:9;10481:169;;;-1:-1:-1;;;;;;;5170:54:1;;10728:2;10713:18;;5158:67;10667:3;-1:-1:-1;10679:53:1;;-1:-1:-1;5097:134:1;10679:53;10768:6;10763:2;10752:9;10748:18;10741:34;10812:6;10806:3;10795:9;10791:19;10784:35;10828:54;10877:3;10866:9;10862:19;10854:6;-1:-1:-1;;;;;5170:54:1;5158:67;;5097:134;10828:54;-1:-1:-1;;;;;5170:54:1;;10940:3;10925:19;;5158:67;-1:-1:-1;;;;;5170:54:1;;11003:3;10988:19;;5158:67;11039:3;11024:19;;11017:35;;;;11083:3;11068:19;11061:36;9655:1448;;-1:-1:-1;;;;;;;;;9655:1448:1:o;13514:964::-;13886:4;13915:3;13945:2;13934:9;13927:21;13965:61;14022:2;14011:9;14007:18;13999:6;13991;13965:61;:::i;:::-;-1:-1:-1;;;;;14123:15:1;;;14118:2;14103:18;;14096:43;14170:2;14155:18;;14148:34;;;;-1:-1:-1;;14213:2:1;14198:18;;14191:34;;;;14262:15;;;14256:3;14241:19;;14234:44;14315:15;;;14309:3;14294:19;;14287:44;14368:15;;;14362:3;14347:19;;14340:44;14415:3;14400:19;;14393:35;;;;14459:3;14444:19;14437:35;;;;13957:69;13514:964;-1:-1:-1;;13514:964:1:o;15627:810::-;15692:5;15745:3;15738:4;15730:6;15726:17;15722:27;15712:55;;15763:1;15760;15753:12;15712:55;15792:6;15786:13;15818:4;15841:43;15881:2;15841:43;:::i;:::-;15913:2;15907:9;15925:31;15953:2;15945:6;15925:31;:::i;:::-;15991:18;;;16083:1;16079:10;;;;16067:23;;16063:32;;;16025:15;;;;-1:-1:-1;16107:15:1;;;16104:35;;;16135:1;16132;16125:12;16104:35;16171:2;16163:6;16159:15;16183:224;16199:6;16194:3;16191:15;16183:224;;;16272:3;16266:10;16289:45;16328:5;16289:45;:::i;:::-;16347:18;;16385:12;;;;16216;;16183:224;;16442:1196;16571:6;16579;16632:2;16620:9;16611:7;16607:23;16603:32;16600:52;;;16648:1;16645;16638:12;16600:52;16681:9;16675:16;16710:18;16751:2;16743:6;16740:14;16737:34;;;16767:1;16764;16757:12;16737:34;16805:6;16794:9;16790:22;16780:32;;16850:7;16843:4;16839:2;16835:13;16831:27;16821:55;;16872:1;16869;16862:12;16821:55;16901:2;16895:9;16923:4;16946:43;16986:2;16946:43;:::i;:::-;17018:2;17012:9;17030:31;17058:2;17050:6;17030:31;:::i;:::-;17096:18;;;17184:1;17180:10;;;;17172:19;;17168:28;;;17130:15;;;;-1:-1:-1;17208:19:1;;;17205:39;;;17240:1;17237;17230:12;17205:39;17264:11;;;;17284:135;17300:6;17295:3;17292:15;17284:135;;;17366:10;;17354:23;;17317:12;;;;17397;;;;17284:135;;;17475:18;;;17469:25;17438:6;;-1:-1:-1;17469:25:1;;-1:-1:-1;;;17506:16:1;;;17503:36;;;17535:1;17532;17525:12;17503:36;;17558:74;17624:7;17613:8;17602:9;17598:24;17558:74;:::i;:::-;17548:84;;;16442:1196;;;;;:::o;17643:184::-;17695:77;17692:1;17685:88;17792:4;17789:1;17782:15;17816:4;17813:1;17806:15;17832:184;17884:77;17881:1;17874:88;17981:4;17978:1;17971:15;18005:4;18002:1;17995:15;18021:125;18061:4;18089:1;18086;18083:8;18080:34;;;18094:18;;:::i;:::-;-1:-1:-1;18131:9:1;;18021:125::o;18151:228::-;18191:7;18317:1;18249:66;18245:74;18242:1;18239:81;18234:1;18227:9;18220:17;18216:105;18213:131;;;18324:18;;:::i;:::-;-1:-1:-1;18364:9:1;;18151:228::o;18384:274::-;18424:1;18450;18440:189;;18485:77;18482:1;18475:88;18586:4;18583:1;18576:15;18614:4;18611:1;18604:15;18440:189;-1:-1:-1;18643:9:1;;18384:274::o;18663:195::-;18702:3;18733:66;18726:5;18723:77;18720:103;;;18803:18;;:::i;:::-;-1:-1:-1;18850:1:1;18839:13;;18663:195::o;18863:184::-;18933:6;18986:2;18974:9;18965:7;18961:23;18957:32;18954:52;;;19002:1;18999;18992:12;18954:52;-1:-1:-1;19025:16:1;;18863:184;-1:-1:-1;18863:184:1:o;19052:258::-;19124:1;19134:113;19148:6;19145:1;19142:13;19134:113;;;19224:11;;;19218:18;19205:11;;;19198:39;19170:2;19163:10;19134:113;;;19265:6;19262:1;19259:13;19256:48;;;-1:-1:-1;;19300:1:1;19282:16;;19275:27;19052:258::o;19315:274::-;19444:3;19482:6;19476:13;19498:53;19544:6;19539:3;19532:4;19524:6;19520:17;19498:53;:::i;:::-;19567:16;;;;;19315:274;-1:-1:-1;;19315:274:1:o;19594:799::-;19674:6;19727:2;19715:9;19706:7;19702:23;19698:32;19695:52;;;19743:1;19740;19733:12;19695:52;19776:9;19770:16;19805:18;19846:2;19838:6;19835:14;19832:34;;;19862:1;19859;19852:12;19832:34;19900:6;19889:9;19885:22;19875:32;;19945:7;19938:4;19934:2;19930:13;19926:27;19916:55;;19967:1;19964;19957:12;19916:55;19996:2;19990:9;20018:2;20014;20011:10;20008:36;;;20024:18;;:::i;:::-;20073:2;20067:9;20053:23;;20085:124;20205:2;-1:-1:-1;;20129:4:1;20125:2;20121:13;20117:86;20113:95;20105:6;20085:124;:::i;:::-;20233:2;20225:6;20218:18;20273:7;20268:2;20263;20259;20255:11;20251:20;20248:33;20245:53;;;20294:1;20291;20284:12;20245:53;20307:55;20359:2;20354;20346:6;20342:15;20337:2;20333;20329:11;20307:55;:::i;:::-;-1:-1:-1;20381:6:1;19594:799;-1:-1:-1;;;;19594:799:1:o;20398:442::-;20547:2;20536:9;20529:21;20510:4;20579:6;20573:13;20622:6;20617:2;20606:9;20602:18;20595:34;20638:66;20697:6;20692:2;20681:9;20677:18;20672:2;20664:6;20660:15;20638:66;:::i;:::-;20756:2;20744:15;-1:-1:-1;;20740:88:1;20725:104;;;;20831:2;20721:113;;20398:442;-1:-1:-1;;20398:442:1:o;21575:179::-;21610:3;21652:1;21634:16;21631:23;21628:120;;;21698:1;21695;21692;21677:23;-1:-1:-1;21735:1:1;21729:8;21724:3;21720:18;21628:120;21575:179;:::o;21759:731::-;21798:3;21840:4;21822:16;21819:26;21816:39;;;21759:731;:::o;21816:39::-;21882:2;21876:9;21904:66;22025:2;22007:16;22003:25;22000:1;21994:4;21979:50;22058:4;22052:11;22082:16;22117:18;22188:2;22181:4;22173:6;22169:17;22166:25;22161:2;22153:6;22150:14;22147:45;22144:58;;;22195:5;;;;;21759:731;:::o;22144:58::-;22232:6;22226:4;22222:17;22211:28;;22268:3;22262:10;22295:2;22287:6;22284:14;22281:27;;;22301:5;;;;;;21759:731;:::o;22281:27::-;22385:2;22366:16;22360:4;22356:27;22352:36;22345:4;22336:6;22331:3;22327:16;22323:27;22320:69;22317:82;;;22392:5;;;;;;21759:731;:::o;22317:82::-;22408:57;22459:4;22450:6;22442;22438:19;22434:30;22428:4;22408:57;:::i;:::-;-1:-1:-1;22481:3:1;;21759:731;-1:-1:-1;;;;;21759:731:1:o
Swarm Source
ipfs://572f4a1a97074433928602a49880a0990076600d7096a3cd575f4d70c8ecb860
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.