- Contract name:
- NativeVault
- Optimization enabled
- true
- Compiler version
- v0.8.2+commit.661d1103
- Optimization runs
- 999999
- Verified at
- 2024-04-24 08:22:41.114041Z
contracts/NativeVault.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./libraries/TransferHelper.sol"; import "./libraries/BytesLibrary.sol"; import "./libraries/StringLibrary.sol"; import "./interfaces/ITransporter.sol"; import "./libraries/upgrade/PauseUpgradeSafe.sol"; import "./libraries/upgrade/OwnerOperatorUpgradeSafe.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; contract NativeVault is OwnerOperatorUpgradeSafe, PauseUpgradeSafe { using StringLibrary for string; using BytesLibrary for bytes32; struct SavedData { address sender; uint256 value; } struct SwapData { address payable sender; string token; uint256 blockExpired; uint256 amount; string nonce; uint8 v; bytes32 r; bytes32 s; } mapping(string => SavedData) public withdrawData; mapping(string => SavedData) public depositData; mapping(string => SavedData) public swapData; mapping(bytes32 => bool) public swapCompleted; event DepositVault(string nonce, address from, uint256 amount); event WithdrawVault(string nonce, address to, uint256 amount); event SwapToken(string nonce, address from, uint256 amount, string token); function initialize() public initializer { __OwnerOperator_init(); __Pause_init(); } /** * @dev pauses all deposits, claims. See {Pausable-_pause}. */ function pause() external virtual onlyOwner { _pause(); } /** * @dev unpauses all deposits, claims. See {Pausable-_pause}. */ function unpause() external virtual onlyOwner { _unpause(); } /** * @dev withdraw tokens that do not belong to the vault. */ function withdraw(string memory nonce, uint256 amount) external onlyOwner { require(amount > 0, "NativeVault: zero out amount"); TransferHelper.safeTransferETH(msg.sender, amount); withdrawData[nonce] = SavedData(msg.sender, amount); emit WithdrawVault(nonce, msg.sender, amount); } receive() external payable {} function deposit(string memory nonce) external payable { require(msg.value > 0, "NativeVault: zero out amount"); depositData[nonce] = SavedData(msg.sender, msg.value); emit DepositVault(nonce, msg.sender, msg.value); } function swapToken(SwapData memory data) external payable whenNotPaused { require( keccak256(abi.encodePacked((data.token))) == keccak256(abi.encodePacked(("kuda"))) || keccak256(abi.encodePacked((data.token))) == keccak256(abi.encodePacked(("merah"))), "NativeVault: swap token invalid" ); require(data.amount > 0, "NativeVault: zero out amount"); bytes32 message = _verifySwap(data); swapCompleted[message] = true; TransferHelper.safeTransferETH(msg.sender, data.amount); swapData[data.nonce] = SavedData(msg.sender, data.amount); emit SwapToken(data.nonce, msg.sender, msg.value, data.token); } function swapAdil(SwapData memory data) external payable whenNotPaused { require( keccak256(abi.encodePacked((data.token))) == keccak256(abi.encodePacked(("kuda"))) || keccak256(abi.encodePacked((data.token))) == keccak256(abi.encodePacked(("merah"))), "NativeVault: swap token invalid" ); bytes32 message = _verifySwap(data); swapCompleted[message] = true; require(data.amount > 0, "NativeVault: zero out amount"); TransferHelper.safeTransferETH(address(this), data.amount); swapData[data.nonce] = SavedData(msg.sender, data.amount); emit SwapToken(data.nonce, msg.sender, data.amount, "adil"); } function _verifySwap(SwapData memory data) internal view returns (bytes32) { bytes32 message = keccak256( abi.encode(address(this), "Swap", data.sender, data.token, data.blockExpired, data.amount, data.nonce) ); address signer = message.toString().recover(data.v, data.r, data.s); require(!swapCompleted[message], "NativeVault: swap completed"); require(operators[signer], "NativeVault: swap not verify"); require(block.number < data.blockExpired, "NativeVault: swap expired"); return message; } }
contracts/libraries/upgrade/OwnableUpgradeSafe.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ContextUpgradeSafe.sol"; abstract contract OwnableUpgradeSafe is ContextUpgradeSafe { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
@openzeppelin/contracts/proxy/utils/Initializable.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
@openzeppelin/contracts/utils/Counters.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
@openzeppelin/contracts/utils/math/SafeMath.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
contracts/interfaces/ITransporter.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface ITransporter { function safeTransferTokenFrom( address token_, address from_, address to_, uint256 amount_ ) external; function safeTransferNFT721From( address token_, address from_, address to_, uint256 tokenId_ ) external; function safeBurnNFT721From(address token_, uint256 tokenId_) external; function safeTransferNFT1155From( address token_, address from_, address to_, uint256 tokenId_, uint256 amount_ ) external; function safeBurnNFT1155From( address token_, address from_, uint256 tokenId_, uint256 amount_ ) external; function safeBurnBatchNFT1155From( address token_, address from_, uint256[] memory tokenId_, uint256[] memory amount_ ) external; }
contracts/libraries/BytesLibrary.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev BytesLibrary operations. */ library BytesLibrary { function toString(bytes32 value) internal pure returns (string memory) { bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(64); for (uint256 i = 0; i < 32; i++) { str[i * 2] = alphabet[uint8(value[i] >> 4)]; str[1 + i * 2] = alphabet[uint8(value[i] & 0x0f)]; } return string(str); } }
contracts/libraries/StringLibrary.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./UintLibrary.sol"; library StringLibrary { using UintLibrary for uint256; function append(string memory a, string memory b) internal pure returns (string memory) { bytes memory ba = bytes(a); bytes memory bb = bytes(b); bytes memory bab = new bytes(ba.length + bb.length); uint256 k = 0; for (uint256 i = 0; i < ba.length; i++) bab[k++] = ba[i]; for (uint256 i = 0; i < bb.length; i++) bab[k++] = bb[i]; return string(bab); } function append( string memory a, string memory b, string memory c ) internal pure returns (string memory) { bytes memory ba = bytes(a); bytes memory bb = bytes(b); bytes memory bc = bytes(c); bytes memory bbb = new bytes(ba.length + bb.length + bc.length); uint256 k = 0; for (uint256 i = 0; i < ba.length; i++) bbb[k++] = ba[i]; for (uint256 i = 0; i < bb.length; i++) bbb[k++] = bb[i]; for (uint256 i = 0; i < bc.length; i++) bbb[k++] = bc[i]; return string(bbb); } function recover( string memory message, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { bytes memory msgBytes = bytes(message); bytes memory fullMessage = concat( bytes("\x19Ethereum Signed Message:\n"), bytes(msgBytes.length.toString()), msgBytes, new bytes(0), new bytes(0), new bytes(0), new bytes(0) ); return ecrecover(keccak256(fullMessage), v, r, s); } function concat( bytes memory ba, bytes memory bb, bytes memory bc, bytes memory bd, bytes memory be, bytes memory bf, bytes memory bg ) internal pure returns (bytes memory) { bytes memory resultBytes = new bytes(ba.length + bb.length + bc.length + bd.length + be.length + bf.length + bg.length); uint256 k = 0; for (uint256 i = 0; i < ba.length; i++) resultBytes[k++] = ba[i]; for (uint256 i = 0; i < bb.length; i++) resultBytes[k++] = bb[i]; for (uint256 i = 0; i < bc.length; i++) resultBytes[k++] = bc[i]; for (uint256 i = 0; i < bd.length; i++) resultBytes[k++] = bd[i]; for (uint256 i = 0; i < be.length; i++) resultBytes[k++] = be[i]; for (uint256 i = 0; i < bf.length; i++) resultBytes[k++] = bf[i]; for (uint256 i = 0; i < bg.length; i++) resultBytes[k++] = bg[i]; return resultBytes; } }
contracts/libraries/TransferHelper.sol
//SPDX-License-Identifier: MIT pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeApprove: approve failed" ); } function safeTransfer(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeTransfer: transfer failed" ); } function safeTransferFrom(address token, address from, address to, uint256 value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::transferFrom: transferFrom failed" ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, "TransferHelper::safeTransferETH: ETH transfer failed"); } }
contracts/libraries/UintLibrary.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; library UintLibrary { using SafeMath for uint256; function toString(uint256 i) internal pure returns (string memory) { if (i == 0) { return "0"; } uint256 j = i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); for (uint256 k = len; k > 0; k--) { bstr[k - 1] = bytes1(uint8(48 + (i % 10))); i /= 10; } return string(bstr); } function bp(uint256 value, uint256 bpValue) internal pure returns (uint256) { return value.mul(bpValue).div(10000); } }
contracts/libraries/upgrade/ContextUpgradeSafe.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; abstract contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } // Reserved storage space to allow for layout changes in the future. uint256[50] private __gap; }
contracts/libraries/upgrade/OwnerOperatorUpgradeSafe.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./OwnableUpgradeSafe.sol"; abstract contract OwnerOperatorUpgradeSafe is OwnableUpgradeSafe { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. mapping(address => bool) public operators; event AddOperator(address indexed operator); event RemoveOperator(address indexed operator); function __OwnerOperator_init() internal initializer { __Ownable_init(); } modifier operatorOrOwner() { require(operators[msg.sender] || owner() == msg.sender, "OwnerOperator: !operator, !owner"); _; } modifier onlyOperator() { require(operators[msg.sender], "OwnerOperator: !operator"); _; } function addOperator(address operator) external virtual onlyOwner { require(operator != address(0), "OwnerOperator: operator is the zero address"); require(!operators[operator], "OwnerOperator: operator existed"); operators[operator] = true; emit AddOperator(operator); } function removeOperator(address operator) external virtual onlyOwner { require(operator != address(0), "OwnerOperator: operator is the zero address"); require(operators[operator], "OwnerOperator: operator not exist"); operators[operator] = false; emit RemoveOperator(operator); } }
contracts/libraries/upgrade/PauseUpgradeSafe.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ContextUpgradeSafe.sol"; abstract contract PauseUpgradeSafe is ContextUpgradeSafe { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pause_init() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
Contract ABI
[{"type":"event","name":"AddOperator","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"DepositVault","inputs":[{"type":"string","name":"nonce","internalType":"string","indexed":false},{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"RemoveOperator","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SwapToken","inputs":[{"type":"string","name":"nonce","internalType":"string","indexed":false},{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"string","name":"token","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"WithdrawVault","inputs":[{"type":"string","name":"nonce","internalType":"string","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addOperator","inputs":[{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"deposit","inputs":[{"type":"string","name":"nonce","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}],"name":"depositData","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"operators","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeOperator","inputs":[{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"swapAdil","inputs":[{"type":"tuple","name":"data","internalType":"struct NativeVault.SwapData","components":[{"type":"address","name":"sender","internalType":"address payable"},{"type":"string","name":"token","internalType":"string"},{"type":"uint256","name":"blockExpired","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"string","name":"nonce","internalType":"string"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapCompleted","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}],"name":"swapData","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"swapToken","inputs":[{"type":"tuple","name":"data","internalType":"struct NativeVault.SwapData","components":[{"type":"address","name":"sender","internalType":"address payable"},{"type":"string","name":"token","internalType":"string"},{"type":"uint256","name":"blockExpired","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"string","name":"nonce","internalType":"string"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpause","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"string","name":"nonce","internalType":"string"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}],"name":"withdrawData","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"receive","stateMutability":"payable"}]
Deployed ByteCode
0x60806040526004361061012d5760003560e01c80638456cb59116100a5578063ac8a584a11610074578063d9f8f7c011610059578063d9f8f7c0146103db578063ea32e7a11461040b578063f2fde38b1461041e57610134565b8063ac8a584a146103a8578063c530d4bc146103c857610134565b80638456cb591461032b5780638da5cb5b146103405780639870d7fe14610375578063a26e11861461039557610134565b8063601d6220116100fc578063623f1e98116100e1578063623f1e98146102a9578063715018a6146103015780638129fc1c1461031657610134565b8063601d6220146101cd578063604ff5a41461025157610134565b806313e7c9d81461013957806330b39a621461017e5780633f4ba83a146101a05780635c975abb146101b557610134565b3661013457005b600080fd5b34801561014557600080fd5b50610169610154366004612c76565b60346020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561018a57600080fd5b5061019e610199366004612cec565b61043e565b005b3480156101ac57600080fd5b5061019e6105f7565b3480156101c157600080fd5b5060355460ff16610169565b3480156101d957600080fd5b506102256101e8366004612cb1565b80516020818301810180516037825292820191909301209152805460019091015473ffffffffffffffffffffffffffffffffffffffff9091169082565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610175565b34801561025d57600080fd5b5061022561026c366004612cb1565b80516020818301810180516036825292820191909301209152805460019091015473ffffffffffffffffffffffffffffffffffffffff9091169082565b3480156102b557600080fd5b506102256102c4366004612cb1565b80516020818301810180516038825292820191909301209152805460019091015473ffffffffffffffffffffffffffffffffffffffff9091169082565b34801561030d57600080fd5b5061019e610682565b34801561032257600080fd5b5061019e61070d565b34801561033757600080fd5b5061019e61085a565b34801561034c57600080fd5b5060335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b34801561038157600080fd5b5061019e610390366004612c76565b6108e3565b61019e6103a3366004612cb1565b610b0e565b3480156103b457600080fd5b5061019e6103c3366004612c76565b610c35565b61019e6103d6366004612d2f565b610e82565b3480156103e757600080fd5b506101696103f6366004612c99565b60396020526000908152604090205460ff1681565b61019e610419366004612d2f565b6111d0565b34801561042a57600080fd5b5061019e610439366004612c76565b611524565b60335473ffffffffffffffffffffffffffffffffffffffff1633146104c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000811161052e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e61746976655661756c743a207a65726f206f757420616d6f756e740000000060448201526064016104bb565b6105383382611651565b60408051808201825233815260208101839052905160369061055b908590612e58565b90815260405160209181900382018120835181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617815592909101516001909201919091557fb28ba8757c533c11df0a0296f055315bd4f431269f7a466ab4201a27fb8a5c69906105eb90849033908590612f10565b60405180910390a15050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b610680611760565b565b60335473ffffffffffffffffffffffffffffffffffffffff163314610703576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b6106806000611841565b600054610100900460ff1680610726575060005460ff16155b6107b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104bb565b600054610100900460ff1615801561081857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6108206118b8565b6108286119cb565b801561085757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b610680611b2f565b60335473ffffffffffffffffffffffffffffffffffffffff163314610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b73ffffffffffffffffffffffffffffffffffffffff8116610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f776e65724f70657261746f723a206f70657261746f7220697320746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084016104bb565b73ffffffffffffffffffffffffffffffffffffffff811660009081526034602052604090205460ff1615610a97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f776e65724f70657261746f723a206f70657261746f7220657869737465640060448201526064016104bb565b73ffffffffffffffffffffffffffffffffffffffff811660008181526034602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f4c141abccf173677929dea054f218ed87362117834a8869ec9f68d8bdaaea1dc9190a250565b60003411610b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e61746976655661756c743a207a65726f206f757420616d6f756e740000000060448201526064016104bb565b6040805180820182523381523460208201529051603790610b9a908490612e58565b90815260405160209181900382018120835181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617815592909101516001909201919091557f72e136c7777894ff746375347b3cb412587ec82a887eb1ce12489dd6e4ce632a90610c2a90839033903490612f10565b60405180910390a150565b60335473ffffffffffffffffffffffffffffffffffffffff163314610cb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b73ffffffffffffffffffffffffffffffffffffffff8116610d59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f776e65724f70657261746f723a206f70657261746f7220697320746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084016104bb565b73ffffffffffffffffffffffffffffffffffffffff811660009081526034602052604090205460ff16610e0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f776e65724f70657261746f723a206f70657261746f72206e6f74206578697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104bb565b73ffffffffffffffffffffffffffffffffffffffff811660008181526034602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f6b4be2dd49eba45ba43390fbe7da13e2b965d255db41d6a0fcf6d2e15ac1fccb9190a250565b60355460ff1615610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016104bb565b6040517f6b756461000000000000000000000000000000000000000000000000000000006020820152602401604051602081830303815290604052805190602001208160200151604051602001610f469190612e58565b604051602081830303815290604052805190602001201480610fd257506040517f6d657261680000000000000000000000000000000000000000000000000000006020820152602501604051602081830303815290604052805190602001208160200151604051602001610fba9190612e58565b60405160208183030381529060405280519060200120145b611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e61746976655661756c743a207377617020746f6b656e20696e76616c69640060448201526064016104bb565b600061104382611bef565b600081815260396020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560608301519091506110e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e61746976655661756c743a207a65726f206f757420616d6f756e740000000060448201526064016104bb565b6110f6308360600151611651565b60405180604001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018360600151815250603883608001516040516111399190612e58565b90815260405160209181900382018120835181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161781559290910151600190920191909155608083015160608401517f18467ac40591fb7037440982a806dc2926e7798e5bb8d85948e890761f1002c1926105eb92913391612f9d565b60355460ff161561123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016104bb565b6040517f6b7564610000000000000000000000000000000000000000000000000000000060208201526024016040516020818303038152906040528051906020012081602001516040516020016112949190612e58565b60405160208183030381529060405280519060200120148061132057506040517f6d6572616800000000000000000000000000000000000000000000000000000060208201526025016040516020818303038152906040528051906020012081602001516040516020016113089190612e58565b60405160208183030381529060405280519060200120145b611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e61746976655661756c743a207377617020746f6b656e20696e76616c69640060448201526064016104bb565b60008160600151116113f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e61746976655661756c743a207a65726f206f757420616d6f756e740000000060448201526064016104bb565b60006113ff82611bef565b600081815260396020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556060830151909150611449903390611651565b60405180604001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200183606001518152506038836080015160405161148c9190612e58565b90815260405160209181900382018120835181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178155928201516001909301929092556080840151908401517f18467ac40591fb7037440982a806dc2926e7798e5bb8d85948e890761f1002c1926105eb92913391349190612f4b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b73ffffffffffffffffffffffffffffffffffffffff8116611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104bb565b61085781611841565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516116889190612e58565b60006040518083038185875af1925050503d80600081146116c5576040519150601f19603f3d011682016040523d82523d6000602084013e6116ca565b606091505b505090508061175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c656400000000000000000000000060648201526084016104bb565b505050565b60355460ff166117cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016104bb565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16806118d1575060005460ff16155b61195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104bb565b600054610100900460ff161580156119c357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b610828611ddf565b600054610100900460ff16806119e4575060005460ff16155b611a70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104bb565b600054610100900460ff16158015611ad657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055801561085757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b60355460ff1615611b9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016104bb565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118173390565b6000803083600001518460200151856040015186606001518760800151604051602001611c2196959493929190612e74565b6040516020818303038152906040528051906020012090506000611c5e8460a001518560c001518660e00151611c5686611ef3565b9291906121c2565b60008381526039602052604090205490915060ff1615611cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e61746976655661756c743a207377617020636f6d706c65746564000000000060448201526064016104bb565b73ffffffffffffffffffffffffffffffffffffffff811660009081526034602052604090205460ff16611d69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e61746976655661756c743a2073776170206e6f74207665726966790000000060448201526064016104bb565b83604001514310611dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e61746976655661756c743a207377617020657870697265640000000000000060448201526064016104bb565b5090505b919050565b600054610100900460ff1680611df8575060005460ff16155b611e84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104bb565b600054610100900460ff16158015611eea57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61082833611841565b604080518082018252601081527f30313233343536373839616263646566000000000000000000000000000000006020820152815182815260608181018452926000919060208201818036833701905050905060005b60208110156121ba57826004868360208110611f8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff1681518110611ff3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff00000000000000000000000000000000000000000000000000000000000000168261202683600261308e565b8151811061205d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350828582602081106120c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b825191901a600f16908110612104577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff00000000000000000000000000000000000000000000000000000000000000168261213783600261308e565b612142906001613062565b81518110612179577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806121b281613147565b915050611f49565b509392505050565b600080859050600061223a6040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525061220d84516122d5565b6040805160008082526020820181815282840182815260608401928352608084019094528893909161246a565b9050600181805190602001208787876040516000815260200160405260405161227f949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156122a1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b606081612316575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152611dda565b8160005b8115612340578061232a81613147565b91506123399050600a8361307a565b915061231a565b60008167ffffffffffffffff811115612382577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123ac576020820181803683370190505b509050815b8015612461576123c2600a87613180565b6123cd906030613062565b60f81b826123dc6001846130cb565b81518110612413577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061244d600a8761307a565b95508061245981613112565b9150506123b1565b50949350505050565b6060600082518451865188518a518c518e516124869190613062565b6124909190613062565b61249a9190613062565b6124a49190613062565b6124ae9190613062565b6124b89190613062565b67ffffffffffffffff8111156124f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612521576020820181803683370190505b5090506000805b8a51811015612616578a818151811061256a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361259c81613147565b9450815181106125d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061260e81613147565b915050612528565b5060005b89518110156127085789818151811061265c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361268e81613147565b9450815181106126c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061270081613147565b91505061261a565b5060005b88518110156127fa5788818151811061274e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361278081613147565b9450815181106127b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806127f281613147565b91505061270c565b5060005b87518110156128ec57878181518110612840577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361287281613147565b9450815181106128ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806128e481613147565b9150506127fe565b5060005b86518110156129de57868181518110612932577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361296481613147565b94508151811061299d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806129d681613147565b9150506128f0565b5060005b8551811015612ad057858181518110612a24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612a5681613147565b945081518110612a8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612ac881613147565b9150506129e2565b5060005b8451811015612bc257848181518110612b16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612b4881613147565b945081518110612b81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612bba81613147565b915050612ad4565b50909998505050505050505050565b8035611dda81613221565b600082601f830112612bec578081fd5b813567ffffffffffffffff811115612c0657612c066131f2565b612c3760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613013565b818152846020838601011115612c4b578283fd5b816020850160208301379081016020019190915292915050565b803560ff81168114611dda57600080fd5b600060208284031215612c87578081fd5b8135612c9281613221565b9392505050565b600060208284031215612caa578081fd5b5035919050565b600060208284031215612cc2578081fd5b813567ffffffffffffffff811115612cd8578182fd5b612ce484828501612bdc565b949350505050565b60008060408385031215612cfe578081fd5b823567ffffffffffffffff811115612d14578182fd5b612d2085828601612bdc565b95602094909401359450505050565b600060208284031215612d40578081fd5b813567ffffffffffffffff80821115612d57578283fd5b8184019150610100808387031215612d6d578384fd5b612d7681613013565b9050612d8183612bd1565b8152602083013582811115612d94578485fd5b612da087828601612bdc565b6020830152506040830135604082015260608301356060820152608083013582811115612dcb578485fd5b612dd787828601612bdc565b608083015250612de960a08401612c65565b60a082015260c083013560c082015260e083013560e082015280935050505092915050565b60008151808452612e268160208601602086016130e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251612e6a8184602087016130e2565b9190910192915050565b600073ffffffffffffffffffffffffffffffffffffffff808916835260e06020840152600460e08401527f53776170000000000000000000000000000000000000000000000000000000006101008401526101208189166040850152806060850152612ee281850189612e0e565b9150508560808401528460a084015282810360c0840152612f038185612e0e565b9998505050505050505050565b600060608252612f236060830186612e0e565b73ffffffffffffffffffffffffffffffffffffffff9490941660208301525060400152919050565b600060808252612f5e6080830187612e0e565b73ffffffffffffffffffffffffffffffffffffffff861660208401528460408401528281036060840152612f928185612e0e565b979650505050505050565b600060808252612fb06080830186612e0e565b73ffffffffffffffffffffffffffffffffffffffff851660208401528360408401528281036060840152600481527f6164696c00000000000000000000000000000000000000000000000000000000602082015260408101915050949350505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561305a5761305a6131f2565b604052919050565b6000821982111561307557613075613194565b500190565b600082613089576130896131c3565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130c6576130c6613194565b500290565b6000828210156130dd576130dd613194565b500390565b60005b838110156130fd5781810151838201526020016130e5565b8381111561310c576000848401525b50505050565b60008161312157613121613194565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561317957613179613194565b5060010190565b60008261318f5761318f6131c3565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461085757600080fdfea2646970667358221220fccddf8456ed785d5619d226bbf6ef6045f87caf86b7b8783b620caadbc4171f64736f6c63430008020033