- 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