From c8386edf9edcc0366883104eab0ec074d9c4b9ac Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Sun, 21 Jul 2024 19:26:51 -0300 Subject: [PATCH 01/17] compile --- src/DelegateStaking.sol | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/DelegateStaking.sol b/src/DelegateStaking.sol index e364c36..87a42f7 100644 --- a/src/DelegateStaking.sol +++ b/src/DelegateStaking.sol @@ -72,12 +72,20 @@ contract Delegate is ERC20VotesUpgradeable, OwnableUpgradeable { // @notice stake ids belonging to a user mapping(address user => EnumerableSet.UintSet stakeIds) private userStakes; + /// @notice how many SHU a user has locked + mapping(address keyper => uint256 totalLocked) public totalLocked; + /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ /// @notice Emitted when a keyper stakes SHU - event Staked(address indexed user, address indexed keyper, uint256 amount); + event Staked( + address indexed user, + address indexed keyper, + uint256 amount, + uint256 lockPeriod + ); /// @notice Emitted when a keyper unstakes SHU event Unstaked(address indexed user, uint256 amount, uint256 shares); @@ -91,6 +99,9 @@ contract Delegate is ERC20VotesUpgradeable, OwnableUpgradeable { /// @notice Emitted when a new staking contract is set event NewStakingContract(address indexed stakingContract); + /// @notice Emitted when the lock period is changed + event NewLockPeriod(uint256 indexed lockPeriod); + /*////////////////////////////////////////////////////////////// ERRORS //////////////////////////////////////////////////////////////*/ @@ -115,6 +126,9 @@ contract Delegate is ERC20VotesUpgradeable, OwnableUpgradeable { /// the stake amount belonging to the stake id error WithdrawAmountTooHigh(); + /// @notice Thrown when someone try to unstake a stake that is still locked + error StakeIsStillLocked(); + /// @notice Thrown when a keyper try to claim rewards but has no rewards to /// claim error NoRewardsToClaim(); @@ -144,13 +158,13 @@ contract Delegate is ERC20VotesUpgradeable, OwnableUpgradeable { /// @param _stakingToken The address of the staking token, i.e. SHU /// @param _rewardsDistributor The address of the rewards distributor /// contract - /// @param _staking The address of the staking contract + /// @param _stakingContract The address of the staking contract /// @param _lockPeriod The lock period in seconds function initialize( address _owner, address _stakingToken, address _rewardsDistributor, - address _staking, + address _stakingContract, uint256 _lockPeriod ) public initializer { __ERC20_init("Delegated Staking SHU", "dSHU"); @@ -158,8 +172,9 @@ contract Delegate is ERC20VotesUpgradeable, OwnableUpgradeable { // Transfer ownership to the DAO contract _transferOwnership(_owner); - stakingToken = IERC20(_staking); + stakingToken = IERC20(_stakingToken); rewardsDistributor = IRewardsDistributor(_rewardsDistributor); + staking = IStaking(_stakingContract); lockPeriod = _lockPeriod; nextStakeId = 1; @@ -393,12 +408,14 @@ contract Delegate is ERC20VotesUpgradeable, OwnableUpgradeable { /// locked amount, the function will return 0 /// @param user The user address /// @return amount The maximum amount of assets that a user can withdraw - function maxWithdraw(address user) public view virtual returns (uint256) { + function maxWithdraw( + address user + ) public view virtual returns (uint256 amount) { uint256 shares = balanceOf(user); require(shares > 0, UserHasNoShares()); uint256 assets = convertToAssets(shares); - uint256 locked = totalLocked[keyper] - unlockedAmount; + uint256 locked = totalLocked[user]; // need the first branch as convertToAssets rounds down amount = locked >= assets ? 0 : assets - locked; From a9832693bf7fd488101bd9548bad3a9bc7565313 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Sun, 21 Jul 2024 20:44:45 -0300 Subject: [PATCH 02/17] delegate test setup --- src/DelegateStaking.sol | 2 +- test/DelegateStaking.t.sol | 184 ++++++++++++++++++++++++ test/Staking.t.sol | 12 -- test/helpers/DelegateStakingHarness.sol | 10 ++ 4 files changed, 195 insertions(+), 13 deletions(-) create mode 100644 test/DelegateStaking.t.sol create mode 100644 test/helpers/DelegateStakingHarness.sol diff --git a/src/DelegateStaking.sol b/src/DelegateStaking.sol index 87a42f7..b7b3be0 100644 --- a/src/DelegateStaking.sol +++ b/src/DelegateStaking.sol @@ -16,7 +16,7 @@ interface IStaking { /// @notice Shutter Delegate Staking Contract /// Allows users to stake SHU and earn rewards in exchange. -contract Delegate is ERC20VotesUpgradeable, OwnableUpgradeable { +contract DelegateStaking is ERC20VotesUpgradeable, OwnableUpgradeable { /*////////////////////////////////////////////////////////////// LIBRARIES //////////////////////////////////////////////////////////////*/ diff --git a/test/DelegateStaking.t.sol b/test/DelegateStaking.t.sol new file mode 100644 index 0000000..51ef5a1 --- /dev/null +++ b/test/DelegateStaking.t.sol @@ -0,0 +1,184 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import "@forge-std/Test.sol"; +import {TransparentUpgradeableProxy, ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; + +import {Staking} from "src/Staking.sol"; +import {DelegateStaking} from "src/DelegateStaking.sol"; +import {RewardsDistributor} from "src/RewardsDistributor.sol"; +import {IRewardsDistributor} from "src/interfaces/IRewardsDistributor.sol"; +import {MockGovToken} from "test/mocks/MockGovToken.sol"; +import {ProxyUtils} from "test/helpers/ProxyUtils.sol"; +import {DelegateStakingHarness} from "test/helpers/DelegateStakingHarness.sol"; + +contract DelegateStakingTest is Test { + DelegateStakingHarness public delegate; + IRewardsDistributor public rewardsDistributor; + Staking public staking; + MockGovToken public govToken; + + uint256 constant LOCK_PERIOD = 182 days; // 6 months + uint256 constant REWARD_RATE = 0.1e18; + + function setUp() public { + // Set the block timestamp to an arbitrary value to avoid introducing assumptions into tests + // based on a starting timestamp of 0, which is the default. + _jumpAhead(1234); + + govToken = new MockGovToken(); + _mintGovToken(address(this), 100_000_000e18); + vm.label(address(govToken), "govToken"); + + // deploy rewards distributor + rewardsDistributor = IRewardsDistributor( + new RewardsDistributor(address(this), address(govToken)) + ); + + // deploy staking + address stakingImpl = address(new Staking()); + + staking = Staking( + address( + new TransparentUpgradeableProxy(stakingImpl, address(this), "") + ) + ); + vm.label(address(staking), "staking"); + + staking.initialize( + address(this), // owner + address(govToken), + address(rewardsDistributor), + 0, + 0 + ); + + address delegateImpl = address(new DelegateStakingHarness()); + + delegate = DelegateStakingHarness( + address( + new TransparentUpgradeableProxy(delegateImpl, address(this), "") + ) + ); + vm.label(address(delegate), "staking"); + + delegate.initialize( + address(this), // owner + address(govToken), + address(rewardsDistributor), + address(staking), + LOCK_PERIOD + ); + + rewardsDistributor.setRewardConfiguration( + address(staking), + REWARD_RATE + ); + + // fund reward distribution + govToken.transfer(address(rewardsDistributor), 100_000_000e18); + } + + function _jumpAhead(uint256 _seconds) public { + vm.warp(vm.getBlockTimestamp() + _seconds); + } + + function _boundMintAmount(uint96 _amount) internal pure returns (uint256) { + return bound(_amount, 0, 10_000_000e18); + } + + function _boundRealisticTimeAhead( + uint256 _time + ) internal pure returns (uint256) { + return bound(_time, 1, 105 weeks); // two years + } + + function _boundUnlockedTime(uint256 _time) internal view returns (uint256) { + return bound(_time, vm.getBlockTimestamp() + LOCK_PERIOD, 105 weeks); + } + + function _mintGovToken(address _to, uint256 _amount) internal { + vm.assume( + _to != address(0) && + _to != address(delegate) && + _to != ProxyUtils.getAdminAddress(address(delegate)) + ); + + govToken.mint(_to, _amount); + } + + function _boundToRealisticStake( + uint256 _stakeAmount + ) public pure returns (uint256 _boundedStakeAmount) { + _boundedStakeAmount = uint256( + bound(_stakeAmount, 100e18, 5_000_000e18) + ); + } + + function _stake( + address _user, + address _keyper, + uint256 _amount + ) internal returns (uint256 stakeId) { + vm.assume( + _keyper != address(0) && + _keyper != ProxyUtils.getAdminAddress(address(staking)) + ); + + vm.assume( + _user != address(0) && + _user != address(this) && + _user != address(delegate) && + _user != ProxyUtils.getAdminAddress(address(delegate)) && + _user != address(rewardsDistributor) + ); + + vm.startPrank(_user); + govToken.approve(address(delegate), _amount); + stakeId = delegate.stake(_keyper, _amount); + vm.stopPrank(); + } +} + +contract Initializer is DelegateStakingTest { + function test_Initialize() public view { + assertEq( + IERC20Metadata(address(delegate)).name(), + "Delegated Staking dSHU" + ); + assertEq(IERC20Metadata(address(delegate)).symbol(), "dSHU"); + assertEq(delegate.owner(), address(this), "Wrong owner"); + assertEq( + address(delegate.stakingToken()), + address(govToken), + "Wrong staking token" + ); + assertEq( + address(delegate.rewardsDistributor()), + address(rewardsDistributor), + "Wrong rewards distributor" + ); + assertEq(delegate.lockPeriod(), LOCK_PERIOD, "Wrong lock period"); + assertEq( + address(delegate.staking()), + address(staking), + "Wrong staking" + ); + + assertEq(delegate.exposed_nextStakeId(), 1); + } + + function test_RevertIf_InitializeImplementation() public { + DelegateStaking delegateImpl = new DelegateStaking(); + + vm.expectRevert(); + delegateImpl.initialize( + address(this), + address(govToken), + address(rewardsDistributor), + address(staking), + LOCK_PERIOD + ); + } +} diff --git a/test/Staking.t.sol b/test/Staking.t.sol index ae3ba0b..b159c77 100644 --- a/test/Staking.t.sol +++ b/test/Staking.t.sol @@ -155,18 +155,6 @@ contract StakingTest is Test { return _amount.mulDivDown(supply + 1, assets + 1); } - - function _assertMinRelativeLoss( - uint256 spent, - uint256 received, - uint256 minRelLoss, - string memory errorMessage - ) internal pure { - assertGt(spent, received, "Spent should be greater than received"); - - uint256 relativeLoss = ((spent - received) * 1e18) / spent; - assertGe(relativeLoss, minRelLoss, errorMessage); - } } contract Initializer is StakingTest { diff --git a/test/helpers/DelegateStakingHarness.sol b/test/helpers/DelegateStakingHarness.sol new file mode 100644 index 0000000..738570b --- /dev/null +++ b/test/helpers/DelegateStakingHarness.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import {DelegateStaking} from "src/DelegateStaking.sol"; + +contract DelegateStakingHarness is DelegateStaking { + function exposed_nextStakeId() external view returns (uint256) { + return nextStakeId; + } +} From 46e4a07a10dc871832858147c47d6ce6e959d5aa Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Sun, 21 Jul 2024 20:47:06 -0300 Subject: [PATCH 03/17] initialize test --- test/DelegateStaking.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/DelegateStaking.t.sol b/test/DelegateStaking.t.sol index 51ef5a1..4e39bd5 100644 --- a/test/DelegateStaking.t.sol +++ b/test/DelegateStaking.t.sol @@ -145,7 +145,7 @@ contract Initializer is DelegateStakingTest { function test_Initialize() public view { assertEq( IERC20Metadata(address(delegate)).name(), - "Delegated Staking dSHU" + "Delegated Staking SHU" ); assertEq(IERC20Metadata(address(delegate)).symbol(), "dSHU"); assertEq(delegate.owner(), address(this), "Wrong owner"); From 40cfed7d450b9fd9da37d4e70a0564544d442bb9 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Sun, 21 Jul 2024 21:18:02 -0300 Subject: [PATCH 04/17] return stake id test --- src/DelegateStaking.sol | 5 +++-- test/DelegateStaking.t.sol | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/DelegateStaking.sol b/src/DelegateStaking.sol index b7b3be0..8e6be3e 100644 --- a/src/DelegateStaking.sol +++ b/src/DelegateStaking.sol @@ -56,7 +56,7 @@ contract DelegateStaking is ERC20VotesUpgradeable, OwnableUpgradeable { /// @notice the stake struct /// @dev timestamp is the time the stake was made struct Stake { - uint256 keyper; + address keyper; uint256 amount; uint256 timestamp; uint256 lockPeriod; @@ -205,6 +205,7 @@ contract DelegateStaking is ERC20VotesUpgradeable, OwnableUpgradeable { stakeId = nextStakeId++; // Add the stake to the stakes mapping + stakes[stakeId].keyper = keyper; stakes[stakeId].amount = amount; stakes[stakeId].timestamp = block.timestamp; stakes[stakeId].lockPeriod = lockPeriod; @@ -213,7 +214,7 @@ contract DelegateStaking is ERC20VotesUpgradeable, OwnableUpgradeable { userStakes[user].add(stakeId); // Lock the SHU in the contract - stakingToken.safeTransferFrom(keyper, address(this), amount); + stakingToken.safeTransferFrom(user, address(this), amount); emit Staked(user, keyper, amount, lockPeriod); } diff --git a/test/DelegateStaking.t.sol b/test/DelegateStaking.t.sol index 4e39bd5..bfe39d5 100644 --- a/test/DelegateStaking.t.sol +++ b/test/DelegateStaking.t.sol @@ -80,6 +80,10 @@ contract DelegateStakingTest is Test { govToken.transfer(address(rewardsDistributor), 100_000_000e18); } + function _setKeyper(address _keyper, bool _isKeyper) internal { + staking.setKeyper(_keyper, _isKeyper); + } + function _jumpAhead(uint256 _seconds) public { vm.warp(vm.getBlockTimestamp() + _seconds); } @@ -182,3 +186,28 @@ contract Initializer is DelegateStakingTest { ); } } + +contract Stake is DelegateStakingTest { + function testFuzz_ReturnStakeIdWhenStaking( + address _depositor, + address _keyper, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + vm.assume(_depositor != address(0)); + + vm.startPrank(_depositor); + govToken.approve(address(delegate), _amount); + + uint256 expectedStakeId = delegate.exposed_nextStakeId(); + + uint256 stakeId = delegate.stake(_keyper, _amount); + + assertEq(stakeId, expectedStakeId, "Wrong stake id"); + vm.stopPrank(); + } +} From fce7bffc7589935f47a584d9ca477bf6a438e32f Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Sun, 21 Jul 2024 21:55:15 -0300 Subject: [PATCH 05/17] BaseStaking --- src/BaseStaking.sol | 231 ++++++++++++++++++++++++++++++++++++++++ src/DelegateStaking.sol | 4 +- src/Staking.sol | 213 ++++-------------------------------- test/Staking.t.sol | 29 ++--- 4 files changed, 268 insertions(+), 209 deletions(-) create mode 100644 src/BaseStaking.sol diff --git a/src/BaseStaking.sol b/src/BaseStaking.sol new file mode 100644 index 0000000..9f8c757 --- /dev/null +++ b/src/BaseStaking.sol @@ -0,0 +1,231 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; +import {OwnableUpgradeable} from "@openzeppelin-upgradeable/contracts/access/OwnableUpgradeable.sol"; +import {ERC20VotesUpgradeable} from "@openzeppelin-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; + +import {IERC20} from "./interfaces/IERC20.sol"; +import {SafeTransferLib} from "./libraries/SafeTransferLib.sol"; +import {FixedPointMathLib} from "./libraries/FixedPointMathLib.sol"; +import {IRewardsDistributor} from "./interfaces/IRewardsDistributor.sol"; + +interface IStaking { + function keypers(address user) external returns (bool); +} + +abstract contract BaseStaking is OwnableUpgradeable, ERC20VotesUpgradeable { + /*////////////////////////////////////////////////////////////// + LIBRARIES + //////////////////////////////////////////////////////////////*/ + + using SafeTransferLib for IERC20; + + using FixedPointMathLib for uint256; + + /*////////////////////////////////////////////////////////////// + VARIABLES + //////////////////////////////////////////////////////////////*/ + + /// @notice the staking token, i.e. SHU + /// @dev set in initialize, can't be changed + IERC20 public stakingToken; + + /// @notice the rewards distributor contract + /// @dev only owner can change + IRewardsDistributor public rewardsDistributor; + + /// @notice Unique identifier that will be used for the next stake. + uint256 internal nextStakeId; + + /// @notice the lock period in seconds + /// @dev only owner can change + uint256 public lockPeriod; + + /*////////////////////////////////////////////////////////////// + MAPPINGS + //////////////////////////////////////////////////////////////*/ + + /// @notice how many SHU a user has locked + mapping(address user => uint256 totalLocked) public totalLocked; + + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + /// @notice Emitted when a keyper claims rewards + event RewardsClaimed(address indexed user, uint256 rewards); + + /// @notice Emitted when the rewards distributor is changed + event NewRewardsDistributor(address indexed rewardsDistributor); + + event NewLockPeriod(uint256 indexed lockPeriod); + + /*////////////////////////////////////////////////////////////// + ERRORS + //////////////////////////////////////////////////////////////*/ + + /// @notice Thrown when someone try to unstake a amount that is greater than + /// the stake amount belonging to the stake id + error WithdrawAmountTooHigh(); + + /// @notice Thrown when transfer/tranferFrom is called + error TransferDisabled(); + + /// @notice Thrown when a user has no shares + error UserHasNoShares(); + + /// @notice Thrown when a user try to claim rewards but has no rewards to + /// claim + error NoRewardsToClaim(); + + /// @notice Thrown when the argument is the zero address + error AddressZero(); + + /*////////////////////////////////////////////////////////////// + MODIFIERS + //////////////////////////////////////////////////////////////*/ + + /// @notice Update rewards for a keyper + modifier updateRewards() { + // Distribute rewards + rewardsDistributor.collectRewards(); + + _; + } + + /// @notice Ensure logic contract is unusable + constructor() { + _disableInitializers(); + } + + /// @notice Claim rewards + /// - If no amount is specified, will claim all the rewards + /// - If the amount is specified, the amount must be less than the + /// maximum withdrawable amount. The maximum withdrawable amount + /// is the total amount of assets the user has minus the + /// total locked amount + /// - If the claim results in a balance less than the total locked + /// amount, the claim will be rejected + /// - The keyper can claim the rewards at any time as longs there is + /// a reward to claim + /// @param amount The amount of rewards to claim + function claimRewards( + uint256 amount + ) external updateRewards returns (uint256 rewards) { + address user = msg.sender; + + // Prevents the keyper from claiming more than they should + uint256 maxWithdrawAmount = maxWithdraw(user); + + rewards = _calculateWithdrawAmount(amount, maxWithdrawAmount); + + require(rewards > 0, NoRewardsToClaim()); + + // Calculates the amount of shares to burn + uint256 shares = previewWithdraw(rewards); + + _burn(user, shares); + + stakingToken.safeTransfer(user, rewards); + + emit RewardsClaimed(user, rewards); + } + + /*////////////////////////////////////////////////////////////// + RESTRICTED FUNCTIONS + //////////////////////////////////////////////////////////////*/ + + /// @notice Set the rewards distributor contract + /// @param _rewardsDistributor The address of the rewards distributor contract + function setRewardsDistributor( + address _rewardsDistributor + ) external onlyOwner { + require(_rewardsDistributor != address(0), AddressZero()); + rewardsDistributor = IRewardsDistributor(_rewardsDistributor); + + emit NewRewardsDistributor(_rewardsDistributor); + } + + /// @notice Set the lock period + /// @param _lockPeriod The lock period in seconds + function setLockPeriod(uint256 _lockPeriod) external onlyOwner { + lockPeriod = _lockPeriod; + + emit NewLockPeriod(_lockPeriod); + } + + /*////////////////////////////////////////////////////////////// + TRANSFER LOGIC + //////////////////////////////////////////////////////////////*/ + + /// @notice Transfer is disabled + function transfer(address, uint256) public pure override returns (bool) { + revert TransferDisabled(); + } + + /// @notice Transfer is disabled + function transferFrom( + address, + address, + uint256 + ) public pure override returns (bool) { + revert TransferDisabled(); + } + + /*////////////////////////////////////////////////////////////// + VIEW FUNCTIONS + //////////////////////////////////////////////////////////////*/ + + function previewWithdraw( + uint256 assets + ) public view virtual returns (uint256) { + // sum + 1 on both sides to prevent donation attack + return assets.mulDivUp(totalSupply() + 1, _totalAssets() + 1); + } + + /// @notice Get the total amount of shares the assets are worth + /// @param assets The amount of assets + function convertToShares( + uint256 assets + ) public view virtual returns (uint256) { + // sum + 1 on both sides to prevent donation attack + return assets.mulDivDown(totalSupply() + 1, _totalAssets() + 1); + } + + /// @notice Get the total amount of assets the shares are worth + /// @param shares The amount of shares + function convertToAssets( + uint256 shares + ) public view virtual returns (uint256) { + // sum + 1 on both sides to prevent donation attack + return shares.mulDivDown(_totalAssets() + 1, totalSupply() + 1); + } + + function maxWithdraw(address user) public view virtual returns (uint256); + + /*////////////////////////////////////////////////////////////// + INTERNAL FUNCTIONS + //////////////////////////////////////////////////////////////*/ + + /// @notice Get the amount of SHU staked for all keypers + function _totalAssets() internal view virtual returns (uint256) { + return stakingToken.balanceOf(address(this)); + } + + /// @notice Calculates the amount to withdraw + /// @param _amount The amount to withdraw + /// @param maxWithdrawAmount The maximum amount that can be withdrawn + function _calculateWithdrawAmount( + uint256 _amount, + uint256 maxWithdrawAmount + ) internal pure returns (uint256 amount) { + // If the amount is 0, withdraw all available amount + if (_amount == 0) { + amount = maxWithdrawAmount; + } else { + require(_amount <= maxWithdrawAmount, WithdrawAmountTooHigh()); + amount = _amount; + } + } +} diff --git a/src/DelegateStaking.sol b/src/DelegateStaking.sol index 8e6be3e..7dce618 100644 --- a/src/DelegateStaking.sol +++ b/src/DelegateStaking.sol @@ -73,7 +73,7 @@ contract DelegateStaking is ERC20VotesUpgradeable, OwnableUpgradeable { mapping(address user => EnumerableSet.UintSet stakeIds) private userStakes; /// @notice how many SHU a user has locked - mapping(address keyper => uint256 totalLocked) public totalLocked; + mapping(address user => uint256 totalLocked) public totalLocked; /*////////////////////////////////////////////////////////////// EVENTS @@ -183,7 +183,7 @@ contract DelegateStaking is ERC20VotesUpgradeable, OwnableUpgradeable { /// @notice Stake SHU /// - amount will be locked in the contract for the lock period /// - user must approve the contract to spend the SHU before staking - /// - this function will mint sdSHU to the keyper + /// - this function will mint dSHU to the keyper //// - dSHU is non-transferable /// @param amount The amount of SHU to stake /// @return stakeId The index of the stake diff --git a/src/Staking.sol b/src/Staking.sol index 115fd02..585517b 100644 --- a/src/Staking.sol +++ b/src/Staking.sol @@ -2,49 +2,33 @@ pragma solidity 0.8.26; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; -import {OwnableUpgradeable} from "@openzeppelin-upgradeable/contracts/access/OwnableUpgradeable.sol"; import {ERC20VotesUpgradeable} from "@openzeppelin-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; import {IERC20} from "./interfaces/IERC20.sol"; import {SafeTransferLib} from "./libraries/SafeTransferLib.sol"; import {FixedPointMathLib} from "./libraries/FixedPointMathLib.sol"; import {IRewardsDistributor} from "./interfaces/IRewardsDistributor.sol"; +import {BaseStaking} from "./BaseStaking.sol"; /// @notice Shutter Staking Contract /// Allows keypers to stake SHU for a lock period and earn rewards in exchange -contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { +contract Staking is BaseStaking { /*////////////////////////////////////////////////////////////// LIBRARIES //////////////////////////////////////////////////////////////*/ + using EnumerableSet for EnumerableSet.UintSet; using SafeTransferLib for IERC20; - using FixedPointMathLib for uint256; - /*////////////////////////////////////////////////////////////// VARIABLES //////////////////////////////////////////////////////////////*/ - /// @notice the staking token, i.e. SHU - /// @dev set in initialize, can't be changed - IERC20 public stakingToken; - - /// @notice the rewards distributor contract - /// @dev only owner can change - IRewardsDistributor public rewardsDistributor; - - /// @notice the lock period in seconds - /// @dev only owner can change - uint256 public lockPeriod; - /// @notice the minimum stake amount /// @dev only owner can change uint256 public minStake; - /// @notice Unique identifier that will be used for the next stake. - uint256 internal nextStakeId; - /*////////////////////////////////////////////////////////////// STRUCTS //////////////////////////////////////////////////////////////*/ @@ -61,44 +45,27 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { MAPPINGS //////////////////////////////////////////////////////////////*/ + // @notice stake ids belonging to a user + mapping(address user => EnumerableSet.UintSet stakeIds) internal userStakes; + /// @notice stores the metadata associated with a given stake mapping(uint256 id => Stake _stake) public stakes; - // @notice stake ids belonging to a keyper - mapping(address keyper => EnumerableSet.UintSet stakeIds) - private keyperStakes; - /// @notice keypers mapping mapping(address keyper => bool isKeyper) public keypers; - /// @notice how many SHU a keyper has locked - mapping(address keyper => uint256 totalLocked) public totalLocked; - - /*////////////////////////////////////////////////////////////// - EVENTS - //////////////////////////////////////////////////////////////*/ - /// @notice Emitted when a keyper stakes SHU event Staked(address indexed user, uint256 amount, uint256 lockPeriod); /// @notice Emitted when a keyper unstakes SHU event Unstaked(address indexed user, uint256 amount, uint256 shares); - /// @notice Emitted when a keyper claims rewards - event RewardsClaimed(address indexed user, uint256 rewards); - /// @notice Emitted when a keyper is added or removed event KeyperSet(address indexed keyper, bool isKeyper); - /// @notice Emitted when the lock period is changed - event NewLockPeriod(uint256 indexed lockPeriod); - /// @notice Emitted when the minimum stake is changed event NewMinStake(uint256 indexed minStake); - /// @notice Emitted when the rewards distributor is changed - event NewRewardsDistributor(address indexed rewardsDistributor); - /*////////////////////////////////////////////////////////////// ERRORS //////////////////////////////////////////////////////////////*/ @@ -106,12 +73,6 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { /// @notice Thrown when a non-keyper attempts a call for which only keypers are allowed error OnlyKeyper(); - /// @notice Thrown when transfer/tranferFrom is called - error TransferDisabled(); - - /// @notice Thrown when a keyper has no shares - error UserHasNoShares(); - /// @notice Thrown when a keyper has staking for the first time and the /// amount is less than the minimum stake set by the DAO error FirstStakeLessThanMinStake(); @@ -126,20 +87,9 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { /// @notice Thrown when someone try to unstake a stake that doesn't exist error StakeDoesNotExist(); - /// @notice Thrown when someone try to unstake a amount that is greater than - /// the stake amount belonging to the stake id - error WithdrawAmountTooHigh(); - /// @notice Thrown when someone try to unstake a stake that is still locked error StakeIsStillLocked(); - /// @notice Thrown when a keyper try to claim rewards but has no rewards to - /// claim - error NoRewardsToClaim(); - - /// @notice Thrown when the argument is the zero address - error AddressZero(); - /*////////////////////////////////////////////////////////////// MODIFIERS //////////////////////////////////////////////////////////////*/ @@ -150,14 +100,6 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { _; } - /// @notice Update rewards for a keyper - modifier updateRewards() { - // Distribute rewards - rewardsDistributor.collectRewards(); - - _; - } - /// @notice Ensure logic contract is unusable constructor() { _disableInitializers(); @@ -207,7 +149,7 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { address keyper = msg.sender; // Get the keyper stakes - EnumerableSet.UintSet storage stakesIds = keyperStakes[keyper]; + EnumerableSet.UintSet storage stakesIds = userStakes[keyper]; // If the keyper has no stakes, the first stake must be at least the minimum stake if (stakesIds.length() == 0) { @@ -264,7 +206,7 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { uint256 _amount ) external returns (uint256 amount) { require( - keyperStakes[keyper].contains(stakeId), + userStakes[keyper].contains(stakeId), StakeDoesNotBelongToKeyper() ); Stake memory keyperStake = stakes[stakeId]; @@ -307,7 +249,7 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { ); } - // Calculates the amounf of shares to burn + // Calculates the amount of shares to burn uint256 shares = previewWithdraw(amount); // Burn the shares @@ -325,7 +267,7 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { delete stakes[stakeId]; // Remove the stake from the keyper stakes - keyperStakes[keyper].remove(stakeId); + userStakes[keyper].remove(stakeId); } // Transfer the SHU to the keyper @@ -334,62 +276,9 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { emit Unstaked(keyper, amount, shares); } - /// @notice Claim rewards - /// - If no amount is specified, will claim all the rewards - /// - If the amount is specified, the amount must be less than the - /// maximum withdrawable amount. The maximum withdrawable amount - /// is the total amount of assets the keyper has minus either the - /// total locked amount or the minimum stake, whichever is greater - /// - If the claim results in a balance less than the total locked - /// amount, the claim will be rejected - /// - The keyper can claim the rewards at any time as longs there is - /// a reward to claim - /// @param amount The amount of rewards to claim - function claimRewards( - uint256 amount - ) external updateRewards returns (uint256 rewards) { - address keyper = msg.sender; - - // Prevents the keyper from claiming more than they should - uint256 maxWithdrawAmount = maxWithdraw(keyper); - - rewards = _calculateWithdrawAmount(amount, maxWithdrawAmount); - - require(rewards > 0, NoRewardsToClaim()); - - // Calculates the amount of shares to burn - uint256 shares = previewWithdraw(rewards); - - _burn(keyper, shares); - - stakingToken.safeTransfer(keyper, rewards); - - emit RewardsClaimed(keyper, rewards); - } - /*////////////////////////////////////////////////////////////// RESTRICTED FUNCTIONS //////////////////////////////////////////////////////////////*/ - - /// @notice Set the rewards distributor contract - /// @param _rewardsDistributor The address of the rewards distributor contract - function setRewardsDistributor( - address _rewardsDistributor - ) external onlyOwner { - require(_rewardsDistributor != address(0), AddressZero()); - rewardsDistributor = IRewardsDistributor(_rewardsDistributor); - - emit NewRewardsDistributor(_rewardsDistributor); - } - - /// @notice Set the lock period - /// @param _lockPeriod The lock period in seconds - function setLockPeriod(uint256 _lockPeriod) external onlyOwner { - lockPeriod = _lockPeriod; - - emit NewLockPeriod(_lockPeriod); - } - /// @notice Set the minimum stake amount /// @param _minStake The minimum stake amount function setMinStake(uint256 _minStake) external onlyOwner { @@ -408,70 +297,29 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { emit KeyperSet(keyper, isKeyper); } - /*////////////////////////////////////////////////////////////// - TRANSFER LOGIC - //////////////////////////////////////////////////////////////*/ - - /// @notice Transfer is disabled - function transfer(address, uint256) public pure override returns (bool) { - revert TransferDisabled(); - } - - /// @notice Transfer is disabled - function transferFrom( - address, - address, - uint256 - ) public pure override returns (bool) { - revert TransferDisabled(); - } - /*////////////////////////////////////////////////////////////// VIEW FUNCTIONS //////////////////////////////////////////////////////////////*/ - /// @notice Get the stake ids belonging to a keyper - function getKeyperStakeIds( - address keyper - ) external view returns (uint256[] memory) { - return keyperStakes[keyper].values(); - } - - function previewWithdraw( - uint256 assets - ) public view virtual returns (uint256) { - // sum + 1 on both sides to prevent donation attack - return assets.mulDivUp(totalSupply() + 1, _totalAssets() + 1); - } - - /// @notice Get the total amount of shares the assets are worth - /// @param assets The amount of assets - function convertToShares( - uint256 assets - ) public view virtual returns (uint256) { - // sum + 1 on both sides to prevent donation attack - return assets.mulDivDown(totalSupply() + 1, _totalAssets() + 1); - } - - /// @notice Get the total amount of assets the shares are worth - /// @param shares The amount of shares - function convertToAssets( - uint256 shares - ) public view virtual returns (uint256) { - // sum + 1 on both sides to prevent donation attack - return shares.mulDivDown(_totalAssets() + 1, totalSupply() + 1); - } - /// @notice Get the maximum amount of assets that a keyper can withdraw //// - if the keyper has no shares, the function will revert /// - if the keyper sSHU balance is less or equal than the minimum stake or the total /// locked amount, the function will return 0 /// @param keyper The keyper address /// @return amount The maximum amount of assets that a keyper can withdraw - function maxWithdraw(address keyper) public view virtual returns (uint256) { + function maxWithdraw( + address keyper + ) public view override returns (uint256) { return _maxWithdraw(keyper, 0); } + /// @notice Get the stake ids belonging to a user + function getUserStakeIds( + address user + ) external view returns (uint256[] memory) { + return userStakes[user].values(); + } + /*////////////////////////////////////////////////////////////// INTERNAL FUNCTIONS //////////////////////////////////////////////////////////////*/ @@ -499,25 +347,4 @@ contract Staking is ERC20VotesUpgradeable, OwnableUpgradeable { // need the first branch as convertToAssets rounds down amount = compare >= assets ? 0 : assets - compare; } - - /// @notice Get the amount of SHU staked for all keypers - function _totalAssets() internal view virtual returns (uint256) { - return stakingToken.balanceOf(address(this)); - } - - /// @notice Calculates the amount to withdraw - /// @param _amount The amount to withdraw - /// @param maxWithdrawAmount The maximum amount that can be withdrawn - function _calculateWithdrawAmount( - uint256 _amount, - uint256 maxWithdrawAmount - ) internal pure returns (uint256 amount) { - // If the amount is 0, withdraw all available amount - if (_amount == 0) { - amount = maxWithdrawAmount; - } else { - require(_amount <= maxWithdrawAmount, WithdrawAmountTooHigh()); - amount = _amount; - } - } } diff --git a/test/Staking.t.sol b/test/Staking.t.sol index b159c77..576bfa1 100644 --- a/test/Staking.t.sol +++ b/test/Staking.t.sol @@ -8,6 +8,7 @@ import {FixedPointMathLib} from "@solmate/utils/FixedPointMathLib.sol"; import {TransparentUpgradeableProxy, ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {Staking} from "src/Staking.sol"; +import {BaseStaking} from "src/BaseStaking.sol"; import {RewardsDistributor} from "src/RewardsDistributor.sol"; import {IRewardsDistributor} from "src/interfaces/IRewardsDistributor.sol"; import {MockGovToken} from "test/mocks/MockGovToken.sol"; @@ -869,7 +870,7 @@ contract ClaimRewards is StakingTest { vm.prank(_depositor); vm.expectEmit(true, true, false, false); - emit Staking.RewardsClaimed( + emit BaseStaking.RewardsClaimed( _depositor, REWARD_RATE * (vm.getBlockTimestamp() - timestampBefore) ); @@ -1119,7 +1120,7 @@ contract ClaimRewards is StakingTest { vm.prank(_depositor); - vm.expectRevert(Staking.NoRewardsToClaim.selector); + vm.expectRevert(BaseStaking.NoRewardsToClaim.selector); staking.claimRewards(0); } @@ -1130,7 +1131,7 @@ contract ClaimRewards is StakingTest { ); vm.prank(_depositor); - vm.expectRevert(Staking.UserHasNoShares.selector); + vm.expectRevert(BaseStaking.UserHasNoShares.selector); staking.claimRewards(0); } @@ -1160,7 +1161,7 @@ contract ClaimRewards is StakingTest { _stake(_depositor2, _amount2); vm.prank(_depositor2); - vm.expectRevert(Staking.NoRewardsToClaim.selector); + vm.expectRevert(BaseStaking.NoRewardsToClaim.selector); staking.claimRewards(0); } } @@ -1340,7 +1341,7 @@ contract Unstake is StakingTest { assertEq(govToken.balanceOf(_depositor), _amount * 2, "Wrong balance"); - uint256[] memory stakeIds = staking.getKeyperStakeIds(_depositor); + uint256[] memory stakeIds = staking.getUserStakeIds(_depositor); assertEq(stakeIds.length, 0, "Wrong stake ids"); } @@ -1410,7 +1411,7 @@ contract Unstake is StakingTest { assertEq(govToken.balanceOf(_depositor), _amount2, "Wrong balance"); - uint256[] memory stakeIds = staking.getKeyperStakeIds(_depositor); + uint256[] memory stakeIds = staking.getUserStakeIds(_depositor); assertEq(stakeIds.length, 1, "Wrong stake ids"); (uint256 amount, , ) = staking.stakes(stakeIds[0]); @@ -1487,7 +1488,7 @@ contract Unstake is StakingTest { _jumpAhead(vm.getBlockTimestamp() + LOCK_PERIOD); vm.prank(depositor); - vm.expectRevert(Staking.WithdrawAmountTooHigh.selector); + vm.expectRevert(BaseStaking.WithdrawAmountTooHigh.selector); staking.unstake(depositor, stakeId, MIN_STAKE); } @@ -1530,7 +1531,7 @@ contract Unstake is StakingTest { uint256 stakeId = _stake(_depositor, _amount); vm.prank(_depositor); - vm.expectRevert(Staking.WithdrawAmountTooHigh.selector); + vm.expectRevert(BaseStaking.WithdrawAmountTooHigh.selector); staking.unstake(_depositor, stakeId, _amount + 1); } @@ -1574,7 +1575,7 @@ contract OwnableFunctions is StakingTest { ); vm.expectEmit(); - emit Staking.NewRewardsDistributor(_newRewardsDistributor); + emit BaseStaking.NewRewardsDistributor(_newRewardsDistributor); staking.setRewardsDistributor(_newRewardsDistributor); assertEq( @@ -1586,7 +1587,7 @@ contract OwnableFunctions is StakingTest { function testFuzz_setLockPeriod(uint256 _newLockPeriod) public { vm.expectEmit(); - emit Staking.NewLockPeriod(_newLockPeriod); + emit BaseStaking.NewLockPeriod(_newLockPeriod); staking.setLockPeriod(_newLockPeriod); assertEq(staking.lockPeriod(), _newLockPeriod, "Wrong lock period"); @@ -1700,7 +1701,7 @@ contract ViewFunctions is StakingTest { function testFuzz_Revertif_MaxWithdrawDepositorHasNoStakes( address _depositor ) public { - vm.expectRevert(Staking.UserHasNoShares.selector); + vm.expectRevert(BaseStaking.UserHasNoShares.selector); staking.maxWithdraw(_depositor); } @@ -1828,7 +1829,7 @@ contract ViewFunctions is StakingTest { uint256 stakeId1 = _stake(_depositor, _amount1); uint256 stakeId2 = _stake(_depositor, _amount2); - uint256[] memory stakeIds = staking.getKeyperStakeIds(_depositor); + uint256[] memory stakeIds = staking.getUserStakeIds(_depositor); assertEq(stakeIds.length, 2, "Wrong stake ids"); assertEq(stakeIds[0], stakeId1, "Wrong stake id"); @@ -1849,7 +1850,7 @@ contract Transfer is StakingTest { _stake(_from, _amount); - vm.expectRevert(Staking.TransferDisabled.selector); + vm.expectRevert(BaseStaking.TransferDisabled.selector); staking.transfer(_to, _amount); } @@ -1865,7 +1866,7 @@ contract Transfer is StakingTest { _stake(_from, _amount); - vm.expectRevert(Staking.TransferDisabled.selector); + vm.expectRevert(BaseStaking.TransferDisabled.selector); staking.transferFrom(_from, _to, _amount); } } From 3878c96803fc1120741935311968945a6ba816f1 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Wed, 24 Jul 2024 09:36:30 -0300 Subject: [PATCH 06/17] uses BaseStaking for Staking.sol --- src/DelegateStaking.sol | 4 +--- src/Staking.sol | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/DelegateStaking.sol b/src/DelegateStaking.sol index 7dce618..fbca4c6 100644 --- a/src/DelegateStaking.sol +++ b/src/DelegateStaking.sol @@ -16,7 +16,7 @@ interface IStaking { /// @notice Shutter Delegate Staking Contract /// Allows users to stake SHU and earn rewards in exchange. -contract DelegateStaking is ERC20VotesUpgradeable, OwnableUpgradeable { +contract DelegateStaking is BaseStaking { /*////////////////////////////////////////////////////////////// LIBRARIES //////////////////////////////////////////////////////////////*/ @@ -24,8 +24,6 @@ contract DelegateStaking is ERC20VotesUpgradeable, OwnableUpgradeable { using SafeTransferLib for IERC20; - using FixedPointMathLib for uint256; - /*////////////////////////////////////////////////////////////// VARIABLES //////////////////////////////////////////////////////////////*/ diff --git a/src/Staking.sol b/src/Staking.sol index 585517b..e4eaacc 100644 --- a/src/Staking.sol +++ b/src/Staking.sol @@ -4,11 +4,11 @@ pragma solidity 0.8.26; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import {ERC20VotesUpgradeable} from "@openzeppelin-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; -import {IERC20} from "./interfaces/IERC20.sol"; +import {BaseStaking} from "./BaseStaking.sol"; import {SafeTransferLib} from "./libraries/SafeTransferLib.sol"; import {FixedPointMathLib} from "./libraries/FixedPointMathLib.sol"; +import {IERC20} from "./interfaces/IERC20.sol"; import {IRewardsDistributor} from "./interfaces/IRewardsDistributor.sol"; -import {BaseStaking} from "./BaseStaking.sol"; /// @notice Shutter Staking Contract /// Allows keypers to stake SHU for a lock period and earn rewards in exchange From 55f8187ab0f2c4e88859733204a1913dc7f5e40f Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Wed, 24 Jul 2024 09:36:59 -0300 Subject: [PATCH 07/17] last deployment --- .../11155111/run-1721609738.json | 306 ++++++++++++++++++ .../11155111/run-latest.json | 236 +++++++------- 2 files changed, 424 insertions(+), 118 deletions(-) create mode 100644 broadcast/DeployTestnet.s.sol/11155111/run-1721609738.json diff --git a/broadcast/DeployTestnet.s.sol/11155111/run-1721609738.json b/broadcast/DeployTestnet.s.sol/11155111/run-1721609738.json new file mode 100644 index 0000000..653adc6 --- /dev/null +++ b/broadcast/DeployTestnet.s.sol/11155111/run-1721609738.json @@ -0,0 +1,306 @@ +{ + "transactions": [ + { + "hash": "0x511c99117ed16c6274aef4ace0451d26b9e0b43cb502376c20c627015c4013e9", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x5a58b845e72dc32968fa9921bf2a800ade3e4cfd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", + "gas": "0x119c0e", + "value": "0x0", + "input": "0x60806040523461002757610011610163565b61001961002c565b610e006103f88239610e0090f35b610032565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061006190610037565b810190811060018060401b0382111761007957604052565b610041565b9061009161008a61002c565b9283610057565b565b60018060401b0381116100af576100ab602091610037565b0190565b610041565b906100c66100c183610093565b61007e565b918252565b60007f5368750000000000000000000000000000000000000000000000000000000000910152565b6100fd60036100b4565b9061010a602083016100cb565b565b6101146100f3565b90565b60007f5348550000000000000000000000000000000000000000000000000000000000910152565b61014960036100b4565b9061015660208301610117565b565b61016061013f565b90565b61017c61016e61010c565b610176610158565b906103df565b565b5190565b634e487b7160e01b600052602260045260246000fd5b90600160028304921680156101b8575b60208310146101b357565b610182565b91607f16916101a8565b600052602060002090565b601f602091010490565b1b90565b919060086101f79102916101f1600019846101d7565b926101d7565b9181191691161790565b90565b90565b61021b61021661022092610201565b610204565b610201565b90565b90565b919061023c61023761024493610207565b610223565b9083546101db565b9055565b600090565b61025f91610259610248565b91610226565b565b5b81811061026d575050565b8061027b600060019361024d565b01610262565b9190601f8111610291575b505050565b61029d6102c2936101c2565b9060206102a9846101cd565b830193106102ca575b6102bb906101cd565b0190610261565b38808061028c565b91506102bb819290506102b2565b1c90565b906102ed90600019906008026102d8565b191690565b816102fc916102dc565b906002021790565b9061030e8161017e565b9060018060401b0382116103ce576103308261032a8554610198565b85610281565b602090601f83116001146103655791809161035493600092610359575b50506102f2565b90555b565b9091500151388061034d565b601f19831691610374856101c2565b9260005b8181106103b65750916002939185600196941061039c575b50505002019055610357565b6103ac910151601f8416906102dc565b9055388080610390565b91936020600181928787015181550195019201610378565b610041565b906103dd91610304565b565b906103ee6103f59260036103d3565b60046103d3565b56fe60806040526004361015610013575b610510565b61001e6000356100bd565b806306fdde03146100b8578063095ea7b3146100b357806318160ddd146100ae57806323b872dd146100a9578063313ce567146100a457806340c10f191461009f57806370a082311461009a57806395d89b4114610095578063a9059cbb146100905763dd62ed3e0361000e576104da565b610476565b610441565b61040c565b6103b9565b61037e565b61031f565b6102af565b610256565b610169565b60e01c90565b60405190565b600080fd5b600080fd5b60009103126100de57565b6100ce565b5190565b60209181520190565b60005b838110610104575050906000910152565b8060209183015181850152016100f3565b601f801991011690565b61013e61014760209361014c93610135816100e3565b938480936100e7565b958691016100f0565b610115565b0190565b610166916020820191600081840391015261011f565b90565b34610199576101793660046100d3565b610195610184610677565b61018c6100c3565b91829182610150565b0390f35b6100c9565b60018060a01b031690565b6101b29061019e565b90565b6101be816101a9565b036101c557565b600080fd5b905035906101d7826101b5565b565b90565b6101e5816101d9565b036101ec57565b600080fd5b905035906101fe826101dc565b565b9190604083820312610229578061021d61022692600086016101ca565b936020016101f1565b90565b6100ce565b151590565b61023c9061022e565b9052565b919061025490600060208501940190610233565b565b346102875761028361027261026c366004610200565b90610692565b61027a6100c3565b91829182610240565b0390f35b6100c9565b610295906101d9565b9052565b91906102ad9060006020850194019061028c565b565b346102df576102bf3660046100d3565b6102db6102ca6106e3565b6102d26100c3565b91829182610299565b0390f35b6100c9565b909160608284031261031a5761031761030084600085016101ca565b9361030e81602086016101ca565b936040016101f1565b90565b6100ce565b346103505761034c61033b6103353660046102e4565b916106f9565b6103436100c3565b91829182610240565b0390f35b6100c9565b60ff1690565b61036490610355565b9052565b919061037c9060006020850194019061035b565b565b346103ae5761038e3660046100d3565b6103aa61039961074f565b6103a16100c3565b91829182610368565b0390f35b6100c9565b60000190565b346103e8576103d26103cc366004610200565b90610765565b6103da6100c3565b806103e4816103b3565b0390f35b6100c9565b9060208282031261040757610404916000016101ca565b90565b6100ce565b3461043c576104386104276104223660046103ed565b6107bd565b61042f6100c3565b91829182610299565b0390f35b6100c9565b34610471576104513660046100d3565b61046d61045c6107dc565b6104646100c3565b91829182610150565b0390f35b6100c9565b346104a7576104a361049261048c366004610200565b906107f2565b61049a6100c3565b91829182610240565b0390f35b6100c9565b91906040838203126104d557806104c96104d292600086016101ca565b936020016101ca565b90565b6100ce565b3461050b576105076104f66104f03660046104ac565b9061082c565b6104fe6100c3565b91829182610299565b0390f35b6100c9565b600080fd5b606090565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610550575b602083101461054b57565b61051a565b91607f1691610540565b60209181520190565b600052602060002090565b906000929180549061058961058283610530565b809461055a565b916001811690816000146105e257506001146105a5575b505050565b6105b29192939450610563565b916000925b8184106105ca57505001903880806105a0565b600181602092959395548486015201910192906105b7565b92949550505060ff19168252151560200201903880806105a0565b906106079161056e565b90565b634e487b7160e01b600052604160045260246000fd5b9061062a90610115565b810190811067ffffffffffffffff82111761064457604052565b61060a565b90610669610662926106596100c3565b938480926105fd565b0383610620565b565b61067490610649565b90565b61067f610515565b5061068a600361066b565b90565b600090565b6106af9161069e61068d565b506106a7610859565b919091610866565b600190565b600090565b60001c90565b90565b6106ce6106d3916106b9565b6106bf565b90565b6106e090546106c2565b90565b6106eb6106b4565b506106f660026106d6565b90565b916107239261070661068d565b5061071b610712610859565b829084916108c4565b919091610994565b600190565b600090565b90565b90565b61074761074261074c9261072d565b610730565b610355565b90565b610757610728565b506107626012610733565b90565b9061076f91610a37565b565b61078561078061078a9261019e565b610730565b61019e565b90565b61079690610771565b90565b6107a29061078d565b90565b906107af90610799565b600052602052604060002090565b6107d46107d9916107cc6106b4565b5060006107a5565b6106d6565b90565b6107e4610515565b506107ef600461066b565b90565b61080f916107fe61068d565b50610807610859565b919091610994565b600190565b9061081e90610799565b600052602052604060002090565b6108519161084761084c9261083f6106b4565b506001610814565b6107a5565b6106d6565b90565b600090565b610861610854565b503390565b916108749291600192610af5565b565b61087f906101a9565b9052565b6040906108ad6108b494969593966108a360608401986000850190610876565b602083019061028c565b019061028c565b565b906108c191036101d9565b90565b9291926108d281839061082c565b90816108e86108e26000196101d9565b916101d9565b036108f5575b5050509050565b81610908610902876101d9565b916101d9565b1061092f57610926939461091d9193926108b6565b90600092610af5565b803880806108ee565b5061094f849291926000938493637dc7a0d960e11b855260048501610883565b0390fd5b90565b61096a61096561096f92610953565b610730565b61019e565b90565b61097b90610956565b90565b919061099290600060208501940190610876565b565b91826109b16109ab6109a66000610972565b6101a9565b916101a9565b14610a0e57816109d26109cc6109c76000610972565b6101a9565b916101a9565b146109e5576109e392919091610c53565b565b610a0a6109f26000610972565b600091829163ec442f0560e01b83526004830161097e565b0390fd5b610a33610a1b6000610972565b6000918291634b637e8f60e11b83526004830161097e565b0390fd5b80610a53610a4d610a486000610972565b6101a9565b916101a9565b14610a7057610a6e91610a666000610972565b919091610c53565b565b610a95610a7d6000610972565b600091829163ec442f0560e01b83526004830161097e565b0390fd5b60001b90565b90610aac60001991610a99565b9181191691161790565b610aca610ac5610acf926101d9565b610730565b6101d9565b90565b90565b90610aea610ae5610af192610ab6565b610ad2565b8254610a9f565b9055565b909281610b13610b0d610b086000610972565b6101a9565b916101a9565b14610be15783610b34610b2e610b296000610972565b6101a9565b916101a9565b14610bb857610b5883610b53610b4c60018690610814565b87906107a5565b610ad5565b610b62575b505050565b919091610bad610b9b610b957f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593610799565b93610799565b93610ba46100c3565b91829182610299565b0390a3388080610b5d565b610bdd610bc56000610972565b6000918291634a1406b160e11b83526004830161097e565b0390fd5b610c06610bee6000610972565b600091829163e602df0560e01b83526004830161097e565b0390fd5b634e487b7160e01b600052601160045260246000fd5b610c2f610c35919392936101d9565b926101d9565b8201809211610c4057565b610c0a565b90610c5091016101d9565b90565b91909180610c72610c6c610c676000610972565b6101a9565b916101a9565b14600014610d5757610c97610c9083610c8b60026106d6565b610c20565b6002610ad5565b5b82610cb4610cae610ca96000610972565b6101a9565b916101a9565b14600014610d2a57610cd9610cd283610ccd60026106d6565b6108b6565b6002610ad5565b5b919091610d25610d13610d0d7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93610799565b93610799565b93610d1c6100c3565b91829182610299565b0390a3565b610d5282610d4c610d3d600087906107a5565b91610d47836106d6565b610c45565b90610ad5565b610cda565b610d6b610d66600083906107a5565b6106d6565b80610d7e610d78856101d9565b916101d9565b10610da757610d91610da29184906108b6565b610d9d600084906107a5565b610ad5565b610c98565b90610dc6909192600093849363391434e360e21b855260048501610883565b0390fdfea26469706673582212206674365a9697804867f421a3c1af936f7f97cd7d87347956c752ddcb017d38fb64736f6c634300081a0033", + "nonce": "0x13", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x75c9d9b0946f8924ce82be4264e586b3149a8ae4d088e090cc8183c9a0a169c3", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x51cadf0a4b497552a9b294beaaa0579bf4cc0913", + "function": null, + "arguments": null, + "transaction": { + "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", + "gas": "0x16104f", + "value": "0x0", + "input": "0x6080604052346100305761001a61001461010a565b906101b3565b610022610035565b61120c610354823961120c90f35b61003b565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061006a90610040565b810190811060018060401b0382111761008257604052565b61004a565b9061009a610093610035565b9283610060565b565b600080fd5b60018060a01b031690565b6100b5906100a1565b90565b6100c1816100ac565b036100c857565b600080fd5b905051906100da826100b8565b565b919060408382031261010557806100f961010292600086016100cd565b936020016100cd565b90565b61009c565b6101286115608038038061011d81610087565b9283398101906100dc565b9091565b90565b61014361013e610148926100a1565b61012c565b6100a1565b90565b6101549061012f565b90565b6101609061014b565b90565b60001b90565b9061017a60018060a01b0391610163565b9181191691161790565b61018d9061014b565b90565b90565b906101a86101a36101af92610184565b610190565b8254610169565b9055565b6101cf916101c36101c8926101d1565b610157565b6001610193565b565b6101da9061022a565b565b90565b6101f36101ee6101f8926101dc565b61012c565b6100a1565b90565b610204906101df565b90565b610210906100ac565b9052565b919061022890600060208501940190610207565b565b8061024661024061023b60006101fb565b6100ac565b916100ac565b1461025657610254906102f2565b565b61027b61026360006101fb565b6000918291631e4fbdf760e01b835260048301610214565b0390fd5b60001c90565b60018060a01b031690565b61029c6102a19161027f565b610285565b90565b6102ae9054610290565b90565b6102ba9061012f565b90565b6102c6906102b1565b90565b90565b906102e16102dc6102e8926102bd565b6102c9565b8254610169565b9055565b60000190565b6102fc60006102a4565b6103078260006102cc565b9061033b6103357f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102bd565b916102bd565b91610344610035565b8061034e816102ec565b0390a356fe60806040526004361015610013575b610564565b61001e6000356100cd565b80630e0ab921146100c857806338edf198146100c357806370bb45b3146100be578063715018a6146100b95780637f01099a146100b45780638aee8127146100af5780638da5cb5b146100aa578063c1075329146100a5578063e1d9be15146100a0578063f2fde38b1461009b5763f7c618c10361000e5761052f565b610488565b610454565b610420565b610399565b610343565b610310565b6102dd565b6102a2565b61025d565b610211565b60e01c90565b60405190565b600080fd5b600080fd5b60018060a01b031690565b6100f7906100e3565b90565b610103816100ee565b0361010a57565b600080fd5b9050359061011c826100fa565b565b90602082820312610138576101359160000161010f565b90565b6100de565b90565b61015461014f610159926100e3565b61013d565b6100e3565b90565b61016590610140565b90565b6101719061015c565b90565b9061017e90610168565b600052602052604060002090565b60001c90565b90565b6101a16101a69161018c565b610192565b90565b6101b39054610195565b90565b6101c1906002610174565b906101da60016101d3600085016101a9565b93016101a9565b90565b90565b6101e9906101dd565b9052565b91602061020f929493610208604082019660008301906101e0565b01906101e0565b565b346102425761022961022436600461011e565b6101b6565b9061023e6102356100d3565b928392836101ed565b0390f35b6100d9565b919061025b906000602085019401906101e0565b565b3461028d5761028961027861027336600461011e565b610783565b6102806100d3565b91829182610247565b0390f35b6100d9565b600091031261029d57565b6100de565b346102d2576102b2366004610292565b6102ce6102bd610929565b6102c56100d3565b91829182610247565b0390f35b6100d9565b60000190565b3461030b576102ed366004610292565b6102f5610b0b565b6102fd6100d3565b80610307816102d7565b0390f35b6100d9565b3461033e5761032861032336600461011e565b610c52565b6103306100d3565b8061033a816102d7565b0390f35b6100d9565b346103715761035b61035636600461011e565b610e0d565b6103636100d3565b8061036d816102d7565b0390f35b6100d9565b61037f906100ee565b9052565b919061039790600060208501940190610376565b565b346103c9576103a9366004610292565b6103c56103b4610e49565b6103bc6100d3565b91829182610383565b0390f35b6100d9565b6103d7816101dd565b036103de57565b600080fd5b905035906103f0826103ce565b565b919060408382031261041b578061040f610418926000860161010f565b936020016103e3565b90565b6100de565b3461044f576104396104333660046103f2565b90610e8b565b6104416100d3565b8061044b816102d7565b0390f35b6100d9565b346104835761046d6104673660046103f2565b90610f97565b6104756100d3565b8061047f816102d7565b0390f35b6100d9565b346104b6576104a061049b36600461011e565b61100b565b6104a86100d3565b806104b2816102d7565b0390f35b6100d9565b1c90565b60018060a01b031690565b6104da9060086104df93026104bb565b6104bf565b90565b906104ed91546104ca565b90565b6104fd60016000906104e2565b90565b6105099061015c565b90565b61051590610500565b9052565b919061052d9060006020850194019061050c565b565b3461055f5761053f366004610292565b61055b61054a6104f0565b6105526100d3565b91829182610519565b0390f35b6100d9565b600080fd5b600090565b90565b90565b61058861058361058d92610571565b61013d565b6101dd565b90565b1561059757565b6000632bf18ef760e11b8152806105b0600482016102d7565b0390fd5b634e487b7160e01b600052601160045260246000fd5b6105d96105df919392936101dd565b926101dd565b82039182116105ea57565b6105b4565b156105f657565b600063a24695e960e01b81528061060f600482016102d7565b0390fd5b61061f6106249161018c565b6104bf565b90565b6106319054610613565b90565b61063d9061015c565b90565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061066a90610640565b810190811067ffffffffffffffff82111761068457604052565b61064a565b60e01b90565b9050519061069c826103ce565b565b906020828203126106b8576106b59160000161068f565b90565b6100de565b6106c56100d3565b3d6000823e3d90fd5b6106dd6106e3919392936101dd565b926101dd565b916106ef8382026101dd565b9281840414901517156106fe57565b6105b4565b1561070a57565b6000631036b5ad60e31b815280610723600482016102d7565b0390fd5b60001b90565b9061073a60001991610727565b9181191691161790565b61075861075361075d926101dd565b61013d565b6101dd565b90565b90565b9061077861077361077f92610744565b610760565b825461072d565b9055565b9061078c610569565b506107a161079c60028490610174565b61056e565b916107ca6107b1600085016101a9565b6107c46107be6000610574565b916101dd565b11610590565b6108476107e3426107dd600187016101a9565b906105ca565b93610801856107fb6107f56000610574565b916101dd565b116105ef565b60206108156108106001610627565b610500565b6370a082319061083c61082730610634565b926108306100d3565b96879485938493610689565b835260048301610383565b03915afa8015610924576108776108919161089b946000916108f6575b5096610872600085016101a9565b6106ce565b9561088a610884886101dd565b916101dd565b1015610703565b6001429101610763565b6108b06108a86001610627565b8285916110a8565b82906108f16108df7fe8354b169cd993d5cdfad1036a9a3f1ea7ed77e430bccb279200fd088243f59592610168565b926108e86100d3565b91829182610247565b0390a2565b610917915060203d811161091d575b61090f8183610660565b81019061069e565b38610864565b503d610905565b6106bd565b610931610569565b50339061094861094360028490610174565b61056e565b9161095f42610959600186016101a9565b906105ca565b926109a960206109776109726001610627565b610500565b6370a082319061099e61098930610634565b926109926100d3565b95869485938493610689565b835260048301610383565b03915afa8015610ab8576109d291600091610a8a575b50946109cd600084016101a9565b6106ce565b93846109e76109e16000610574565b916101dd565b14908115610a6f575b50610a5e57610a03906001429101610763565b610a18610a106001610627565b8285916110a8565b8290610a59610a477fe8354b169cd993d5cdfad1036a9a3f1ea7ed77e430bccb279200fd088243f59592610168565b92610a506100d3565b91829182610247565b0390a2565b50509050610a6c6000610574565b90565b9050610a83610a7d866101dd565b916101dd565b10386109f0565b610aab915060203d8111610ab1575b610aa38183610660565b81019061069e565b386109bf565b503d610a99565b6106bd565b610ac56110f6565b610acd610af7565b565b610ae3610ade610ae892610571565b61013d565b6100e3565b90565b610af490610acf565b90565b610b09610b046000610aeb565b611168565b565b610b13610abd565b565b610b2690610b216110f6565b610bf5565b565b1b90565b91906008610b48910291610b4260001984610b28565b92610b28565b9181191691161790565b9190610b68610b63610b7093610744565b610760565b908354610b2c565b9055565b610b8691610b80610569565b91610b52565b565b60006001610ba292610b9c83808301610b74565b01610b74565b565b634e487b7160e01b600052600060045260246000fd5b90600003610bcd57610bcb90610b88565b565b610ba4565b610bdb90610574565b9052565b9190610bf390600060208501940190610bd2565b565b610c0b6000610c0660028490610174565b610bba565b600090610c4d610c3b7f85916a855215eab72a3dcd8facb39e6465c5878f628dffe21740fe664cc8d1f792610168565b92610c446100d3565b91829182610bdf565b0390a2565b610c5b90610b15565b565b610c6e90610c696110f6565b610cf6565b565b15610c7757565b600063d92e233d60e01b815280610c90600482016102d7565b0390fd5b610c9d90610140565b90565b610ca990610c94565b90565b90610cbd60018060a01b0391610727565b9181191691161790565b610cd090610c94565b90565b90565b90610ceb610ce6610cf292610cc7565b610cd3565b8254610cac565b9055565b610d1c81610d15610d0f610d0a6000610aeb565b6100ee565b916100ee565b1415610c70565b610d66336020610d34610d2f6001610627565b610500565b6370a0823190610d5b610d4630610634565b92610d4f6100d3565b96879485938493610689565b835260048301610383565b03915afa908115610e0857610d8392600092610dd8575b50610e8b565b610d96610d8f82610ca0565b6001610cd6565b610dc07f2d6b04df9b7d358407d1a014f1114b064add34c19d63d395db155a7e533e967a91610168565b90610dc96100d3565b80610dd3816102d7565b0390a2565b610dfa91925060203d8111610e01575b610df28183610660565b81019061069e565b9038610d7d565b503d610de8565b6106bd565b610e1690610c5d565b565b600090565b60018060a01b031690565b610e34610e399161018c565b610e1d565b90565b610e469054610e28565b90565b610e51610e18565b50610e5c6000610e3c565b90565b90610e7191610e6c6110f6565b610e73565b565b610e8991610e816001610627565b9190916110a8565b565b90610e9591610e5f565b565b90610ea991610ea46110f6565b610eab565b565b610ed181610eca610ec4610ebf6000610aeb565b6100ee565b916100ee565b1415610c70565b610eee82610ee8610ee26000610574565b916101dd565b11610590565b610f056001610eff60028490610174565b016101a9565b610f18610f126000610574565b916101dd565b14610f7a575b610f36826000610f3060028590610174565b01610763565b610f75610f637f85916a855215eab72a3dcd8facb39e6465c5878f628dffe21740fe664cc8d1f792610168565b92610f6c6100d3565b91829182610247565b0390a2565b610f92426001610f8c60028590610174565b01610763565b610f1e565b90610fa191610e97565b565b610fb490610faf6110f6565b610fb6565b565b80610fd2610fcc610fc76000610aeb565b6100ee565b916100ee565b14610fe257610fe090611168565b565b611007610fef6000610aeb565b6000918291631e4fbdf760e01b835260048301610383565b0390fd5b61101490610fa3565b565b600090565b60209181520190565b60007f5452414e534645525f4641494c45440000000000000000000000000000000000910152565b611059600f60209261101b565b61106281611024565b0190565b61107c906020810190600081830391015261104c565b90565b1561108657565b61108e6100d3565b62461bcd60e51b8152806110a460048201611066565b0390fd5b6044602092600080936110f4966110bd611016565b506040519363a9059cbb60e01b855260018060a01b0316600485015260248401525af13d15601f3d1160016000511416171661107f565b565b6110fe610e49565b61111761111161110c6111c9565b6100ee565b916100ee565b0361111e57565b6111416111296111c9565b600091829163118cdaa760e01b835260048301610383565b0390fd5b90565b9061115d61115861116492610168565b611145565b8254610cac565b9055565b6111726000610e3c565b61117d826000611148565b906111b16111ab7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610168565b91610168565b916111ba6100d3565b806111c4816102d7565b0390a3565b6111d1610e18565b50339056fea2646970667358221220e80c1a1703162e6b24aa10ec955d78a510b5b713e542664e38765612893eb0a764736f6c634300081a0033000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c536450000000000000000000000005a58b845e72dc32968fa9921bf2a800ade3e4cfd", + "nonce": "0x14", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x9690e59e4b397852947dc644630f781b5fc13044166a46b99ae7766bc7836608", + "transactionType": "CREATE", + "contractName": "Staking", + "contractAddress": "0x322b6543e76e22f2a165b4e78a7d3f7815295377", + "function": null, + "arguments": null, + "transaction": { + "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", + "gas": "0x6afc3f", + "value": "0x0", + "input": "0x60806040523461002757610011610037565b61001961002c565b615ffa61022a8239615ffa90f35b610032565b60405190565b600080fd5b61003f610049565b610047610149565b565b610051610149565b565b60401c90565b60ff1690565b61006b61007091610053565b610059565b90565b61007d905461005f565b90565b60000190565b60001c90565b60018060401b031690565b6100a36100a891610086565b61008c565b90565b6100b59054610097565b90565b60018060401b031690565b60001b90565b906100da60018060401b03916100c3565b9181191691161790565b90565b6100fb6100f6610100926100b8565b6100e4565b6100b8565b90565b90565b9061011b610116610122926100e7565b610103565b82546100c9565b9055565b61012f906100b8565b9052565b919061014790600060208501940190610126565b565b610151610205565b61015d60008201610073565b6101e85761016d600082016100ab565b61018561017f60018060401b036100b8565b916100b8565b0361018e575b50565b6101a290600060018060401b039101610106565b60018060401b036101df7fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916101d661002c565b91829182610133565b0390a13861018b565b600063f92ee8a960e01b81528061020160048201610080565b0390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009056fe60806040526004361015610013575b6114dc565b61001e6000356102dd565b806306fdde03146102d857806307a2d13a146102d3578063095ea7b3146102ce5780630962ef79146102c95780630a28a477146102c457806318160ddd146102bf57806323b872dd146102ba578063313ce567146102b5578063313da78f146102b0578063375b3c0a146102ab5780633a46b1a8146102a65780633f2a5540146102a15780633fd8b02f1461029c5780634bf5d7e914610297578063587cde1e146102925780635c19a95c1461028d5780636fcfff451461028857806370a0823114610283578063715018a61461027e57806372f702f314610279578063779972da146102745780637ecebe001461026f578063834f587a1461026a57806384b0196e146102655780638c80fd90146102605780638da5cb5b1461025b5780638e539e8c1461025657806391ddadf41461025157806395d89b411461024c57806397652527146102475780639ab24eb014610242578063a2bc66be1461023d578063a694fc3a14610238578063a6b63eb814610233578063a9059cbb1461022e578063c3cda52014610229578063c6e6f59214610224578063ce96cb771461021f578063d1f5c33b1461021a578063d5a44f8614610215578063d8fb933714610210578063dd62ed3e1461020b578063f1127ed8146102065763f2fde38b0361000e576114a9565b611473565b61138a565b611327565b6112bd565b6111c9565b611194565b61115f565b611125565b61105d565b611026565b610f9a565b610f64565b610ef4565b610ebf565b610e20565b610deb565b610d88565b610d53565b610d20565b610ce4565b610c14565b610b8d565b610b5a565b610b25565b610a84565b610a4f565b610a1a565b6109bb565b610980565b610928565b6108f3565b6108ae565b6107dd565b6107a8565b610736565b610641565b6105fd565b61058d565b610558565b610523565b6104ed565b610427565b610389565b60e01c90565b60405190565b600080fd5b600080fd5b60009103126102fe57565b6102ee565b5190565b60209181520190565b60005b838110610324575050906000910152565b806020918301518185015201610313565b601f801991011690565b61035e61036760209361036c9361035581610303565b93848093610307565b95869101610310565b610335565b0190565b610386916020820191600081840391015261033f565b90565b346103b9576103993660046102f3565b6103b56103a4611643565b6103ac6102e3565b91829182610370565b0390f35b6102e9565b90565b6103ca816103be565b036103d157565b600080fd5b905035906103e3826103c1565b565b906020828203126103ff576103fc916000016103d6565b90565b6102ee565b61040d906103be565b9052565b919061042590600060208501940190610404565b565b346104575761045361044261043d3660046103e5565b6116c1565b61044a6102e3565b91829182610411565b0390f35b6102e9565b60018060a01b031690565b6104709061045c565b90565b61047c81610467565b0361048357565b600080fd5b9050359061049582610473565b565b91906040838203126104c057806104b46104bd9260008601610488565b936020016103d6565b90565b6102ee565b151590565b6104d3906104c5565b9052565b91906104eb906000602085019401906104ca565b565b3461051e5761051a610509610503366004610497565b90611712565b6105116102e3565b918291826104d7565b0390f35b6102e9565b346105535761054f61053e6105393660046103e5565b611930565b6105466102e3565b91829182610411565b0390f35b6102e9565b346105885761058461057361056e3660046103e5565b611944565b61057b6102e3565b91829182610411565b0390f35b6102e9565b346105bd5761059d3660046102f3565b6105b96105a8611990565b6105b06102e3565b91829182610411565b0390f35b6102e9565b90916060828403126105f8576105f56105de8460008501610488565b936105ec8160208601610488565b936040016103d6565b90565b6102ee565b346106135761060d3660046105c2565b916119af565b6102e9565b60ff1690565b61062790610618565b9052565b919061063f9060006020850194019061061e565b565b34610671576106513660046102f3565b61066d61065c6119f9565b6106646102e3565b9182918261062b565b0390f35b6102e9565b906020828203126106905761068d91600001610488565b90565b6102ee565b5190565b60209181520190565b60200190565b6106b1906103be565b9052565b906106c2816020936106a8565b0190565b60200190565b906106e96106e36106dc84610695565b8093610699565b926106a2565b9060005b8181106106fa5750505090565b90919261071361070d60019286516106b5565b946106c6565b91019190916106ed565b61073391602082019160008184039101526106cc565b90565b346107665761076261075161074c366004610676565b611a2f565b6107596102e3565b9182918261071d565b0390f35b6102e9565b1c90565b90565b610782906008610787930261076b565b61076f565b90565b906107959154610772565b90565b6107a5600560009061078a565b90565b346107d8576107b83660046102f3565b6107d46107c3610798565b6107cb6102e3565b91829182610411565b0390f35b6102e9565b3461080e5761080a6107f96107f3366004610497565b90611acd565b6108016102e3565b91829182610411565b0390f35b6102e9565b60018060a01b031690565b61082e906008610833930261076b565b610813565b90565b90610841915461081e565b90565b6108516001600090610836565b90565b90565b61086b6108666108709261045c565b610854565b61045c565b90565b61087c90610857565b90565b61088890610873565b90565b6108949061087f565b9052565b91906108ac9060006020850194019061088b565b565b346108de576108be3660046102f3565b6108da6108c9610844565b6108d16102e3565b91829182610898565b0390f35b6102e9565b6108f0600360009061078a565b90565b34610923576109033660046102f3565b61091f61090e6108e3565b6109166102e3565b91829182610411565b0390f35b6102e9565b34610958576109383660046102f3565b610954610943611bee565b61094b6102e3565b91829182610370565b0390f35b6102e9565b61096690610467565b9052565b919061097e9060006020850194019061095d565b565b346109b0576109ac61099b610996366004610676565b611c8e565b6109a36102e3565b9182918261096a565b0390f35b6102e9565b60000190565b346109e9576109d36109ce366004610676565b611cb6565b6109db6102e3565b806109e5816109b5565b0390f35b6102e9565b63ffffffff1690565b610a00906109ee565b9052565b9190610a18906000602085019401906109f7565b565b34610a4a57610a46610a35610a30366004610676565b611cce565b610a3d6102e3565b91829182610a04565b0390f35b6102e9565b34610a7f57610a7b610a6a610a65366004610676565b611ce3565b610a726102e3565b91829182610411565b0390f35b6102e9565b34610ab257610a943660046102f3565b610a9c611d59565b610aa46102e3565b80610aae816109b5565b0390f35b6102e9565b60018060a01b031690565b610ad2906008610ad7930261076b565b610ab7565b90565b90610ae59154610ac2565b90565b610af3600080610ada565b90565b610aff90610873565b90565b610b0b90610af6565b9052565b9190610b2390600060208501940190610b02565b565b34610b5557610b353660046102f3565b610b51610b40610ae8565b610b486102e3565b91829182610b0f565b0390f35b6102e9565b34610b8857610b72610b6d3660046103e5565b611e03565b610b7a6102e3565b80610b84816109b5565b0390f35b6102e9565b34610bbd57610bb9610ba8610ba3366004610676565b611e0e565b610bb06102e3565b91829182610411565b0390f35b6102e9565b610bcb816104c5565b03610bd257565b600080fd5b90503590610be482610bc2565b565b9190604083820312610c0f5780610c03610c0c9260008601610488565b93602001610bd7565b90565b6102ee565b34610c4357610c2d610c27366004610be6565b90611ee8565b610c356102e3565b80610c3f816109b5565b0390f35b6102e9565b60ff60f81b1690565b610c5a90610c48565b9052565b90565b610c6a90610c5e565b9052565b93959194610cc0610cb5610cd495610ca7610cca95610ce19c9a610c9a60e08c019260008d0190610c51565b8a820360208c015261033f565b9088820360408a015261033f565b976060870190610404565b608085019061095d565b60a0830190610c61565b60c08184039101526106cc565b90565b34610d1b57610cf43660046102f3565b610d17610cff612036565b93610d0e9795979391936102e3565b97889788610c6e565b0390f35b6102e9565b34610d4e57610d38610d333660046103e5565b612181565b610d406102e3565b80610d4a816109b5565b0390f35b6102e9565b34610d8357610d633660046102f3565b610d7f610d6e61218c565b610d766102e3565b9182918261096a565b0390f35b6102e9565b34610db857610db4610da3610d9e3660046103e5565b6121ab565b610dab6102e3565b91829182610411565b0390f35b6102e9565b65ffffffffffff1690565b610dd190610dbd565b9052565b9190610de990600060208501940190610dc8565b565b34610e1b57610dfb3660046102f3565b610e17610e0661222d565b610e0e6102e3565b91829182610dd5565b0390f35b6102e9565b34610e5057610e303660046102f3565b610e4c610e3b612241565b610e436102e3565b91829182610370565b0390f35b6102e9565b610e5e90610873565b90565b90610e6b90610e55565b600052602052604060002090565b60ff1690565b610e8f906008610e94930261076b565b610e79565b90565b90610ea29154610e7f565b90565b610ebc90610eb7600891600092610e61565b610e97565b90565b34610eef57610eeb610eda610ed5366004610676565b610ea5565b610ee26102e3565b918291826104d7565b0390f35b6102e9565b34610f2457610f20610f0f610f0a366004610676565b612260565b610f176102e3565b91829182610411565b0390f35b6102e9565b9091606082840312610f5f57610f5c610f458460008501610488565b93610f5381602086016103d6565b936040016103d6565b90565b6102ee565b34610f9557610f91610f80610f7a366004610f29565b916124f4565b610f886102e3565b91829182610411565b0390f35b6102e9565b34610fca57610fc6610fb5610fb03660046103e5565b612a93565b610fbd6102e3565b91829182610411565b0390f35b6102e9565b919060a08382031261102157610fe88160008501610488565b92610ff68260208301610488565b9261101e6110078460408501610488565b9361101581606086016103d6565b936080016103d6565b90565b6102ee565b3461105857611042611039366004610fcf565b93929092612f29565b61104a6102e3565b80611054816109b5565b0390f35b6102e9565b346110735761106d366004610497565b90612f38565b6102e9565b61108181610618565b0361108857565b600080fd5b9050359061109a82611078565b565b6110a581610c5e565b036110ac57565b600080fd5b905035906110be8261109c565b565b909160c082840312611120576110d98360008401610488565b926110e781602085016103d6565b926110f582604083016103d6565b9261111d611106846060850161108d565b9361111481608086016110b1565b9360a0016110b1565b90565b6102ee565b3461115a576111446111383660046110c0565b94939093929192612fcb565b61114c6102e3565b80611156816109b5565b0390f35b6102e9565b3461118f5761118b61117a6111753660046103e5565b61307e565b6111826102e3565b91829182610411565b0390f35b6102e9565b346111c4576111c06111af6111aa366004610676565b6130ca565b6111b76102e3565b91829182610411565b0390f35b6102e9565b346111f7576111e16111dc366004610676565b61319c565b6111e96102e3565b806111f3816109b5565b0390f35b6102e9565b61121061120b611215926103be565b610854565b6103be565b90565b90611222906111fc565b600052602052604060002090565b60001c90565b61124261124791611230565b61076f565b90565b6112549054611236565b90565b611262906007611218565b61126e6000820161124a565b9161128760026112806001850161124a565b930161124a565b90565b6040906112b46112bb94969593966112aa60608401986000850190610404565b6020830190610404565b0190610404565b565b346112f0576112ec6112d86112d33660046103e5565b611257565b6112e39391936102e3565b9384938461128a565b0390f35b6102e9565b906112ff90610e55565b600052602052604060002090565b6113249061131f6004916000926112f5565b61078a565b90565b346113575761135361134261133d366004610676565b61130d565b61134a6102e3565b91829182610411565b0390f35b6102e9565b919060408382031261138557806113796113829260008601610488565b93602001610488565b90565b6102ee565b346113bb576113b76113a66113a036600461135c565b906131bf565b6113ae6102e3565b91829182610411565b0390f35b6102e9565b6113c9816109ee565b036113d057565b600080fd5b905035906113e2826113c0565b565b919060408382031261140d578061140161140a9260008601610488565b936020016113d5565b90565b6102ee565b61141b90610dbd565b9052565b60018060d01b031690565b6114339061141f565b9052565b9060208061145b9361145160008201516000860190611412565b015191019061142a565b565b919061147190600060408501940190611437565b565b346114a4576114a061148f6114893660046113e4565b90613238565b6114976102e3565b9182918261145d565b0390f35b6102e9565b346114d7576114c16114bc366004610676565b6132b6565b6114c96102e3565b806114d3816109b5565b0390f35b6102e9565b600080fd5b606090565b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561151c575b602083101461151757565b6114e6565b91607f169161150c565b60209181520190565b600052602060002090565b906000929180549061155561154e836114fc565b8094611526565b916001811690816000146115ae5750600114611571575b505050565b61157e919293945061152f565b916000925b818410611596575050019038808061156c565b60018160209295939554848601520191019290611583565b92949550505060ff191682521515602002019038808061156c565b906115d39161153a565b90565b634e487b7160e01b600052604160045260246000fd5b906115f690610335565b810190811067ffffffffffffffff82111761161057604052565b6115d6565b9061163561162e926116256102e3565b938480926115c9565b03836115ec565b565b61164090611615565b90565b61164b6114e1565b5061165f60036116596132c1565b01611637565b90565b600090565b90565b61167e61167961168392611667565b610854565b6103be565b90565b634e487b7160e01b600052601160045260246000fd5b6116ab6116b1919392936103be565b926103be565b82018092116116bc57565b611686565b61170a906116cd611662565b506116e96116d96132f1565b6116e3600161166a565b9061169c565b6117046116f4611990565b6116fe600161166a565b9061169c565b9161338d565b90565b600090565b61172f9161171e61170d565b506117276133b1565b9190916133be565b600190565b61174061174591611230565b610813565b90565b6117529054611734565b90565b60e01b90565b90505190611768826103c1565b565b90602082820312611784576117819160000161175b565b90565b6102ee565b6117916102e3565b3d6000823e3d90fd5b906117c99160206117b36117ae6001611748565b61087f565b6370bb45b3906117c16102e3565b958692611755565b8252816000816117db600482016109b5565b03925af1928315611824576117f5936117f8575b5061188d565b90565b6118189060203d811161181d575b61181081836115ec565b81019061176a565b6117ef565b503d611806565b611789565b90565b61184061183b61184592611829565b610854565b6103be565b90565b1561184f57565b60006373380d9960e01b815280611868600482016109b5565b0390fd5b61187861187d91611230565b610ab7565b90565b61188a905461186c565b90565b919091506118a5339261189f846130ca565b906133ce565b916118c3836118bd6118b7600061182c565b916103be565b11611848565b6118d56118cf84611944565b8261341d565b6118ea6118e26000611880565b828591613504565b829061192b6119197ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe92610e55565b926119226102e3565b91829182610411565b0390a2565b6119419061193c611662565b61179a565b90565b61198d90611950611662565b5061196c61195c611990565b611966600161166a565b9061169c565b6119876119776132f1565b611981600161166a565b9061169c565b91613552565b90565b611998611662565b506119ac60026119a66132c1565b0161124a565b90565b6119b761170d565b50600063a24e573d60e01b8152806119d1600482016109b5565b0390fd5b600090565b90565b6119f16119ec6119f6926119da565b610854565b610618565b90565b611a016119d5565b50611a0c60126119dd565b90565b606090565b90611a1e90610e55565b600052602052604060002090565b90565b611a4e611a49611a5392611a41611a0f565b506006611a14565b611a2c565b613585565b90565b611a6a611a65611a6f92610dbd565b610854565b6103be565b90565b916020611a94929493611a8d60408201966000830190610404565b0190610dc8565b565b90611aa090610e55565b600052602052604060002090565b90565b611ac5611ac0611aca9261141f565b610854565b6103be565b90565b611ad5611662565b50611ade6135ae565b611ae661222d565b83611af9611af383611a56565b916103be565b1015611b33575091611b25611b1f611b1a611b2b946001611b309701611a96565b611aae565b9161363e565b90613737565b611ab1565b90565b83611b4f6000928392637669fc0f60e11b845260048401611a72565b0390fd5b90611b66611b5f6102e3565b92836115ec565b565b67ffffffffffffffff8111611b8657611b82602091610335565b0190565b6115d6565b90611b9d611b9883611b68565b611b53565b918252565b60007f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000910152565b611bd4601d611b8b565b90611be160208301611ba2565b565b611beb611bca565b90565b611bf66114e1565b50611bff61222d565b611c18611c12611c0d613867565b610dbd565b91610dbd565b03611c2857611c25611be3565b90565b60006301bfc1c560e61b815280611c41600482016109b5565b0390fd5b600090565b90611c5490610e55565b600052602052604060002090565b60018060a01b031690565b611c79611c7e91611230565b611c62565b90565b611c8b9054611c6d565b90565b611cae611cb391611c9d611c45565b506000611ca86135ae565b01611c4a565b611c81565b90565b611cc790611cc26133b1565b61389f565b565b600090565b611ce090611cda611cc9565b50613935565b90565b611d03611d0891611cf2611662565b506000611cfd6132c1565b016112f5565b61124a565b90565b611d1361396d565b611d1b611d45565b565b611d31611d2c611d3692611829565b610854565b61045c565b90565b611d4290611d1d565b90565b611d57611d526000611d39565b6139bc565b565b611d61611d0b565b565b611d7490611d6f61396d565b611db6565b565b60001b90565b90611d8960001991611d76565b9181191691161790565b90565b90611dab611da6611db2926111fc565b611d93565b8254611d7c565b9055565b611dc1816003611d96565b611deb7fdb58c3448fa6dc4b2401b39b9ef3a0c9de44312a88055379c5f3bfe435781cc0916111fc565b90611df46102e3565b80611dfe816109b5565b0390a2565b611e0c90611d63565b565b611e2e611e3391611e1d611662565b506000611e28613a2a565b016112f5565b61124a565b90565b90611e4891611e4361396d565b611e8f565b565b90611e5660ff91611d76565b9181191691161790565b611e69906104c5565b90565b90565b90611e84611e7f611e8b92611e60565b611e6c565b8254611e4a565b9055565b611ea482611e9f60088490610e61565b611e6f565b611ee3611ed17fc17077e55d3a8256fc9c13b798e2591ea1c9abc264b62c296034beba67b6d70092610e55565b92611eda6102e3565b918291826104d7565b0390a2565b90611ef291611e36565b565b600090565b600090565b90565b611f0d611f1291611230565b611efe565b90565b611f1f9054611f01565b90565b611f36611f31611f3b92611829565b611d76565b610c5e565b90565b60007f4549503731323a20556e696e697469616c697a65640000000000000000000000910152565b611f736015602092610307565b611f7c81611f3e565b0190565b611f969060208101906000818303910152611f66565b90565b15611fa057565b611fa86102e3565b62461bcd60e51b815280611fbe60048201611f80565b0390fd5b611fcb90610873565b90565b67ffffffffffffffff8111611fe65760208091020190565b6115d6565b90611ffd611ff883611fce565b611b53565b918252565b369037565b9061202c61201483611feb565b926020806120228693611fce565b9201910390612002565b565b600f60f81b90565b61203e611ef4565b506120476114e1565b506120506114e1565b50612059611662565b50612062611c45565b5061206b611ef9565b50612074611a0f565b506120ad612080613a4e565b61208c60008201611f15565b61209f6120996000611f22565b91610c5e565b1490816120fa575b50611f99565b6120b5613a72565b906120be613a91565b9046906120ca30611fc2565b906120d56000611f22565b906120e86120e3600061182c565b612007565b906120f161202e565b96959493929190565b6121079150600101611f15565b61211a6121146000611f22565b91610c5e565b14386120a7565b6121329061212d61396d565b612134565b565b61213f816005611d96565b6121697f47f1aa8f654e61a37d9cf2f8122235dcfeccbb3c45f09b2036e6ddba8ac0e0ab916111fc565b906121726102e3565b8061217c816109b5565b0390a2565b61218a90612121565b565b612194611c45565b506121a860006121a2613ab0565b01611c81565b90565b6121b3611662565b506121bc6135ae565b6121c461222d565b826121d76121d183611a56565b916103be565b10156122085750612205916121fa6121f460026122009401611aae565b9161363e565b90613737565b611ab1565b90565b826122246000928392637669fc0f60e11b845260048401611a72565b0390fd5b600090565b612235612228565b5061223e613867565b90565b6122496114e1565b5061225d60046122576132c1565b01611637565b90565b61229061228b61228661229593612275611662565b5060016122806135ae565b01611a96565b611aae565b613ad4565b611ab1565b90565b1561229f57565b600063221b60b760e21b8152806122b8600482016109b5565b0390fd5b906122c6906103be565b9052565b6122d46060611b53565b90565b9061232861231f60026122e86122ca565b946123016122f86000830161124a565b600088016122bc565b6123196123106001830161124a565b602088016122bc565b0161124a565b604084016122bc565b565b612333906122d7565b90565b61234090516103be565b90565b1561234a57565b6000630861c86560e01b815280612363600482016109b5565b0390fd5b61237361237891611230565b610e79565b90565b6123859054612367565b90565b1561238f57565b6000635b6aa88560e01b8152806123a8600482016109b5565b0390fd5b156123b357565b6000637664524d60e11b8152806123cc600482016109b5565b0390fd5b156123d757565b600063828aa81160e01b8152806123f0600482016109b5565b0390fd5b612403612409919392936103be565b926103be565b820391821161241457565b611686565b1b90565b9190600861243991029161243360001984612419565b92612419565b9181191691161790565b9190612459612454612461936111fc565b611d93565b90835461241d565b9055565b61247791612471611662565b91612443565b565b600060026124a09261248d83808301612465565b61249a8360018301612465565b01612465565b565b634e487b7160e01b600052600060045260246000fd5b906000036124cb576124c990612479565b565b6124a2565b9160206124f29294936124eb60408201966000830190610404565b0190610404565b565b9291926124ff611662565b5061252661252161251a61251560068590611a14565b611a2c565b8490613b6a565b612298565b61257861253d61253860078590611218565b61232a565b9461256661254d60008801612336565b61256061255a600061182c565b916103be565b11612343565b61257260008701612336565b906133ce565b9361258d61258860088490610e61565b61237b565b6000146127905761263461264d916125b7336125b16125ab87610467565b91610467565b146123ac565b6125c360408201612336565b6125de6125d86125d3600361124a565b6103be565b916103be565b1160001461277c576126216125f3600361124a565b5b61261b612615612610429361260b60208801612336565b61169c565b6103be565b916103be565b116123d0565b61262e6000859201612336565b90613bb9565b612646612640876103be565b916103be565b1015612388565b5b61265784611944565b9161266382849061341d565b61268e85612688600061267860078690611218565b01916126838361124a565b6123f4565b90611d96565b6126b6856126b06126a1600486906112f5565b916126ab8361124a565b6123f4565b90611d96565b6126cd60006126c760078490611218565b0161124a565b6126e06126da600061182c565b916103be565b14612742575b506126fc6126f46000611880565b828691613504565b83916127287f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e92610e55565b9261273d6127346102e3565b928392836124d0565b0390a2565b6127759061275c600061275760078490611218565b6124b8565b61277061276b60068590611a14565b611a2c565b613c7d565b50386126e6565b61262161278b60408301612336565b6125f4565b506127be6127a56127a083611ce3565b6116c1565b6127b76127b1876103be565b916103be565b1015612388565b61264e565b906127e9916127e46127df6127da60083390610e61565b61237b565b6123ac565b6127ec565b90565b9061281b9160206128056128006001611748565b61087f565b6370bb45b3906128136102e3565b958692611755565b82528160008161282d600482016109b5565b03925af1928315612876576128479361284a575b506128ec565b90565b61286a9060203d811161286f575b61286281836115ec565b81019061176a565b612841565b503d612858565b611789565b1561288257565b6000631f2a200560e01b81528061289b600482016109b5565b0390fd5b156128a657565b6000630419bcb760e51b8152806128bf600482016109b5565b0390fd5b6128cc906103be565b60001981146128db5760010190565b611686565b6128e990610873565b90565b9190915061290d82612907612901600061182c565b916103be565b1161287b565b339161292361291e60068590611a14565b611a2c565b9261292d84613ca8565b61294061293a600061182c565b916103be565b14612a68575b61296e82612968612959600485906112f5565b916129638361124a565b61169c565b90611d96565b6129818161297b8461307e565b90613cc8565b6129fa61298e600261124a565b6129a161299a826128c3565b6002611d96565b946129ba8460006129b460078a90611218565b01611d96565b6129d24260016129cc60078a90611218565b01611d96565b6129f36129df600361124a565b60026129ed60078a90611218565b01611d96565b8590613d2a565b50612a1a612a086000611880565b82612a12306128e0565b908592613dd9565b612a24600361124a565b612a4e7f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9092610e55565b92612a63612a5a6102e3565b928392836124d0565b0390a2565b612a8e82612a87612a81612a7c600561124a565b6103be565b916103be565b101561289f565b612946565b612aa490612a9f611662565b6127c3565b90565b60401c90565b612ab9612abe91612aa7565b610e79565b90565b612acb9054612aad565b90565b67ffffffffffffffff1690565b612ae7612aec91611230565b612ace565b90565b612af99054612adb565b90565b67ffffffffffffffff1690565b612b1d612b18612b2292611829565b610854565b612afc565b90565b612b39612b34612b3e92611667565b610854565b612afc565b90565b612b4a90610873565b90565b90612b6067ffffffffffffffff91611d76565b9181191691161790565b612b7e612b79612b8392612afc565b610854565b612afc565b90565b90565b90612b9e612b99612ba592612b6a565b612b86565b8254612b4d565b9055565b60401b90565b90612bbe60ff60401b91612ba9565b9181191691161790565b90612bdd612bd8612be492611e60565b611e6c565b8254612baf565b9055565b612bf190612b25565b9052565b9190612c0990600060208501940190612be8565b565b91939092612c17613e35565b94612c2d612c2760008801612ac1565b156104c5565b94612c3a60008801612aef565b80612c4e612c486000612b09565b91612afc565b1480612d6d575b90612c69612c636001612b25565b91612afc565b1480612d44575b612c7b9091156104c5565b9081612d33575b50612d1657612cac94612ca1612c986001612b25565b60008a01612b89565b86612d03575b612eb5565b612cb4575b50565b612cc2906000809101612bc8565b6001612cfa7fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d291612cf16102e3565b91829182612bf5565b0390a138612cb1565b612d11600160008a01612bc8565b612ca7565b600063f92ee8a960e01b815280612d2f600482016109b5565b0390fd5b612d3e9150156104c5565b38612c82565b50612c7b612d5130612b41565b3b612d65612d5f600061182c565b916103be565b149050612c70565b5086612c55565b60007f5374616b65642053485500000000000000000000000000000000000000000000910152565b612da6600a611b8b565b90612db360208301612d74565b565b612dbd612d9c565b90565b60007f7353485500000000000000000000000000000000000000000000000000000000910152565b612df26004611b8b565b90612dff60208301612dc0565b565b612e09612de8565b90565b612e1590610857565b90565b612e2190612e0c565b90565b90612e3560018060a01b0391611d76565b9181191691161790565b612e4890612e0c565b90565b90565b90612e63612e5e612e6a92612e3f565b612e4b565b8254612e24565b9055565b612e7790610857565b90565b612e8390612e6e565b90565b612e8f90612e6e565b90565b90565b90612eaa612ea5612eb192612e86565b612e92565b8254612e24565b9055565b612efe612f0c93612ef9612ef2612f13989795612eed612f0596612ee8612eda612db5565b612ee2612e01565b90613e79565b6139bc565b612e18565b6000612e4e565b612e7a565b6001612e95565b6003611d96565b6005611d96565b612f27612f20600161166a565b6002611d96565b565b90612f3694939291612c0b565b565b612f4061170d565b50600063a24e573d60e01b815280612f5a600482016109b5565b0390fd5b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf90565b612fb8612fbf94612fae606094989795612fa4608086019a6000870190610c61565b602085019061095d565b6040830190610404565b0190610404565b565b60200190565b5190565b9395949092919542612fe5612fdf896103be565b916103be565b1161305e5791613050916130579361304761305c989961302f613006612f5e565b6130208b938b6130146102e3565b95869460208601612f82565b602082018103825203826115ec565b61304161303b82612fc7565b91612fc1565b20613e85565b92909192613ea2565b9182613eed565b61389f565b565b61307a876000918291632341d78760e11b835260048301610411565b0390fd5b6130c79061308a611662565b506130a6613096611990565b6130a0600161166a565b9061169c565b6130c16130b16132f1565b6130bb600161166a565b9061169c565b9161338d565b90565b6130e7906130d6611662565b506130e1600061182c565b90613bb9565b90565b6130fb906130f661396d565b613121565b565b1561310457565b6000639fabe1c160e01b81528061311d600482016109b5565b0390fd5b6131478161314061313a6131356000611d39565b610467565b91610467565b14156130fd565b61315a61315382612e7a565b6001612e95565b6131847f058fa9577dc29aece41d41c2d3bff2ed4e8d5085762198e8f7faab35039555da91610e55565b9061318d6102e3565b80613197816109b5565b0390a2565b6131a5906130ea565b565b906131b190610e55565b600052602052604060002090565b6131ed916131e36131e8926131d2611662565b5060016131dd6132c1565b016131a7565b6112f5565b61124a565b90565b6131fa6040611b53565b90565b600090565b600090565b61320f6131f0565b906020808361321c6131fd565b815201613227613202565b81525050565b613235613207565b90565b9061324b9161324561322d565b50613f31565b90565b61325f9061325a61396d565b613261565b565b8061327d6132776132726000611d39565b610467565b91610467565b1461328d5761328b906139bc565b565b6132b261329a6000611d39565b6000918291631e4fbdf760e01b83526004830161096a565b0390fd5b6132bf9061324e565b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0090565b6132ee90610873565b90565b6132f9611662565b50613343602061331161330c6000611880565b610af6565b6370a0823190613338613323306132e5565b9261332c6102e3565b95869485938493611755565b83526004830161096a565b03915afa9081156133885760009161335a575b5090565b61337b915060203d8111613381575b61337381836115ec565b81019061176a565b38613356565b503d613369565b611789565b613395611662565b50816000190481118202158302156133ac57020490565b600080fd5b6133b9611c45565b503390565b916133cc9291600192613f62565b565b6133d6611662565b50806133eb6133e5600061182c565b916103be565b146000146133f85750905b565b906134179061341061340a84926103be565b916103be565b1115612388565b906133f6565b908161343a61343461342f6000611d39565b610467565b91610467565b1461345757613455919061344e6000611d39565b9091614082565b565b61347c6134646000611d39565b6000918291634b637e8f60e11b83526004830161096a565b0390fd5b60007f5452414e534645525f4641494c45440000000000000000000000000000000000910152565b6134b5600f602092610307565b6134be81613480565b0190565b6134d890602081019060008183039101526134a8565b90565b156134e257565b6134ea6102e3565b62461bcd60e51b815280613500600482016134c2565b0390fd5b6044602092600080936135509661351961170d565b506040519363a9059cbb60e01b855260018060a01b0316600485015260248401525af13d15601f3d116001600051141617166134db565b565b9161355b611662565b508160001904831182021581021561357d578181600093850204930206110190565b600080fd5b90565b61359d60006135a292613596611a0f565b5001613582565b6141f5565b6135aa611a0f565b5090565b7fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d0090565b90565b6135e96135e46135ee926135d2565b610854565b610618565b90565b6135fa906135d5565b9052565b916020613620929493613619604082019660008301906135f1565b0190610404565b565b61363661363161363b926103be565b610854565b610dbd565b90565b613646612228565b508061366061365a65ffffffffffff611a56565b916103be565b116136715761366e90613622565b90565b603061368e60009283926306dfcc6560e41b8452600484016135fe565b0390fd5b600090565b5490565b90565b6136b26136ad6136b79261369b565b610854565b6103be565b90565b90565b65ffffffffffff1690565b6136d46136d991611230565b6136bd565b90565b6136e690546136c8565b90565b60301c90565b60018060d01b031690565b61370661370b916136e9565b6136ef565b90565b61371890546136fa565b90565b61372f61372a61373492611829565b610854565b61141f565b90565b9061378e90613744613692565b5061375160008401613697565b61375b600061182c565b90808061377161376b600561369e565b916103be565b116137f3575b509061378960008601939192936136ba565b61444a565b806137a261379c600061182c565b916103be565b146000146137ba5750506137b6600061371b565b5b90565b6137e86000916137e36137dd846137ee9601926137d7600161166a565b906123f4565b916136ba565b61443e565b0161370e565b6137b7565b8061380161380792916142bd565b906123f4565b908361383a61383461382f6000613829818c0161382489916136ba565b61443e565b016136dc565b610dbd565b91610dbd565b1060001461384c5750905b9038613777565b91506138629061385c600161166a565b9061169c565b613845565b61386f612228565b506138794361363e565b90565b90565b9061389461388f61389b92610e55565b61387c565b8254612e24565b9055565b906139339161392d6138af6135ae565b6138d06138bb84611c8e565b916138cb60008792018690611c4a565b61387f565b8281859061391061390a6139047f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f95610e55565b92610e55565b92610e55565b926139196102e3565b80613923816109b5565b0390a492916144db565b916144f3565b565b61396561396061395b61396a9361394a611cc9565b5060016139556135ae565b01611a96565b611aae565b6146b2565b614752565b90565b61397561218c565b61398e6139886139836133b1565b610467565b91610467565b0361399557565b6139b86139a06133b1565b600091829163118cdaa760e01b83526004830161096a565b0390fd5b6139c4613ab0565b6139de6139d360008301611c81565b91600084910161387f565b90613a12613a0c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610e55565b91610e55565b91613a1b6102e3565b80613a25816109b5565b0390a3565b7f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb0090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b613a7a6114e1565b50613a8e6002613a88613a4e565b01611637565b90565b613a996114e1565b50613aad6003613aa7613a4e565b01611637565b90565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b613adc613692565b50613ae960008201613697565b80613afd613af7600061182c565b916103be565b14600014613b15575050613b11600061371b565b5b90565b613b43600091613b3e613b3884613b49960192613b32600161166a565b906123f4565b916136ba565b61443e565b0161370e565b613b12565b613b62613b5d613b67926103be565b611d76565b610c5e565b90565b90613b8d613b876000613b9294613b7f61170d565b500192613b4e565b91613582565b6147c8565b90565b15613b9c57565b60006360956a6560e01b815280613bb5600482016109b5565b0390fd5b90613c0d90613bc6611662565b50613c08613c03613bfb613bd986611ce3565b613bf681613bf0613bea600061182c565b916103be565b11613b95565b6116c1565b9460046112f5565b61124a565b6123f4565b80613c29613c23613c1e600561124a565b6103be565b916103be565b1015600014613c6d575b80613c46613c40846103be565b916103be565b1015600014613c5f575050613c5b600061182c565b5b90565b613c68916123f4565b613c5c565b50613c78600561124a565b613c33565b90613ca0613c9a6000613ca594613c9261170d565b500192613b4e565b91613582565b614925565b90565b613cc06000613cc592613cb9611662565b5001613582565b614a2f565b90565b80613ce4613cde613cd96000611d39565b610467565b91610467565b14613d0157613cff91613cf76000611d39565b919091614082565b565b613d26613d0e6000611d39565b600091829163ec442f0560e01b83526004830161096a565b0390fd5b90613d4d613d476000613d5294613d3f61170d565b500192613b4e565b91613582565b614a77565b90565b60007f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000910152565b613d8a6014602092610307565b613d9381613d55565b0190565b613dad9060208101906000818303910152613d7d565b90565b15613db757565b613dbf6102e3565b62461bcd60e51b815280613dd560048201613d97565b0390fd5b60009182606492613e3396602096613def61170d565b50604051946323b872dd60e01b865260018060a01b0316600486015260018060a01b0316602485015260448401525af13d15601f3d11600160005114161716613db0565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0090565b90613e6b91613e66614ade565b613e6d565b565b90613e7791614cd0565b565b90613e8391613e59565b565b613e9f90613e91611ef9565b50613e9a614cdc565b614cf0565b90565b92613ebd92613ec694613eb3611c45565b5092909192614da8565b90929192614ee9565b90565b916020613eeb929493613ee46040820196600083019061095d565b0190610404565b565b613ef681614fd0565b91613f09613f03846103be565b916103be565b03613f12575050565b613f2d60009283926301d4b62360e61b845260048401613ec9565b0390fd5b90613f5a613f55613f5f93613f4461322d565b506001613f4f6135ae565b01611a96565b611aae565b6150a1565b90565b9092613f6c6132c1565b82613f88613f82613f7d6000611d39565b610467565b91610467565b146140595784613fa9613fa3613f9e6000611d39565b610467565b91610467565b1461403057613fd090613fcb613fc4600187930186906131a7565b87906112f5565b611d96565b613fda575b505050565b91909161402561401361400d7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593610e55565b93610e55565b9361401c6102e3565b91829182610411565b0390a3388080613fd5565b61405561403d6000611d39565b6000918291634a1406b160e11b83526004830161096a565b0390fd5b61407e6140666000611d39565b600091829163e602df0560e01b83526004830161096a565b0390fd5b929161409084838391615104565b836140ac6140a66140a16000611d39565b610467565b91610467565b146140c1575b6140bf92939190916152ad565b565b6140c9611990565b936140d2615292565b94806140e66140e0886103be565b916103be565b116140f3575093506140b2565b85906141106000928392630e58ae9360e11b8452600484016124d0565b0390fd5b606090565b5490565b60209181520190565b600052602060002090565b61413a90610c5e565b9052565b9061414b81602093614131565b0190565b6141599054611f01565b90565b60010190565b9061417f61417961417284614119565b809361411d565b92614126565b9060005b8181106141905750505090565b9091926141b06141aa6001926141a58761414f565b61413e565b9461415c565b9101919091614183565b906141c491614162565b90565b906141e76141e0926141d76102e3565b938480926141ba565b03836115ec565b565b6141f2906141c7565b90565b600061420a91614203614114565b50016141e9565b90565b61422161421c61422692611667565b610854565b610618565b90565b6142489061424261423c61424d94610618565b916103be565b9061076b565b6103be565b90565b61426f90614269614263614274946103be565b916103be565b90612419565b6103be565b90565b634e487b7160e01b600052601260045260246000fd5b61429961429f916103be565b916103be565b9081156142aa570490565b614277565b906142ba91016103be565b90565b6142c5611662565b50806142da6142d4600061182c565b916103be565b1461443057806144276144206144106144006143f06143e06143d06143c06143b06143a061439061442d9c61438a614383614373614363614353614343600161433e6143386143288a6154f8565b614332600161420d565b90614229565b9161166a565b614250565b61434d818861428d565b906142af565b61435d600161420d565b90614229565b61436d818661428d565b906142af565b61437d600161420d565b90614229565b809261428d565b906142af565b61439a600161420d565b90614229565b6143aa818c61428d565b906142af565b6143ba600161420d565b90614229565b6143ca818a61428d565b906142af565b6143da600161420d565b90614229565b6143ea818861428d565b906142af565b6143fa600161420d565b90614229565b61440a818661428d565b906142af565b61441a600161420d565b90614229565b809261428d565b906157d1565b90565b5061443b600061182c565b90565b60005260206000200190565b93919092614456611662565b505b8161446b614465836103be565b916103be565b10156144d35761447c828290615824565b90614493600061448d88859061443e565b016136dc565b6144a561449f87610dbd565b91610dbd565b116000146144b65750915b91614458565b9291506144cd906144c7600161166a565b9061169c565b906144b0565b925050915090565b6144ed906144e7611662565b50611ce3565b90565b90565b90916144fd6135ae565b918061451161450b86610467565b91610467565b141580614697575b614524575b50505050565b8061454061453a6145356000611d39565b610467565b91610467565b03614605575b508261456361455d6145586000611d39565b610467565b91610467565b0361456f575b8061451e565b6145ab6145b89161458760016145b295018690611a96565b906145a561459f6145996001936158fd565b93611aae565b916144f0565b90615951565b9290611ab1565b91611ab1565b9190916145e57fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72492610e55565b926145fa6145f16102e3565b928392836124d0565b0390a2388080614569565b61464661464c61463f61461c600187018590611a96565b600261463961463361462d896158fd565b93611aae565b916144f0565b90615951565b9290611ab1565b91611ab1565b9190916146797fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72492610e55565b9261468e6146856102e3565b928392836124d0565b0390a238614546565b50816146ac6146a6600061182c565b916103be565b11614519565b60006146c7916146c0611662565b5001613697565b90565b6146de6146d96146e3926109ee565b610854565b6103be565b90565b90565b6146fd6146f8614702926146e6565b610854565b610618565b90565b61470e906146e9565b9052565b91602061473492949361472d60408201966000830190614705565b0190610404565b565b61474a61474561474f926103be565b610854565b6109ee565b90565b61475a611cc9565b508061477261476c63ffffffff6146ca565b916103be565b116147835761478090614736565b90565b60206147a060009283926306dfcc6560e41b845260048401614712565b0390fd5b6147ad90610c5e565b90565b906147ba906147a4565b600052602052604060002090565b6147e69160016147e1926147da61170d565b50016147b0565b61124a565b6147f96147f3600061182c565b916103be565b141590565b634e487b7160e01b600052603260045260246000fd5b61481d81614119565b8210156148385761482f600191614126565b91020190600090565b6147fe565b61484d906008614852930261076b565b611efe565b90565b90614860915461483d565b90565b61486c90611230565b90565b919061488561488061488d936147a4565b614863565b90835461241d565b9055565b90565b634e487b7160e01b600052603160045260246000fd5b5490565b600052602060002090565b6148c2816148aa565b8210156148dd576148d46001916148ae565b91020190600090565b6147fe565b6148f4916148ee611ef9565b9161486f565b565b6148ff816148aa565b801561492057600190039061491d61491783836148b9565b906148e2565b55565b614894565b61492d61170d565b5061494461493f6001830184906147b0565b61124a565b9081614959614953600061182c565b916103be565b1415600014614a27576149d99260016149d4928461498260009661497c8561166a565b906123f4565b61499f614990888501614119565b6149998661166a565b906123f4565b816149b26149ac836103be565b916103be565b036149de575b5050506149ce6149c9868301614891565b6148f6565b016147b0565b612465565b600190565b614a1f92614a116149fd6149f7614a1a948c8901614814565b90614855565b93614a0b85918c8901614814565b9061486f565b918585016147b0565b611d96565b3880806149b8565b505050600090565b6000614a4491614a3d611662565b5001614119565b90565b90815491600160401b831015614a725782614a6a916001614a70950181556148b9565b9061486f565b565b6115d6565b614a7f61170d565b50614a94614a8e8284906147c8565b156104c5565b600014614ad757614acd614ad292614ab8614ab160008501614891565b8290614a47565b6001614ac660008501614119565b93016147b0565b611d96565b600190565b5050600090565b614aef614ae96159d1565b156104c5565b614af557565b6000631afcd79f60e31b815280614b0e600482016109b5565b0390fd5b90614b2491614b1f614ade565b614cac565b565b601f602091010490565b5b818110614b3c575050565b80614b4a6000600193612465565b01614b31565b9190601f8111614b60575b505050565b614b6c614b919361152f565b906020614b7884614b26565b83019310614b99575b614b8a90614b26565b0190614b30565b388080614b5b565b9150614b8a81929050614b81565b90614bb8906000199060080261076b565b191690565b81614bc791614ba7565b906002021790565b90614bd981610303565b9067ffffffffffffffff8211614c9b57614bfd82614bf785546114fc565b85614b50565b602090601f8311600114614c3257918091614c2193600092614c26575b5050614bbd565b90555b565b90915001513880614c1a565b601f19831691614c418561152f565b9260005b818110614c8357509160029391856001969410614c69575b50505002019055614c24565b614c79910151601f841690614ba7565b9055388080614c5d565b91936020600181928787015181550195019201614c45565b6115d6565b90614caa91614bcf565b565b6004614cce92614cc7614cbd6132c1565b9360038501614ca0565b9101614ca0565b565b90614cda91614b12565b565b614ce4611ef9565b50614ced615a62565b90565b604291614cfb611ef9565b50604051917f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201522090565b600090565b614d42614d4791611230565b6111fc565b90565b90565b614d61614d5c614d6692614d4a565b610854565b6103be565b90565b614d9f614da694614d95606094989795614d8b608086019a6000870190610c61565b602085019061061e565b6040830190610c61565b0190610c61565b565b939293614db3611c45565b50614dbc614d31565b50614dc5611ef9565b50614dcf85614d36565b614df7614df16fa2a8918ca85bafe22016d0b997e4df60600160ff1b03614d4d565b916103be565b11614e8b5790614e1b60209495600094939293614e126102e3565b94859485614d69565b838052039060015afa15614e8657614e34600051611d76565b80614e50614e4a614e456000611d39565b610467565b91610467565b14614e6857600091614e626000611f22565b91929190565b50614e736000611d39565b600191614e806000611f22565b91929190565b611789565b505050614e986000611d39565b9060039291929190565b634e487b7160e01b600052602160045260246000fd5b60041115614ec257565b614ea2565b90614ed182614eb8565b565b9190614ee790600060208501940190610c61565b565b80614efd614ef76000614ec7565b91614ec7565b14600014614f09575050565b80614f1d614f176001614ec7565b91614ec7565b14600014614f4257600063f645eedf60e01b815280614f3e600482016109b5565b0390fd5b80614f56614f506002614ec7565b91614ec7565b14600014614f8657614f82614f6a83614d36565b600091829163fce698f760e01b835260048301610411565b0390fd5b614f99614f936003614ec7565b91614ec7565b14614fa15750565b614fbd9060009182916335e2f38360e21b835260048301614ed3565b0390fd5b6001614fcd91016103be565b90565b614fed90614fdc611662565b506000614fe7613a2a565b016112f5565b615009614ff98261124a565b9161500383614fc1565b90611d96565b90565b600052602060002090565b61502081613697565b82101561503b5761503260019161500c565b91020190600090565b6147fe565b9061504a90610dbd565b9052565b906150589061141f565b9052565b9061509361508a600061506d6131f0565b9461508461507c8383016136dc565b838801615040565b0161370e565b6020840161504e565b565b61509e9061505c565b90565b6150c09160006150ba926150b361322d565b5001615017565b50615095565b90565b6040906150ed6150f494969593966150e36060840198600085019061095d565b6020830190610404565b0190610404565b565b9061510191036103be565b90565b91909161510f6132c1565b8161512b6151256151206000611d39565b610467565b91610467565b1460001461521a576151538361514d60028401916151488361124a565b61169c565b90611d96565b5b8361517061516a6151656000611d39565b610467565b91610467565b146000146151ea576151999061519360028592019161518e8361124a565b6150f6565b90611d96565b5b9190916151e56151d36151cd7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93610e55565b93610e55565b936151dc6102e3565b91829182610411565b0390a3565b6152159061520f615200600086930187906112f5565b9161520a8361124a565b6142af565b90611d96565b61519a565b61523061522b6000830184906112f5565b61124a565b8061524361523d866103be565b916103be565b1061526e576152566152699185906150f6565b6152646000840185906112f5565b611d96565b615154565b9161528e91509192600093849363391434e360e21b8552600485016150c3565b0390fd5b61529a611662565b506152aa60018060d01b03611ab1565b90565b9161531061530a615317946152c06135ae565b816152dc6152d66152d16000611d39565b610467565b91610467565b14615349575b856152fe6152f86152f36000611d39565b610467565b91610467565b14615319575b50611c8e565b92611c8e565b90916144f3565b565b60026153439101600261533d615337615331896158fd565b93611aae565b916144f0565b90615951565b50615304565b61537360028201600161536d6153676153618a6158fd565b93611aae565b916144f0565b90615951565b50506152e2565b90565b61539161538c6153969261537a565b610854565b610618565b90565b6153ad6153a86153b29261537a565b610854565b6103be565b90565b90565b6153cc6153c76153d1926153b5565b610854565b610618565b90565b6153e86153e36153ed926153b5565b610854565b6103be565b90565b6154046153ff615409926146e6565b610854565b6103be565b90565b90565b61542361541e6154289261540c565b610854565b610618565b90565b61543f61543a6154449261540c565b610854565b6103be565b90565b90565b61545e61545961546392615447565b610854565b610618565b90565b61547a61547561547f92615447565b610854565b6103be565b90565b90565b61549961549461549e92615482565b610854565b610618565b90565b6154b56154b06154ba92615482565b610854565b6103be565b90565b90565b6154d46154cf6154d9926154bd565b610854565b610618565b90565b6154f06154eb6154f5926154bd565b610854565b6103be565b90565b615500611662565b5061565a61550e600061182c565b916155238161551d608061537d565b90614229565b615536615530600061182c565b916103be565b116157a3575b6155508161554a60406153b8565b90614229565b61556361555d600061182c565b916103be565b11615775575b61557d8161557760206146e9565b90614229565b61559061558a600061182c565b916103be565b11615747575b6155aa816155a4601061540f565b90614229565b6155bd6155b7600061182c565b916103be565b11615719575b6155d7816155d1600861544a565b90614229565b6155ea6155e4600061182c565b916103be565b116156eb575b615604816155fe6004615485565b90614229565b615617615611600061182c565b916103be565b116156bd575b6156318161562b60026154c0565b90614229565b61564461563e600061182c565b916103be565b1161568f575b615654600161420d565b90614229565b61566d615667600061182c565b916103be565b11615676575b90565b61568a90615684600161166a565b906142af565b615673565b6156a66156b7916156a060026154c0565b90614229565b926156b160026154dc565b906142af565b9161564a565b6156d46156e5916156ce6004615485565b90614229565b926156df60046154a1565b906142af565b9161561d565b615702615713916156fc600861544a565b90614229565b9261570d6008615466565b906142af565b916155f0565b6157306157419161572a601061540f565b90614229565b9261573b601061542b565b906142af565b916155c3565b61575e61576f9161575860206146e9565b90614229565b9261576960206153f0565b906142af565b91615596565b61578c61579d9161578660406153b8565b90614229565b9261579760406153d4565b906142af565b91615569565b6157ba6157cb916157b4608061537d565b90614229565b926157c56080615399565b906142af565b9161553c565b906157da611662565b50816157ee6157e8836103be565b916103be565b106000146157fb57505b90565b90506157f8565b61580e615814916103be565b916103be565b90811561581f570490565b614277565b61584961584f92615833611662565b50828116921861584360026154dc565b90615802565b9061169c565b90565b61585e6158649161141f565b9161141f565b90039060018060d01b03821161587657565b611686565b9061588e91615888613692565b50615852565b90565b90565b6158a86158a36158ad92615891565b610854565b610618565b90565b6158b990615894565b9052565b9160206158df9294936158d8604082019660008301906158b0565b0190610404565b565b6158f56158f06158fa926103be565b610854565b61141f565b90565b615905613692565b508061591f61591960018060d01b03611ab1565b916103be565b116159305761592d906158e1565b90565b60d061594d60009283926306dfcc6560e41b8452600484016158bd565b0390fd5b9061598761598d9392615962613692565b5061596b613692565b50809361598061597961222d565b9492613ad4565b9091615f95565b91615ace565b91909190565b61599f6159a59161141f565b9161141f565b019060018060d01b0382116159b657565b611686565b906159ce916159c8613692565b50615993565b90565b6159d961170d565b506159ed60006159e7613e35565b01612ac1565b90565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90565b90959492615a6094615a4f615a5992615a45608096615a3b60a088019c6000890190610c61565b6020870190610c61565b6040850190610c61565b6060830190610404565b019061095d565b565b615a6a611ef9565b50615a736159f0565b615ab8615a7e615b01565b91615aa9615a8a615bb8565b46615a9430611fc2565b91615a9d6102e3565b96879560208701615a14565b602082018103825203826115ec565b615aca615ac482612fc7565b91612fc1565b2090565b91615af36000615af894615ae0613692565b50615ae9613692565b50019291926136ba565b615e0e565b91909190565b90565b615b09611ef9565b50615b12613a4e565b615b1a613a72565b615b2b615b2682615afe565b612fc7565b615b3e615b38600061182c565b916103be565b11600014615b6657615b509150615afe565b615b62615b5c82612fc7565b91612fc1565b2090565b506000615b739101611f15565b80615b87615b816000611f22565b91610c5e565b1415600014615b935790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615bc0611ef9565b50615bc9613a4e565b615bd1613a91565b615be2615bdd82615afe565b612fc7565b615bf5615bef600061182c565b916103be565b11600014615c1d57615c079150615afe565b615c19615c1382612fc7565b91612fc1565b2090565b506001615c2a9101611f15565b80615c3e615c386000611f22565b91610c5e565b1415600014615c4a5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b5490565b615c7d6040611b53565b90565b600052602060002090565b615c9481615c6f565b821015615caf57615ca6600191615c80565b91020190600090565b6147fe565b615cbe9051610dbd565b90565b90615cd265ffffffffffff91611d76565b9181191691161790565b615cf0615ceb615cf592610dbd565b610854565b610dbd565b90565b90565b90615d10615d0b615d1792615cdc565b615cf8565b8254615cc1565b9055565b615d25905161141f565b90565b60301b90565b90615d4065ffffffffffff1991615d28565b9181191691161790565b615d5e615d59615d639261141f565b610854565b61141f565b90565b90565b90615d7e615d79615d8592615d4a565b615d66565b8254615d2e565b9055565b90615db460206000615dba94615dac828201615da6848801615cb4565b90615cfb565b019201615d1b565b90615d69565b565b9190615dcd57615dcb91615d89565b565b6124a2565b90815491600160401b831015615dfd5782615df5916001615dfb95018155615c8b565b90615dbc565b565b6115d6565b615e0b9061505c565b90565b90929192615e1a613692565b50615e23613692565b50615e2d82615c6f565b80615e41615e3b600061182c565b916103be565b11600014615f4557615e6f615e6a84615e6484615e5e600161166a565b906123f4565b9061443e565b615e02565b90615e7c60008301615cb4565b615e8e615e8885610dbd565b91610dbd565b11615f2857615ef393602093615ea660008501615cb4565b615eb8615eb283610dbd565b91610dbd565b14600014615ef757506000615ee6615eec93615ee08a9491615eda600161166a565b906123f4565b9061443e565b01615d69565b5b01615d1b565b9190565b90615f239250615f1e88615f16615f0c615c73565b9460008601615040565b86840161504e565b615dd2565b615eed565b6000632520601d60e01b815280615f41600482016109b5565b0390fd5b50615f7191615f6c85615f63615f59615c73565b9460008601615040565b6020840161504e565b615dd2565b615f7b600061371b565b9190565b634e487b7160e01b600052605160045260246000fd5b91909180600214615fb457600103615f7f57615fb0916159bb565b905b565b50615fbe9161587b565b90615fb256fea2646970667358221220f01e5e9106b47ae0350fc6bd9506e2cd4d0698f90cd7841fa2c23e79673f886d64736f6c634300081a0033", + "nonce": "0x15", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x10c9e15442394db4ca349c2be1bbf0be64a0be5debf5afd8a21c9d0292bee934", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", + "function": null, + "arguments": null, + "transaction": { + "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", + "gas": "0x156f29", + "value": "0x0", + "input": "0x60a060405261001561000f6101d3565b91610261565b61001d610033565b6107526107e082396080518160cd015261075290f35b60405190565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061006390610039565b810190811060018060401b0382111761007b57604052565b610043565b9061009361008c610033565b9283610059565b565b600080fd5b600080fd5b60018060a01b031690565b6100b39061009f565b90565b6100bf816100aa565b036100c657565b600080fd5b905051906100d8826100b6565b565b600080fd5b600080fd5b60018060401b038111610100576100fc602091610039565b0190565b610043565b60005b838110610119575050906000910152565b806020918301518185015201610108565b9092919261013f61013a826100e4565b610080565b9381855260208501908284011161015b5761015992610105565b565b6100df565b9080601f8301121561017e5781602061017b9351910161012a565b90565b6100da565b916060838303126101ce5761019b82600085016100cb565b926101a983602083016100cb565b92604082015160018060401b0381116101c9576101c69201610160565b90565b61009a565b610095565b6101f1611a8b803803806101e681610080565b928339810190610183565b909192565b6101ff906100aa565b9052565b9190610217906000602085019401906101f6565b565b610221610033565b3d6000823e3d90fd5b90565b61024161023c6102469261009f565b61022a565b61009f565b90565b6102529061022d565b90565b61025e90610249565b90565b9161026c91926102d1565b610274610033565b90610b59820182811060018060401b038211176102cc57829161029e91610b59610f328539610203565b03906000f080156102c7576102b290610255565b6080526102c56102c06102ef565b610329565b565b610219565b610043565b906102db916103ae565b565b600090565b6102ec90516100aa565b90565b6102f76102dd565b5061030260806102e2565b90565b916020610327929493610320604082019660008301906101f6565b01906101f6565b565b610374906103356104bf565b817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9161036c610363610033565b92839283610305565b0390a161054c565b565b61037f90610249565b90565b60000190565b5190565b90565b90565b6103a66103a16103ab9261038f565b61022a565b61038c565b90565b906103b8826105ff565b816103e37fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91610376565b906103ec610033565b806103f681610382565b0390a261040281610388565b61041561040f6000610392565b9161038c565b1160001461042a57610426916106d6565b505b565b5050610434610657565b610428565b90565b90565b60001b90565b61045961045461045e92610439565b61043f565b61043c565b90565b61048a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103610445565b90565b60001c90565b60018060a01b031690565b6104aa6104af9161048d565b610493565b90565b6104bc905461049e565b90565b6104c76102dd565b506104e360006104dd6104d8610461565b610706565b016104b2565b90565b6104fa6104f56104ff9261038f565b61022a565b61009f565b90565b61050b906104e6565b90565b9061051f60018060a01b039161043f565b9181191691161790565b90565b9061054161053c61054892610376565b610529565b825461050e565b9055565b8061056861056261055d6000610502565b6100aa565b916100aa565b1461058b5761058990600061058361057e610461565b610706565b0161052c565b565b6105b06105986000610502565b6000918291633173bdd160e11b835260048301610203565b0390fd5b90565b6105cb6105c66105d0926105b4565b61043f565b61043c565b90565b6105fc7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105b7565b90565b803b61061461060e6000610392565b9161038c565b146106375761063590600061062f61062a6105d3565b610706565b0161052c565b565b610653906000918291634c9c8ce360e01b835260048301610203565b0390fd5b3461066b6106656000610392565b9161038c565b1161067257565b600063b398979f60e01b81528061068b60048201610382565b0390fd5b606090565b906106a66106a1836100e4565b610080565b918252565b3d6000146106c8576106bc3d610694565b903d6000602084013e5b565b6106d061068f565b906106c6565b600080610703936106e561068f565b508390602081019051915af4906106fa6106ab565b9091909161070e565b90565b90565b151590565b906107229061071b61068f565b5015610709565b60001461072f5750610796565b61073882610388565b61074b6107456000610392565b9161038c565b148061077a575b61075a575090565b610776906000918291639996b31560e01b835260048301610203565b0390fd5b50803b61079061078a6000610392565b9161038c565b14610752565b61079f81610388565b6107b26107ac6000610392565b9161038c565b116000146107c257805190602001fd5b6000630a12f52160e11b8152806107db60048201610382565b0390fdfe608060405261000c61000e565b005b610016610041565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b60000190565b3361005b6100556100506100c2565b610023565b91610023565b146000146100b85763ffffffff60e01b6000351661008861008263278f794360e11b61002f565b9161002f565b14156000146100ae5760006334ad5dbb60e21b8152806100aa6004820161003b565b0390fd5b6100b66102fd565b565b6100ef565b600090565b6100ca6100bd565b507f000000000000000000000000000000000000000000000000000000000000000090565b6100f761033d565b610351565b90565b90565b90565b61011961011461011e926100fc565b610102565b6100ff565b90565b60405190565b600080fd5b600080fd5b9093929384831161015157841161014c576001820201920390565b61012c565b610127565b91565b600080fd5b600080fd5b61016c90610018565b90565b61017881610163565b0361017f57565b600080fd5b905035906101918261016f565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906101c79061019d565b810190811067ffffffffffffffff8211176101e157604052565b6101a7565b906101f96101f2610121565b92836101bd565b565b67ffffffffffffffff81116102195761021560209161019d565b0190565b6101a7565b90826000939282370152565b9092919261023f61023a826101fb565b6101e6565b9381855260208501908284011161025b576102599261021e565b565b610198565b9080601f8301121561027e5781602061027b9335910161022a565b90565b610193565b9190916040818403126102c45761029d8360008301610184565b92602082013567ffffffffffffffff81116102bf576102bc9201610260565b90565b61015e565b610159565b6102dd6102d86102e292610018565b610102565b610018565b90565b6102ee906102c9565b90565b6102fa906102e5565b90565b61033b61033661032f6103276103216000366103196004610105565b908092610131565b90610156565b810190610283565b91906102f1565b6103a3565b565b6103456100bd565b5061034e6104b4565b90565b60008091368280378136915af43d6000803e60001461036f573d6000f35b3d6000fd5b61037d906102e5565b90565b5190565b90565b61039b6103966103a092610384565b610102565b6100ff565b90565b906103ad8261053c565b816103d87fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91610374565b906103e1610121565b806103eb8161003b565b0390a26103f781610380565b61040a6104046000610387565b916100ff565b1160001461041f5761041b91610613565b505b565b5050610429610594565b61041d565b90565b90565b60001b90565b61044e6104496104539261042e565b610434565b610431565b90565b61047f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61043a565b90565b60001c90565b60018060a01b031690565b61049f6104a491610482565b610488565b90565b6104b19054610493565b90565b6104bc6100bd565b506104d860006104d26104cd610456565b610643565b016104a7565b90565b6104e490610023565b9052565b91906104fc906000602085019401906104db565b565b9061050f60018060a01b0391610434565b9181191691161790565b90565b9061053161052c61053892610374565b610519565b82546104fe565b9055565b803b61055161054b6000610387565b916100ff565b146105745761057290600061056c610567610456565b610643565b0161051c565b565b610590906000918291634c9c8ce360e01b8352600483016104e8565b0390fd5b346105a86105a26000610387565b916100ff565b116105af57565b600063b398979f60e01b8152806105c86004820161003b565b0390fd5b606090565b906105e36105de836101fb565b6101e6565b918252565b3d600014610605576105f93d6105d1565b903d6000602084013e5b565b61060d6105cc565b90610603565b600080610640936106226105cc565b508390602081019051915af4906106376105e8565b9091909161064b565b90565b90565b151590565b9061065f906106586105cc565b5015610646565b60001461066c57506106d3565b61067582610380565b6106886106826000610387565b916100ff565b14806106b7575b610697575090565b6106b3906000918291639996b31560e01b8352600483016104e8565b0390fd5b50803b6106cd6106c76000610387565b916100ff565b1461068f565b6106dc81610380565b6106ef6106e96000610387565b916100ff565b116000146106ff57805190602001fd5b6000630a12f52160e11b8152806107186004820161003b565b0390fdfea264697066735822122043e4e8c50f891e734dc14682393fe8d624d67844a88f7d6eccae37e704ddd1f564736f6c634300081a003360806040523461002f576100196100146100fa565b61011b565b610021610034565b61087b6102de823961087b90f35b61003a565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906100699061003f565b810190811060018060401b0382111761008157604052565b610049565b90610099610092610034565b928361005f565b565b600080fd5b60018060a01b031690565b6100b4906100a0565b90565b6100c0816100ab565b036100c757565b600080fd5b905051906100d9826100b7565b565b906020828203126100f5576100f2916000016100cc565b90565b61009b565b610118610b598038038061010d81610086565b9283398101906100db565b90565b61012490610177565b565b90565b90565b61014061013b61014592610126565b610129565b6100a0565b90565b6101519061012c565b90565b61015d906100ab565b9052565b919061017590600060208501940190610154565b565b8061019361018d6101886000610148565b6100ab565b916100ab565b146101a3576101a19061027c565b565b6101c86101b06000610148565b6000918291631e4fbdf760e01b835260048301610161565b0390fd5b60001c90565b60018060a01b031690565b6101e96101ee916101cc565b6101d2565b90565b6101fb90546101dd565b90565b60001b90565b9061021560018060a01b03916101fe565b9181191691161790565b61023361022e610238926100a0565b610129565b6100a0565b90565b6102449061021f565b90565b6102509061023b565b90565b90565b9061026b61026661027292610247565b610253565b8254610204565b9055565b60000190565b61028660006101f1565b610291826000610256565b906102c56102bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610247565b91610247565b916102ce610034565b806102d881610276565b0390a356fe60806040526004361015610013575b61049f565b61001e60003561006d565b8063715018a6146100685780638da5cb5b146100635780639623609d1461005e578063ad3cb1cc146100595763f2fde38b0361000e5761046c565b610418565b6102d6565b610106565b610099565b60e01c90565b60405190565b600080fd5b600080fd5b600091031261008e57565b61007e565b60000190565b346100c7576100a9366004610083565b6100b16104f8565b6100b9610073565b806100c381610093565b0390f35b610079565b60018060a01b031690565b6100e0906100cc565b90565b6100ec906100d7565b9052565b9190610104906000602085019401906100e3565b565b3461013657610116366004610083565b610132610121610539565b610129610073565b918291826100f0565b0390f35b610079565b600080fd5b610149906100d7565b90565b61015581610140565b0361015c57565b600080fd5b9050359061016e8261014c565b565b610179816100d7565b0361018057565b600080fd5b9050359061019282610170565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906101c89061019e565b810190811067ffffffffffffffff8211176101e257604052565b6101a8565b906101fa6101f3610073565b92836101be565b565b67ffffffffffffffff811161021a5761021660209161019e565b0190565b6101a8565b90826000939282370152565b9092919261024061023b826101fc565b6101e7565b9381855260208501908284011161025c5761025a9261021f565b565b610199565b9080601f8301121561027f5781602061027c9335910161022b565b90565b610194565b916060838303126102d15761029c8260008501610161565b926102aa8360208301610185565b92604082013567ffffffffffffffff81116102cc576102c99201610261565b90565b61013b565b61007e565b6102ea6102e4366004610284565b916106b8565b6102f2610073565b806102fc81610093565b0390f35b67ffffffffffffffff811161031e5761031a60209161019e565b0190565b6101a8565b9061033561033083610300565b6101e7565b918252565b60007f352e302e30000000000000000000000000000000000000000000000000000000910152565b61036c6005610323565b906103796020830161033a565b565b610383610362565b90565b61038e61037b565b90565b610399610386565b90565b5190565b60209181520190565b60005b8381106103bd575050906000910152565b8060209183015181850152016103ac565b6103ed6103f66020936103fb936103e48161039c565b938480936103a0565b958691016103a9565b61019e565b0190565b61041591602082019160008184039101526103ce565b90565b3461044857610428366004610083565b610444610433610391565b61043b610073565b918291826103ff565b0390f35b610079565b906020828203126104675761046491600001610185565b90565b61007e565b3461049a5761048461047f36600461044d565b61072d565b61048c610073565b8061049681610093565b0390f35b610079565b600080fd5b6104ac610738565b6104b46104e4565b565b90565b90565b6104d06104cb6104d5926104b6565b6104b9565b6100cc565b90565b6104e1906104bc565b90565b6104f66104f160006104d8565b6107d7565b565b6105006104a4565b565b600090565b60001c90565b60018060a01b031690565b61052461052991610507565b61050d565b90565b6105369054610518565b90565b610541610502565b5061054c600061052c565b90565b90610562929161055d610738565b610629565b565b61057861057361057d926100cc565b6104b9565b6100cc565b90565b61058990610564565b90565b61059590610580565b90565b600080fd5b60e01b90565b60009103126105ae57565b61007e565b5190565b60209181520190565b6105df6105e86020936105ed936105d6816105b3565b938480936105b7565b958691016103a9565b61019e565b0190565b9161061592610608604082019360008301906100e3565b60208184039101526105c0565b90565b610620610073565b3d6000823e3d90fd5b6106329061058c565b91634f1ef28634939093929193813b156106b3576000936106649161066f610658610073565b9788968795869461059d565b8452600484016105f1565b03925af180156106ae57610681575b50565b6106a19060003d81116106a7575b61069981836101be565b8101906105a3565b3861067e565b503d61068f565b610618565b610598565b906106c3929161054f565b565b6106d6906106d1610738565b6106d8565b565b806106f46106ee6106e960006104d8565b6100d7565b916100d7565b1461070457610702906107d7565b565b61072961071160006104d8565b6000918291631e4fbdf760e01b8352600483016100f0565b0390fd5b610736906106c5565b565b610740610539565b61075961075361074e610838565b6100d7565b916100d7565b0361076057565b61078361076b610838565b600091829163118cdaa760e01b8352600483016100f0565b0390fd5b60001b90565b9061079e60018060a01b0391610787565b9181191691161790565b6107b190610580565b90565b90565b906107cc6107c76107d3926107a8565b6107b4565b825461078d565b9055565b6107e1600061052c565b6107ec8260006107b7565b9061082061081a7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936107a8565b916107a8565b91610829610073565b8061083381610093565b0390a3565b610840610502565b50339056fea2646970667358221220001626b7d7499f9f720fcbe3cf752c138e58fe5f28f481aaf6035735817dd7df64736f6c634300081a0033000000000000000000000000322b6543e76e22f2a165b4e78a7d3f7815295377000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c5364500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x16", + "chainId": "0xaa36a7" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x1d492fcabf9b1ad1631ce6cb9453083ac0c49cd7", + "initCode": "0x60806040523461002f576100196100146100fa565b61011b565b610021610034565b61087b6102de823961087b90f35b61003a565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906100699061003f565b810190811060018060401b0382111761008157604052565b610049565b90610099610092610034565b928361005f565b565b600080fd5b60018060a01b031690565b6100b4906100a0565b90565b6100c0816100ab565b036100c757565b600080fd5b905051906100d9826100b7565b565b906020828203126100f5576100f2916000016100cc565b90565b61009b565b610118610b598038038061010d81610086565b9283398101906100db565b90565b61012490610177565b565b90565b90565b61014061013b61014592610126565b610129565b6100a0565b90565b6101519061012c565b90565b61015d906100ab565b9052565b919061017590600060208501940190610154565b565b8061019361018d6101886000610148565b6100ab565b916100ab565b146101a3576101a19061027c565b565b6101c86101b06000610148565b6000918291631e4fbdf760e01b835260048301610161565b0390fd5b60001c90565b60018060a01b031690565b6101e96101ee916101cc565b6101d2565b90565b6101fb90546101dd565b90565b60001b90565b9061021560018060a01b03916101fe565b9181191691161790565b61023361022e610238926100a0565b610129565b6100a0565b90565b6102449061021f565b90565b6102509061023b565b90565b90565b9061026b61026661027292610247565b610253565b8254610204565b9055565b60000190565b61028660006101f1565b610291826000610256565b906102c56102bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610247565b91610247565b916102ce610034565b806102d881610276565b0390a356fe60806040526004361015610013575b61049f565b61001e60003561006d565b8063715018a6146100685780638da5cb5b146100635780639623609d1461005e578063ad3cb1cc146100595763f2fde38b0361000e5761046c565b610418565b6102d6565b610106565b610099565b60e01c90565b60405190565b600080fd5b600080fd5b600091031261008e57565b61007e565b60000190565b346100c7576100a9366004610083565b6100b16104f8565b6100b9610073565b806100c381610093565b0390f35b610079565b60018060a01b031690565b6100e0906100cc565b90565b6100ec906100d7565b9052565b9190610104906000602085019401906100e3565b565b3461013657610116366004610083565b610132610121610539565b610129610073565b918291826100f0565b0390f35b610079565b600080fd5b610149906100d7565b90565b61015581610140565b0361015c57565b600080fd5b9050359061016e8261014c565b565b610179816100d7565b0361018057565b600080fd5b9050359061019282610170565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906101c89061019e565b810190811067ffffffffffffffff8211176101e257604052565b6101a8565b906101fa6101f3610073565b92836101be565b565b67ffffffffffffffff811161021a5761021660209161019e565b0190565b6101a8565b90826000939282370152565b9092919261024061023b826101fc565b6101e7565b9381855260208501908284011161025c5761025a9261021f565b565b610199565b9080601f8301121561027f5781602061027c9335910161022b565b90565b610194565b916060838303126102d15761029c8260008501610161565b926102aa8360208301610185565b92604082013567ffffffffffffffff81116102cc576102c99201610261565b90565b61013b565b61007e565b6102ea6102e4366004610284565b916106b8565b6102f2610073565b806102fc81610093565b0390f35b67ffffffffffffffff811161031e5761031a60209161019e565b0190565b6101a8565b9061033561033083610300565b6101e7565b918252565b60007f352e302e30000000000000000000000000000000000000000000000000000000910152565b61036c6005610323565b906103796020830161033a565b565b610383610362565b90565b61038e61037b565b90565b610399610386565b90565b5190565b60209181520190565b60005b8381106103bd575050906000910152565b8060209183015181850152016103ac565b6103ed6103f66020936103fb936103e48161039c565b938480936103a0565b958691016103a9565b61019e565b0190565b61041591602082019160008184039101526103ce565b90565b3461044857610428366004610083565b610444610433610391565b61043b610073565b918291826103ff565b0390f35b610079565b906020828203126104675761046491600001610185565b90565b61007e565b3461049a5761048461047f36600461044d565b61072d565b61048c610073565b8061049681610093565b0390f35b610079565b600080fd5b6104ac610738565b6104b46104e4565b565b90565b90565b6104d06104cb6104d5926104b6565b6104b9565b6100cc565b90565b6104e1906104bc565b90565b6104f66104f160006104d8565b6107d7565b565b6105006104a4565b565b600090565b60001c90565b60018060a01b031690565b61052461052991610507565b61050d565b90565b6105369054610518565b90565b610541610502565b5061054c600061052c565b90565b90610562929161055d610738565b610629565b565b61057861057361057d926100cc565b6104b9565b6100cc565b90565b61058990610564565b90565b61059590610580565b90565b600080fd5b60e01b90565b60009103126105ae57565b61007e565b5190565b60209181520190565b6105df6105e86020936105ed936105d6816105b3565b938480936105b7565b958691016103a9565b61019e565b0190565b9161061592610608604082019360008301906100e3565b60208184039101526105c0565b90565b610620610073565b3d6000823e3d90fd5b6106329061058c565b91634f1ef28634939093929193813b156106b3576000936106649161066f610658610073565b9788968795869461059d565b8452600484016105f1565b03925af180156106ae57610681575b50565b6106a19060003d81116106a7575b61069981836101be565b8101906105a3565b3861067e565b503d61068f565b610618565b610598565b906106c3929161054f565b565b6106d6906106d1610738565b6106d8565b565b806106f46106ee6106e960006104d8565b6100d7565b916100d7565b1461070457610702906107d7565b565b61072961071160006104d8565b6000918291631e4fbdf760e01b8352600483016100f0565b0390fd5b610736906106c5565b565b610740610539565b61075961075361074e610838565b6100d7565b916100d7565b0361076057565b61078361076b610838565b600091829163118cdaa760e01b8352600483016100f0565b0390fd5b60001b90565b9061079e60018060a01b0391610787565b9181191691161790565b6107b190610580565b90565b90565b906107cc6107c76107d3926107a8565b6107b4565b825461078d565b9055565b6107e1600061052c565b6107ec8260006107b7565b9061082061081a7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936107a8565b916107a8565b91610829610073565b8061083381610093565b0390a3565b610840610502565b50339056fea2646970667358221220001626b7d7499f9f720fcbe3cf752c138e58fe5f28f481aaf6035735817dd7df64736f6c634300081a0033000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c53645" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xa53a13c5a9d801698af243e992580139d58cecfe6c6006c36a1e0ca26175b458", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", + "function": "initialize(address,address,address,uint256,uint256)", + "arguments": [ + "0xcAd73213b07F35265fa46298a7Cc3405C3c53645", + "0x5A58b845e72DC32968fA9921bF2A800Ade3e4cfD", + "0x51CadF0a4b497552A9B294BEAAa0579Bf4Cc0913", + "15724800", + "50000000000000000000000" + ], + "transaction": { + "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", + "to": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", + "gas": "0x55c62", + "value": "0x0", + "input": "0xa6b63eb8000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c536450000000000000000000000005a58b845e72dc32968fa9921bf2a800ade3e4cfd00000000000000000000000051cadf0a4b497552a9b294beaaa0579bf4cc09130000000000000000000000000000000000000000000000000000000000eff100000000000000000000000000000000000000000000000a968163f0a57b400000", + "nonce": "0x17", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xb804f8", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x511c99117ed16c6274aef4ace0451d26b9e0b43cb502376c20c627015c4013e9", + "transactionIndex": "0x4e", + "blockHash": "0x9878d37d0edaf9110e23107a997d285851a3a6ee4a7bc76bfedd00ae8e6dfc40", + "blockNumber": "0x60f1d1", + "gasUsed": "0xd8cdc", + "effectiveGasPrice": "0x16f043", + "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", + "to": null, + "contractAddress": "0x5a58b845e72dc32968fa9921bf2a800ade3e4cfd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x91afa0", + "logs": [ + { + "address": "0x51cadf0a4b497552a9b294beaaa0579bf4cc0913", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c53645" + ], + "data": "0x", + "blockHash": "0xfcb4a419882e7beb9478207801fb53bc224bbf971fe48ebfc5694c0670fc79c0", + "blockNumber": "0x60f1d2", + "transactionHash": "0x75c9d9b0946f8924ce82be4264e586b3149a8ae4d088e090cc8183c9a0a169c3", + "transactionIndex": "0x3d", + "logIndex": "0x3d", + "removed": false + } + ], + "logsBloom": "0x02000000000000000000000000000000000000000000000000800020000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000001000001000000000000000000000000000000040000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000200000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x75c9d9b0946f8924ce82be4264e586b3149a8ae4d088e090cc8183c9a0a169c3", + "transactionIndex": "0x3d", + "blockHash": "0xfcb4a419882e7beb9478207801fb53bc224bbf971fe48ebfc5694c0670fc79c0", + "blockNumber": "0x60f1d2", + "gasUsed": "0x10fa35", + "effectiveGasPrice": "0x16f043", + "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", + "to": null, + "contractAddress": "0x51cadf0a4b497552a9b294beaaa0579bf4cc0913" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x157e2f4", + "logs": [ + { + "address": "0x322b6543e76e22f2a165b4e78a7d3f7815295377", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x8d22d0234d26dcbd38147b6164dd19dbc057dc61cb7178bf297b24613075f9f6", + "blockNumber": "0x60f1d3", + "transactionHash": "0x9690e59e4b397852947dc644630f781b5fc13044166a46b99ae7766bc7836608", + "transactionIndex": "0x6d", + "logIndex": "0x9d", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000002000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x9690e59e4b397852947dc644630f781b5fc13044166a46b99ae7766bc7836608", + "transactionIndex": "0x6d", + "blockHash": "0x8d22d0234d26dcbd38147b6164dd19dbc057dc61cb7178bf297b24613075f9f6", + "blockNumber": "0x60f1d3", + "gasUsed": "0x525206", + "effectiveGasPrice": "0x16f043", + "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", + "to": null, + "contractAddress": "0x322b6543e76e22f2a165b4e78a7d3f7815295377" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa9f9de", + "logs": [ + { + "address": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000322b6543e76e22f2a165b4e78a7d3f7815295377" + ], + "data": "0x", + "blockHash": "0xb9ae38b447207c9705ec4e47c40cee739ba055e1a12fb8a59cfceea319116363", + "blockNumber": "0x60f1d4", + "transactionHash": "0x10c9e15442394db4ca349c2be1bbf0be64a0be5debf5afd8a21c9d0292bee934", + "transactionIndex": "0x3e", + "logIndex": "0x81", + "removed": false + }, + { + "address": "0x1d492fcabf9b1ad1631ce6cb9453083ac0c49cd7", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c53645" + ], + "data": "0x", + "blockHash": "0xb9ae38b447207c9705ec4e47c40cee739ba055e1a12fb8a59cfceea319116363", + "blockNumber": "0x60f1d4", + "transactionHash": "0x10c9e15442394db4ca349c2be1bbf0be64a0be5debf5afd8a21c9d0292bee934", + "transactionIndex": "0x3e", + "logIndex": "0x82", + "removed": false + }, + { + "address": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d492fcabf9b1ad1631ce6cb9453083ac0c49cd7", + "blockHash": "0xb9ae38b447207c9705ec4e47c40cee739ba055e1a12fb8a59cfceea319116363", + "blockNumber": "0x60f1d4", + "transactionHash": "0x10c9e15442394db4ca349c2be1bbf0be64a0be5debf5afd8a21c9d0292bee934", + "transactionIndex": "0x3e", + "logIndex": "0x83", + "removed": false + } + ], + "logsBloom": "0x02000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000001000000000000010000000000000000000000000000000000002000001000000000000000000000000000000040000020000000000000000000802000000800000000000040000000000400000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000001000000000400000000010000000000000020000000000000008000000000000000000400000000000000000020000000000200000000000000020000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x10c9e15442394db4ca349c2be1bbf0be64a0be5debf5afd8a21c9d0292bee934", + "transactionIndex": "0x3e", + "blockHash": "0xb9ae38b447207c9705ec4e47c40cee739ba055e1a12fb8a59cfceea319116363", + "blockNumber": "0x60f1d4", + "gasUsed": "0x107f4f", + "effectiveGasPrice": "0x16f044", + "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", + "to": null, + "contractAddress": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x560033", + "logs": [ + { + "address": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c53645" + ], + "data": "0x", + "blockHash": "0xacb2d55b66ec5b31d9b18c874002a2be1f020a8b897b049121b43824ece736ac", + "blockNumber": "0x60f1d5", + "transactionHash": "0xa53a13c5a9d801698af243e992580139d58cecfe6c6006c36a1e0ca26175b458", + "transactionIndex": "0x35", + "logIndex": "0x3d", + "removed": false + }, + { + "address": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xacb2d55b66ec5b31d9b18c874002a2be1f020a8b897b049121b43824ece736ac", + "blockNumber": "0x60f1d5", + "transactionHash": "0xa53a13c5a9d801698af243e992580139d58cecfe6c6006c36a1e0ca26175b458", + "transactionIndex": "0x35", + "logIndex": "0x3e", + "removed": false + } + ], + "logsBloom": "0x02000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000001000000000000000000000000000000040000020000000000000000000800000000000000000000040000000000400000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000008000000000000000000004000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa53a13c5a9d801698af243e992580139d58cecfe6c6006c36a1e0ca26175b458", + "transactionIndex": "0x35", + "blockHash": "0xacb2d55b66ec5b31d9b18c874002a2be1f020a8b897b049121b43824ece736ac", + "blockNumber": "0x60f1d5", + "gasUsed": "0x3aa62", + "effectiveGasPrice": "0x16f044", + "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", + "to": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": { + "stakingProxy": { + "internal_type": "contract Staking", + "value": "0x3a09441FBe7279CEa668E05d9459B61821Bf0dD3" + }, + "rewardsDistributor": { + "internal_type": "contract RewardsDistributor", + "value": "0x51CadF0a4b497552A9B294BEAAa0579Bf4Cc0913" + } + }, + "timestamp": 1721609738, + "chain": 11155111, + "commit": "40cfed7" +} \ No newline at end of file diff --git a/broadcast/DeployTestnet.s.sol/11155111/run-latest.json b/broadcast/DeployTestnet.s.sol/11155111/run-latest.json index 4e67b4b..653adc6 100644 --- a/broadcast/DeployTestnet.s.sol/11155111/run-latest.json +++ b/broadcast/DeployTestnet.s.sol/11155111/run-latest.json @@ -1,10 +1,10 @@ { "transactions": [ { - "hash": "0x2252727054b964643f99ace96279a725bffe4cc6e77185204559946577fac676", + "hash": "0x511c99117ed16c6274aef4ace0451d26b9e0b43cb502376c20c627015c4013e9", "transactionType": "CREATE", "contractName": null, - "contractAddress": "0x443f63a625a8424e62db5b252a7aa5d0cf94828b", + "contractAddress": "0x5a58b845e72dc32968fa9921bf2a800ade3e4cfd", "function": null, "arguments": null, "transaction": { @@ -12,92 +12,92 @@ "gas": "0x119c0e", "value": "0x0", "input": "0x60806040523461002757610011610163565b61001961002c565b610e006103f88239610e0090f35b610032565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061006190610037565b810190811060018060401b0382111761007957604052565b610041565b9061009161008a61002c565b9283610057565b565b60018060401b0381116100af576100ab602091610037565b0190565b610041565b906100c66100c183610093565b61007e565b918252565b60007f5368750000000000000000000000000000000000000000000000000000000000910152565b6100fd60036100b4565b9061010a602083016100cb565b565b6101146100f3565b90565b60007f5348550000000000000000000000000000000000000000000000000000000000910152565b61014960036100b4565b9061015660208301610117565b565b61016061013f565b90565b61017c61016e61010c565b610176610158565b906103df565b565b5190565b634e487b7160e01b600052602260045260246000fd5b90600160028304921680156101b8575b60208310146101b357565b610182565b91607f16916101a8565b600052602060002090565b601f602091010490565b1b90565b919060086101f79102916101f1600019846101d7565b926101d7565b9181191691161790565b90565b90565b61021b61021661022092610201565b610204565b610201565b90565b90565b919061023c61023761024493610207565b610223565b9083546101db565b9055565b600090565b61025f91610259610248565b91610226565b565b5b81811061026d575050565b8061027b600060019361024d565b01610262565b9190601f8111610291575b505050565b61029d6102c2936101c2565b9060206102a9846101cd565b830193106102ca575b6102bb906101cd565b0190610261565b38808061028c565b91506102bb819290506102b2565b1c90565b906102ed90600019906008026102d8565b191690565b816102fc916102dc565b906002021790565b9061030e8161017e565b9060018060401b0382116103ce576103308261032a8554610198565b85610281565b602090601f83116001146103655791809161035493600092610359575b50506102f2565b90555b565b9091500151388061034d565b601f19831691610374856101c2565b9260005b8181106103b65750916002939185600196941061039c575b50505002019055610357565b6103ac910151601f8416906102dc565b9055388080610390565b91936020600181928787015181550195019201610378565b610041565b906103dd91610304565b565b906103ee6103f59260036103d3565b60046103d3565b56fe60806040526004361015610013575b610510565b61001e6000356100bd565b806306fdde03146100b8578063095ea7b3146100b357806318160ddd146100ae57806323b872dd146100a9578063313ce567146100a457806340c10f191461009f57806370a082311461009a57806395d89b4114610095578063a9059cbb146100905763dd62ed3e0361000e576104da565b610476565b610441565b61040c565b6103b9565b61037e565b61031f565b6102af565b610256565b610169565b60e01c90565b60405190565b600080fd5b600080fd5b60009103126100de57565b6100ce565b5190565b60209181520190565b60005b838110610104575050906000910152565b8060209183015181850152016100f3565b601f801991011690565b61013e61014760209361014c93610135816100e3565b938480936100e7565b958691016100f0565b610115565b0190565b610166916020820191600081840391015261011f565b90565b34610199576101793660046100d3565b610195610184610677565b61018c6100c3565b91829182610150565b0390f35b6100c9565b60018060a01b031690565b6101b29061019e565b90565b6101be816101a9565b036101c557565b600080fd5b905035906101d7826101b5565b565b90565b6101e5816101d9565b036101ec57565b600080fd5b905035906101fe826101dc565b565b9190604083820312610229578061021d61022692600086016101ca565b936020016101f1565b90565b6100ce565b151590565b61023c9061022e565b9052565b919061025490600060208501940190610233565b565b346102875761028361027261026c366004610200565b90610692565b61027a6100c3565b91829182610240565b0390f35b6100c9565b610295906101d9565b9052565b91906102ad9060006020850194019061028c565b565b346102df576102bf3660046100d3565b6102db6102ca6106e3565b6102d26100c3565b91829182610299565b0390f35b6100c9565b909160608284031261031a5761031761030084600085016101ca565b9361030e81602086016101ca565b936040016101f1565b90565b6100ce565b346103505761034c61033b6103353660046102e4565b916106f9565b6103436100c3565b91829182610240565b0390f35b6100c9565b60ff1690565b61036490610355565b9052565b919061037c9060006020850194019061035b565b565b346103ae5761038e3660046100d3565b6103aa61039961074f565b6103a16100c3565b91829182610368565b0390f35b6100c9565b60000190565b346103e8576103d26103cc366004610200565b90610765565b6103da6100c3565b806103e4816103b3565b0390f35b6100c9565b9060208282031261040757610404916000016101ca565b90565b6100ce565b3461043c576104386104276104223660046103ed565b6107bd565b61042f6100c3565b91829182610299565b0390f35b6100c9565b34610471576104513660046100d3565b61046d61045c6107dc565b6104646100c3565b91829182610150565b0390f35b6100c9565b346104a7576104a361049261048c366004610200565b906107f2565b61049a6100c3565b91829182610240565b0390f35b6100c9565b91906040838203126104d557806104c96104d292600086016101ca565b936020016101ca565b90565b6100ce565b3461050b576105076104f66104f03660046104ac565b9061082c565b6104fe6100c3565b91829182610299565b0390f35b6100c9565b600080fd5b606090565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610550575b602083101461054b57565b61051a565b91607f1691610540565b60209181520190565b600052602060002090565b906000929180549061058961058283610530565b809461055a565b916001811690816000146105e257506001146105a5575b505050565b6105b29192939450610563565b916000925b8184106105ca57505001903880806105a0565b600181602092959395548486015201910192906105b7565b92949550505060ff19168252151560200201903880806105a0565b906106079161056e565b90565b634e487b7160e01b600052604160045260246000fd5b9061062a90610115565b810190811067ffffffffffffffff82111761064457604052565b61060a565b90610669610662926106596100c3565b938480926105fd565b0383610620565b565b61067490610649565b90565b61067f610515565b5061068a600361066b565b90565b600090565b6106af9161069e61068d565b506106a7610859565b919091610866565b600190565b600090565b60001c90565b90565b6106ce6106d3916106b9565b6106bf565b90565b6106e090546106c2565b90565b6106eb6106b4565b506106f660026106d6565b90565b916107239261070661068d565b5061071b610712610859565b829084916108c4565b919091610994565b600190565b600090565b90565b90565b61074761074261074c9261072d565b610730565b610355565b90565b610757610728565b506107626012610733565b90565b9061076f91610a37565b565b61078561078061078a9261019e565b610730565b61019e565b90565b61079690610771565b90565b6107a29061078d565b90565b906107af90610799565b600052602052604060002090565b6107d46107d9916107cc6106b4565b5060006107a5565b6106d6565b90565b6107e4610515565b506107ef600461066b565b90565b61080f916107fe61068d565b50610807610859565b919091610994565b600190565b9061081e90610799565b600052602052604060002090565b6108519161084761084c9261083f6106b4565b506001610814565b6107a5565b6106d6565b90565b600090565b610861610854565b503390565b916108749291600192610af5565b565b61087f906101a9565b9052565b6040906108ad6108b494969593966108a360608401986000850190610876565b602083019061028c565b019061028c565b565b906108c191036101d9565b90565b9291926108d281839061082c565b90816108e86108e26000196101d9565b916101d9565b036108f5575b5050509050565b81610908610902876101d9565b916101d9565b1061092f57610926939461091d9193926108b6565b90600092610af5565b803880806108ee565b5061094f849291926000938493637dc7a0d960e11b855260048501610883565b0390fd5b90565b61096a61096561096f92610953565b610730565b61019e565b90565b61097b90610956565b90565b919061099290600060208501940190610876565b565b91826109b16109ab6109a66000610972565b6101a9565b916101a9565b14610a0e57816109d26109cc6109c76000610972565b6101a9565b916101a9565b146109e5576109e392919091610c53565b565b610a0a6109f26000610972565b600091829163ec442f0560e01b83526004830161097e565b0390fd5b610a33610a1b6000610972565b6000918291634b637e8f60e11b83526004830161097e565b0390fd5b80610a53610a4d610a486000610972565b6101a9565b916101a9565b14610a7057610a6e91610a666000610972565b919091610c53565b565b610a95610a7d6000610972565b600091829163ec442f0560e01b83526004830161097e565b0390fd5b60001b90565b90610aac60001991610a99565b9181191691161790565b610aca610ac5610acf926101d9565b610730565b6101d9565b90565b90565b90610aea610ae5610af192610ab6565b610ad2565b8254610a9f565b9055565b909281610b13610b0d610b086000610972565b6101a9565b916101a9565b14610be15783610b34610b2e610b296000610972565b6101a9565b916101a9565b14610bb857610b5883610b53610b4c60018690610814565b87906107a5565b610ad5565b610b62575b505050565b919091610bad610b9b610b957f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593610799565b93610799565b93610ba46100c3565b91829182610299565b0390a3388080610b5d565b610bdd610bc56000610972565b6000918291634a1406b160e11b83526004830161097e565b0390fd5b610c06610bee6000610972565b600091829163e602df0560e01b83526004830161097e565b0390fd5b634e487b7160e01b600052601160045260246000fd5b610c2f610c35919392936101d9565b926101d9565b8201809211610c4057565b610c0a565b90610c5091016101d9565b90565b91909180610c72610c6c610c676000610972565b6101a9565b916101a9565b14600014610d5757610c97610c9083610c8b60026106d6565b610c20565b6002610ad5565b5b82610cb4610cae610ca96000610972565b6101a9565b916101a9565b14600014610d2a57610cd9610cd283610ccd60026106d6565b6108b6565b6002610ad5565b5b919091610d25610d13610d0d7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93610799565b93610799565b93610d1c6100c3565b91829182610299565b0390a3565b610d5282610d4c610d3d600087906107a5565b91610d47836106d6565b610c45565b90610ad5565b610cda565b610d6b610d66600083906107a5565b6106d6565b80610d7e610d78856101d9565b916101d9565b10610da757610d91610da29184906108b6565b610d9d600084906107a5565b610ad5565b610c98565b90610dc6909192600093849363391434e360e21b855260048501610883565b0390fdfea26469706673582212206674365a9697804867f421a3c1af936f7f97cd7d87347956c752ddcb017d38fb64736f6c634300081a0033", - "nonce": "0xe", + "nonce": "0x13", "chainId": "0xaa36a7" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x83fb5819942c26d26ea8c71b3c91b823f1b58e8d3e1998e7367d7d88a04d9dc5", + "hash": "0x75c9d9b0946f8924ce82be4264e586b3149a8ae4d088e090cc8183c9a0a169c3", "transactionType": "CREATE", "contractName": null, - "contractAddress": "0x8b5e338c47dee476e7437060f625add05d0cfed7", + "contractAddress": "0x51cadf0a4b497552a9b294beaaa0579bf4cc0913", "function": null, "arguments": null, "transaction": { "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", "gas": "0x16104f", "value": "0x0", - "input": "0x6080604052346100305761001a61001461010a565b906101b3565b610022610035565b61120c610354823961120c90f35b61003b565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061006a90610040565b810190811060018060401b0382111761008257604052565b61004a565b9061009a610093610035565b9283610060565b565b600080fd5b60018060a01b031690565b6100b5906100a1565b90565b6100c1816100ac565b036100c857565b600080fd5b905051906100da826100b8565b565b919060408382031261010557806100f961010292600086016100cd565b936020016100cd565b90565b61009c565b6101286115608038038061011d81610087565b9283398101906100dc565b9091565b90565b61014361013e610148926100a1565b61012c565b6100a1565b90565b6101549061012f565b90565b6101609061014b565b90565b60001b90565b9061017a60018060a01b0391610163565b9181191691161790565b61018d9061014b565b90565b90565b906101a86101a36101af92610184565b610190565b8254610169565b9055565b6101cf916101c36101c8926101d1565b610157565b6001610193565b565b6101da9061022a565b565b90565b6101f36101ee6101f8926101dc565b61012c565b6100a1565b90565b610204906101df565b90565b610210906100ac565b9052565b919061022890600060208501940190610207565b565b8061024661024061023b60006101fb565b6100ac565b916100ac565b1461025657610254906102f2565b565b61027b61026360006101fb565b6000918291631e4fbdf760e01b835260048301610214565b0390fd5b60001c90565b60018060a01b031690565b61029c6102a19161027f565b610285565b90565b6102ae9054610290565b90565b6102ba9061012f565b90565b6102c6906102b1565b90565b90565b906102e16102dc6102e8926102bd565b6102c9565b8254610169565b9055565b60000190565b6102fc60006102a4565b6103078260006102cc565b9061033b6103357f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102bd565b916102bd565b91610344610035565b8061034e816102ec565b0390a356fe60806040526004361015610013575b610564565b61001e6000356100cd565b80630e0ab921146100c857806338edf198146100c357806370bb45b3146100be578063715018a6146100b95780637f01099a146100b45780638aee8127146100af5780638da5cb5b146100aa578063c1075329146100a5578063e1d9be15146100a0578063f2fde38b1461009b5763f7c618c10361000e5761052f565b610488565b610454565b610420565b610399565b610343565b610310565b6102dd565b6102a2565b61025d565b610211565b60e01c90565b60405190565b600080fd5b600080fd5b60018060a01b031690565b6100f7906100e3565b90565b610103816100ee565b0361010a57565b600080fd5b9050359061011c826100fa565b565b90602082820312610138576101359160000161010f565b90565b6100de565b90565b61015461014f610159926100e3565b61013d565b6100e3565b90565b61016590610140565b90565b6101719061015c565b90565b9061017e90610168565b600052602052604060002090565b60001c90565b90565b6101a16101a69161018c565b610192565b90565b6101b39054610195565b90565b6101c1906002610174565b906101da60016101d3600085016101a9565b93016101a9565b90565b90565b6101e9906101dd565b9052565b91602061020f929493610208604082019660008301906101e0565b01906101e0565b565b346102425761022961022436600461011e565b6101b6565b9061023e6102356100d3565b928392836101ed565b0390f35b6100d9565b919061025b906000602085019401906101e0565b565b3461028d5761028961027861027336600461011e565b610783565b6102806100d3565b91829182610247565b0390f35b6100d9565b600091031261029d57565b6100de565b346102d2576102b2366004610292565b6102ce6102bd610929565b6102c56100d3565b91829182610247565b0390f35b6100d9565b60000190565b3461030b576102ed366004610292565b6102f5610b0b565b6102fd6100d3565b80610307816102d7565b0390f35b6100d9565b3461033e5761032861032336600461011e565b610c52565b6103306100d3565b8061033a816102d7565b0390f35b6100d9565b346103715761035b61035636600461011e565b610e0d565b6103636100d3565b8061036d816102d7565b0390f35b6100d9565b61037f906100ee565b9052565b919061039790600060208501940190610376565b565b346103c9576103a9366004610292565b6103c56103b4610e49565b6103bc6100d3565b91829182610383565b0390f35b6100d9565b6103d7816101dd565b036103de57565b600080fd5b905035906103f0826103ce565b565b919060408382031261041b578061040f610418926000860161010f565b936020016103e3565b90565b6100de565b3461044f576104396104333660046103f2565b90610e8b565b6104416100d3565b8061044b816102d7565b0390f35b6100d9565b346104835761046d6104673660046103f2565b90610f97565b6104756100d3565b8061047f816102d7565b0390f35b6100d9565b346104b6576104a061049b36600461011e565b61100b565b6104a86100d3565b806104b2816102d7565b0390f35b6100d9565b1c90565b60018060a01b031690565b6104da9060086104df93026104bb565b6104bf565b90565b906104ed91546104ca565b90565b6104fd60016000906104e2565b90565b6105099061015c565b90565b61051590610500565b9052565b919061052d9060006020850194019061050c565b565b3461055f5761053f366004610292565b61055b61054a6104f0565b6105526100d3565b91829182610519565b0390f35b6100d9565b600080fd5b600090565b90565b90565b61058861058361058d92610571565b61013d565b6101dd565b90565b1561059757565b6000632bf18ef760e11b8152806105b0600482016102d7565b0390fd5b634e487b7160e01b600052601160045260246000fd5b6105d96105df919392936101dd565b926101dd565b82039182116105ea57565b6105b4565b156105f657565b600063a24695e960e01b81528061060f600482016102d7565b0390fd5b61061f6106249161018c565b6104bf565b90565b6106319054610613565b90565b61063d9061015c565b90565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061066a90610640565b810190811067ffffffffffffffff82111761068457604052565b61064a565b60e01b90565b9050519061069c826103ce565b565b906020828203126106b8576106b59160000161068f565b90565b6100de565b6106c56100d3565b3d6000823e3d90fd5b6106dd6106e3919392936101dd565b926101dd565b916106ef8382026101dd565b9281840414901517156106fe57565b6105b4565b1561070a57565b6000631036b5ad60e31b815280610723600482016102d7565b0390fd5b60001b90565b9061073a60001991610727565b9181191691161790565b61075861075361075d926101dd565b61013d565b6101dd565b90565b90565b9061077861077361077f92610744565b610760565b825461072d565b9055565b9061078c610569565b506107a161079c60028490610174565b61056e565b916107ca6107b1600085016101a9565b6107c46107be6000610574565b916101dd565b11610590565b6108476107e3426107dd600187016101a9565b906105ca565b93610801856107fb6107f56000610574565b916101dd565b116105ef565b60206108156108106001610627565b610500565b6370a082319061083c61082730610634565b926108306100d3565b96879485938493610689565b835260048301610383565b03915afa8015610924576108776108919161089b946000916108f6575b5096610872600085016101a9565b6106ce565b9561088a610884886101dd565b916101dd565b1015610703565b6001429101610763565b6108b06108a86001610627565b8285916110a8565b82906108f16108df7fe8354b169cd993d5cdfad1036a9a3f1ea7ed77e430bccb279200fd088243f59592610168565b926108e86100d3565b91829182610247565b0390a2565b610917915060203d811161091d575b61090f8183610660565b81019061069e565b38610864565b503d610905565b6106bd565b610931610569565b50339061094861094360028490610174565b61056e565b9161095f42610959600186016101a9565b906105ca565b926109a960206109776109726001610627565b610500565b6370a082319061099e61098930610634565b926109926100d3565b95869485938493610689565b835260048301610383565b03915afa8015610ab8576109d291600091610a8a575b50946109cd600084016101a9565b6106ce565b93846109e76109e16000610574565b916101dd565b14908115610a6f575b50610a5e57610a03906001429101610763565b610a18610a106001610627565b8285916110a8565b8290610a59610a477fe8354b169cd993d5cdfad1036a9a3f1ea7ed77e430bccb279200fd088243f59592610168565b92610a506100d3565b91829182610247565b0390a2565b50509050610a6c6000610574565b90565b9050610a83610a7d866101dd565b916101dd565b10386109f0565b610aab915060203d8111610ab1575b610aa38183610660565b81019061069e565b386109bf565b503d610a99565b6106bd565b610ac56110f6565b610acd610af7565b565b610ae3610ade610ae892610571565b61013d565b6100e3565b90565b610af490610acf565b90565b610b09610b046000610aeb565b611168565b565b610b13610abd565b565b610b2690610b216110f6565b610bf5565b565b1b90565b91906008610b48910291610b4260001984610b28565b92610b28565b9181191691161790565b9190610b68610b63610b7093610744565b610760565b908354610b2c565b9055565b610b8691610b80610569565b91610b52565b565b60006001610ba292610b9c83808301610b74565b01610b74565b565b634e487b7160e01b600052600060045260246000fd5b90600003610bcd57610bcb90610b88565b565b610ba4565b610bdb90610574565b9052565b9190610bf390600060208501940190610bd2565b565b610c0b6000610c0660028490610174565b610bba565b600090610c4d610c3b7f85916a855215eab72a3dcd8facb39e6465c5878f628dffe21740fe664cc8d1f792610168565b92610c446100d3565b91829182610bdf565b0390a2565b610c5b90610b15565b565b610c6e90610c696110f6565b610cf6565b565b15610c7757565b600063d92e233d60e01b815280610c90600482016102d7565b0390fd5b610c9d90610140565b90565b610ca990610c94565b90565b90610cbd60018060a01b0391610727565b9181191691161790565b610cd090610c94565b90565b90565b90610ceb610ce6610cf292610cc7565b610cd3565b8254610cac565b9055565b610d1c81610d15610d0f610d0a6000610aeb565b6100ee565b916100ee565b1415610c70565b610d66336020610d34610d2f6001610627565b610500565b6370a0823190610d5b610d4630610634565b92610d4f6100d3565b96879485938493610689565b835260048301610383565b03915afa908115610e0857610d8392600092610dd8575b50610e8b565b610d96610d8f82610ca0565b6001610cd6565b610dc07f2d6b04df9b7d358407d1a014f1114b064add34c19d63d395db155a7e533e967a91610168565b90610dc96100d3565b80610dd3816102d7565b0390a2565b610dfa91925060203d8111610e01575b610df28183610660565b81019061069e565b9038610d7d565b503d610de8565b6106bd565b610e1690610c5d565b565b600090565b60018060a01b031690565b610e34610e399161018c565b610e1d565b90565b610e469054610e28565b90565b610e51610e18565b50610e5c6000610e3c565b90565b90610e7191610e6c6110f6565b610e73565b565b610e8991610e816001610627565b9190916110a8565b565b90610e9591610e5f565b565b90610ea991610ea46110f6565b610eab565b565b610ed181610eca610ec4610ebf6000610aeb565b6100ee565b916100ee565b1415610c70565b610eee82610ee8610ee26000610574565b916101dd565b11610590565b610f056001610eff60028490610174565b016101a9565b610f18610f126000610574565b916101dd565b14610f7a575b610f36826000610f3060028590610174565b01610763565b610f75610f637f85916a855215eab72a3dcd8facb39e6465c5878f628dffe21740fe664cc8d1f792610168565b92610f6c6100d3565b91829182610247565b0390a2565b610f92426001610f8c60028590610174565b01610763565b610f1e565b90610fa191610e97565b565b610fb490610faf6110f6565b610fb6565b565b80610fd2610fcc610fc76000610aeb565b6100ee565b916100ee565b14610fe257610fe090611168565b565b611007610fef6000610aeb565b6000918291631e4fbdf760e01b835260048301610383565b0390fd5b61101490610fa3565b565b600090565b60209181520190565b60007f5452414e534645525f4641494c45440000000000000000000000000000000000910152565b611059600f60209261101b565b61106281611024565b0190565b61107c906020810190600081830391015261104c565b90565b1561108657565b61108e6100d3565b62461bcd60e51b8152806110a460048201611066565b0390fd5b6044602092600080936110f4966110bd611016565b506040519363a9059cbb60e01b855260018060a01b0316600485015260248401525af13d15601f3d1160016000511416171661107f565b565b6110fe610e49565b61111761111161110c6111c9565b6100ee565b916100ee565b0361111e57565b6111416111296111c9565b600091829163118cdaa760e01b835260048301610383565b0390fd5b90565b9061115d61115861116492610168565b611145565b8254610cac565b9055565b6111726000610e3c565b61117d826000611148565b906111b16111ab7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610168565b91610168565b916111ba6100d3565b806111c4816102d7565b0390a3565b6111d1610e18565b50339056fea2646970667358221220e80c1a1703162e6b24aa10ec955d78a510b5b713e542664e38765612893eb0a764736f6c634300081a0033000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c53645000000000000000000000000443f63a625a8424e62db5b252a7aa5d0cf94828b", - "nonce": "0xf", + "input": "0x6080604052346100305761001a61001461010a565b906101b3565b610022610035565b61120c610354823961120c90f35b61003b565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061006a90610040565b810190811060018060401b0382111761008257604052565b61004a565b9061009a610093610035565b9283610060565b565b600080fd5b60018060a01b031690565b6100b5906100a1565b90565b6100c1816100ac565b036100c857565b600080fd5b905051906100da826100b8565b565b919060408382031261010557806100f961010292600086016100cd565b936020016100cd565b90565b61009c565b6101286115608038038061011d81610087565b9283398101906100dc565b9091565b90565b61014361013e610148926100a1565b61012c565b6100a1565b90565b6101549061012f565b90565b6101609061014b565b90565b60001b90565b9061017a60018060a01b0391610163565b9181191691161790565b61018d9061014b565b90565b90565b906101a86101a36101af92610184565b610190565b8254610169565b9055565b6101cf916101c36101c8926101d1565b610157565b6001610193565b565b6101da9061022a565b565b90565b6101f36101ee6101f8926101dc565b61012c565b6100a1565b90565b610204906101df565b90565b610210906100ac565b9052565b919061022890600060208501940190610207565b565b8061024661024061023b60006101fb565b6100ac565b916100ac565b1461025657610254906102f2565b565b61027b61026360006101fb565b6000918291631e4fbdf760e01b835260048301610214565b0390fd5b60001c90565b60018060a01b031690565b61029c6102a19161027f565b610285565b90565b6102ae9054610290565b90565b6102ba9061012f565b90565b6102c6906102b1565b90565b90565b906102e16102dc6102e8926102bd565b6102c9565b8254610169565b9055565b60000190565b6102fc60006102a4565b6103078260006102cc565b9061033b6103357f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102bd565b916102bd565b91610344610035565b8061034e816102ec565b0390a356fe60806040526004361015610013575b610564565b61001e6000356100cd565b80630e0ab921146100c857806338edf198146100c357806370bb45b3146100be578063715018a6146100b95780637f01099a146100b45780638aee8127146100af5780638da5cb5b146100aa578063c1075329146100a5578063e1d9be15146100a0578063f2fde38b1461009b5763f7c618c10361000e5761052f565b610488565b610454565b610420565b610399565b610343565b610310565b6102dd565b6102a2565b61025d565b610211565b60e01c90565b60405190565b600080fd5b600080fd5b60018060a01b031690565b6100f7906100e3565b90565b610103816100ee565b0361010a57565b600080fd5b9050359061011c826100fa565b565b90602082820312610138576101359160000161010f565b90565b6100de565b90565b61015461014f610159926100e3565b61013d565b6100e3565b90565b61016590610140565b90565b6101719061015c565b90565b9061017e90610168565b600052602052604060002090565b60001c90565b90565b6101a16101a69161018c565b610192565b90565b6101b39054610195565b90565b6101c1906002610174565b906101da60016101d3600085016101a9565b93016101a9565b90565b90565b6101e9906101dd565b9052565b91602061020f929493610208604082019660008301906101e0565b01906101e0565b565b346102425761022961022436600461011e565b6101b6565b9061023e6102356100d3565b928392836101ed565b0390f35b6100d9565b919061025b906000602085019401906101e0565b565b3461028d5761028961027861027336600461011e565b610783565b6102806100d3565b91829182610247565b0390f35b6100d9565b600091031261029d57565b6100de565b346102d2576102b2366004610292565b6102ce6102bd610929565b6102c56100d3565b91829182610247565b0390f35b6100d9565b60000190565b3461030b576102ed366004610292565b6102f5610b0b565b6102fd6100d3565b80610307816102d7565b0390f35b6100d9565b3461033e5761032861032336600461011e565b610c52565b6103306100d3565b8061033a816102d7565b0390f35b6100d9565b346103715761035b61035636600461011e565b610e0d565b6103636100d3565b8061036d816102d7565b0390f35b6100d9565b61037f906100ee565b9052565b919061039790600060208501940190610376565b565b346103c9576103a9366004610292565b6103c56103b4610e49565b6103bc6100d3565b91829182610383565b0390f35b6100d9565b6103d7816101dd565b036103de57565b600080fd5b905035906103f0826103ce565b565b919060408382031261041b578061040f610418926000860161010f565b936020016103e3565b90565b6100de565b3461044f576104396104333660046103f2565b90610e8b565b6104416100d3565b8061044b816102d7565b0390f35b6100d9565b346104835761046d6104673660046103f2565b90610f97565b6104756100d3565b8061047f816102d7565b0390f35b6100d9565b346104b6576104a061049b36600461011e565b61100b565b6104a86100d3565b806104b2816102d7565b0390f35b6100d9565b1c90565b60018060a01b031690565b6104da9060086104df93026104bb565b6104bf565b90565b906104ed91546104ca565b90565b6104fd60016000906104e2565b90565b6105099061015c565b90565b61051590610500565b9052565b919061052d9060006020850194019061050c565b565b3461055f5761053f366004610292565b61055b61054a6104f0565b6105526100d3565b91829182610519565b0390f35b6100d9565b600080fd5b600090565b90565b90565b61058861058361058d92610571565b61013d565b6101dd565b90565b1561059757565b6000632bf18ef760e11b8152806105b0600482016102d7565b0390fd5b634e487b7160e01b600052601160045260246000fd5b6105d96105df919392936101dd565b926101dd565b82039182116105ea57565b6105b4565b156105f657565b600063a24695e960e01b81528061060f600482016102d7565b0390fd5b61061f6106249161018c565b6104bf565b90565b6106319054610613565b90565b61063d9061015c565b90565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061066a90610640565b810190811067ffffffffffffffff82111761068457604052565b61064a565b60e01b90565b9050519061069c826103ce565b565b906020828203126106b8576106b59160000161068f565b90565b6100de565b6106c56100d3565b3d6000823e3d90fd5b6106dd6106e3919392936101dd565b926101dd565b916106ef8382026101dd565b9281840414901517156106fe57565b6105b4565b1561070a57565b6000631036b5ad60e31b815280610723600482016102d7565b0390fd5b60001b90565b9061073a60001991610727565b9181191691161790565b61075861075361075d926101dd565b61013d565b6101dd565b90565b90565b9061077861077361077f92610744565b610760565b825461072d565b9055565b9061078c610569565b506107a161079c60028490610174565b61056e565b916107ca6107b1600085016101a9565b6107c46107be6000610574565b916101dd565b11610590565b6108476107e3426107dd600187016101a9565b906105ca565b93610801856107fb6107f56000610574565b916101dd565b116105ef565b60206108156108106001610627565b610500565b6370a082319061083c61082730610634565b926108306100d3565b96879485938493610689565b835260048301610383565b03915afa8015610924576108776108919161089b946000916108f6575b5096610872600085016101a9565b6106ce565b9561088a610884886101dd565b916101dd565b1015610703565b6001429101610763565b6108b06108a86001610627565b8285916110a8565b82906108f16108df7fe8354b169cd993d5cdfad1036a9a3f1ea7ed77e430bccb279200fd088243f59592610168565b926108e86100d3565b91829182610247565b0390a2565b610917915060203d811161091d575b61090f8183610660565b81019061069e565b38610864565b503d610905565b6106bd565b610931610569565b50339061094861094360028490610174565b61056e565b9161095f42610959600186016101a9565b906105ca565b926109a960206109776109726001610627565b610500565b6370a082319061099e61098930610634565b926109926100d3565b95869485938493610689565b835260048301610383565b03915afa8015610ab8576109d291600091610a8a575b50946109cd600084016101a9565b6106ce565b93846109e76109e16000610574565b916101dd565b14908115610a6f575b50610a5e57610a03906001429101610763565b610a18610a106001610627565b8285916110a8565b8290610a59610a477fe8354b169cd993d5cdfad1036a9a3f1ea7ed77e430bccb279200fd088243f59592610168565b92610a506100d3565b91829182610247565b0390a2565b50509050610a6c6000610574565b90565b9050610a83610a7d866101dd565b916101dd565b10386109f0565b610aab915060203d8111610ab1575b610aa38183610660565b81019061069e565b386109bf565b503d610a99565b6106bd565b610ac56110f6565b610acd610af7565b565b610ae3610ade610ae892610571565b61013d565b6100e3565b90565b610af490610acf565b90565b610b09610b046000610aeb565b611168565b565b610b13610abd565b565b610b2690610b216110f6565b610bf5565b565b1b90565b91906008610b48910291610b4260001984610b28565b92610b28565b9181191691161790565b9190610b68610b63610b7093610744565b610760565b908354610b2c565b9055565b610b8691610b80610569565b91610b52565b565b60006001610ba292610b9c83808301610b74565b01610b74565b565b634e487b7160e01b600052600060045260246000fd5b90600003610bcd57610bcb90610b88565b565b610ba4565b610bdb90610574565b9052565b9190610bf390600060208501940190610bd2565b565b610c0b6000610c0660028490610174565b610bba565b600090610c4d610c3b7f85916a855215eab72a3dcd8facb39e6465c5878f628dffe21740fe664cc8d1f792610168565b92610c446100d3565b91829182610bdf565b0390a2565b610c5b90610b15565b565b610c6e90610c696110f6565b610cf6565b565b15610c7757565b600063d92e233d60e01b815280610c90600482016102d7565b0390fd5b610c9d90610140565b90565b610ca990610c94565b90565b90610cbd60018060a01b0391610727565b9181191691161790565b610cd090610c94565b90565b90565b90610ceb610ce6610cf292610cc7565b610cd3565b8254610cac565b9055565b610d1c81610d15610d0f610d0a6000610aeb565b6100ee565b916100ee565b1415610c70565b610d66336020610d34610d2f6001610627565b610500565b6370a0823190610d5b610d4630610634565b92610d4f6100d3565b96879485938493610689565b835260048301610383565b03915afa908115610e0857610d8392600092610dd8575b50610e8b565b610d96610d8f82610ca0565b6001610cd6565b610dc07f2d6b04df9b7d358407d1a014f1114b064add34c19d63d395db155a7e533e967a91610168565b90610dc96100d3565b80610dd3816102d7565b0390a2565b610dfa91925060203d8111610e01575b610df28183610660565b81019061069e565b9038610d7d565b503d610de8565b6106bd565b610e1690610c5d565b565b600090565b60018060a01b031690565b610e34610e399161018c565b610e1d565b90565b610e469054610e28565b90565b610e51610e18565b50610e5c6000610e3c565b90565b90610e7191610e6c6110f6565b610e73565b565b610e8991610e816001610627565b9190916110a8565b565b90610e9591610e5f565b565b90610ea991610ea46110f6565b610eab565b565b610ed181610eca610ec4610ebf6000610aeb565b6100ee565b916100ee565b1415610c70565b610eee82610ee8610ee26000610574565b916101dd565b11610590565b610f056001610eff60028490610174565b016101a9565b610f18610f126000610574565b916101dd565b14610f7a575b610f36826000610f3060028590610174565b01610763565b610f75610f637f85916a855215eab72a3dcd8facb39e6465c5878f628dffe21740fe664cc8d1f792610168565b92610f6c6100d3565b91829182610247565b0390a2565b610f92426001610f8c60028590610174565b01610763565b610f1e565b90610fa191610e97565b565b610fb490610faf6110f6565b610fb6565b565b80610fd2610fcc610fc76000610aeb565b6100ee565b916100ee565b14610fe257610fe090611168565b565b611007610fef6000610aeb565b6000918291631e4fbdf760e01b835260048301610383565b0390fd5b61101490610fa3565b565b600090565b60209181520190565b60007f5452414e534645525f4641494c45440000000000000000000000000000000000910152565b611059600f60209261101b565b61106281611024565b0190565b61107c906020810190600081830391015261104c565b90565b1561108657565b61108e6100d3565b62461bcd60e51b8152806110a460048201611066565b0390fd5b6044602092600080936110f4966110bd611016565b506040519363a9059cbb60e01b855260018060a01b0316600485015260248401525af13d15601f3d1160016000511416171661107f565b565b6110fe610e49565b61111761111161110c6111c9565b6100ee565b916100ee565b0361111e57565b6111416111296111c9565b600091829163118cdaa760e01b835260048301610383565b0390fd5b90565b9061115d61115861116492610168565b611145565b8254610cac565b9055565b6111726000610e3c565b61117d826000611148565b906111b16111ab7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610168565b91610168565b916111ba6100d3565b806111c4816102d7565b0390a3565b6111d1610e18565b50339056fea2646970667358221220e80c1a1703162e6b24aa10ec955d78a510b5b713e542664e38765612893eb0a764736f6c634300081a0033000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c536450000000000000000000000005a58b845e72dc32968fa9921bf2a800ade3e4cfd", + "nonce": "0x14", "chainId": "0xaa36a7" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xed34cd4f0643fd6d7cf32fbfe25ae24a830acc023dae93e61f91d6a09dbf3fef", + "hash": "0x9690e59e4b397852947dc644630f781b5fc13044166a46b99ae7766bc7836608", "transactionType": "CREATE", - "contractName": null, - "contractAddress": "0x4aaef0819cd76750644855bd1694fdb0e7f11a80", + "contractName": "Staking", + "contractAddress": "0x322b6543e76e22f2a165b4e78a7d3f7815295377", "function": null, "arguments": null, "transaction": { "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", - "gas": "0x6ae9b3", + "gas": "0x6afc3f", "value": "0x0", - "input": "0x60806040523461002757610011610037565b61001961002c565b615fee6102188239615fee90f35b610032565b60405190565b600080fd5b61003f610137565b565b60401c90565b60ff1690565b61005961005e91610041565b610047565b90565b61006b905461004d565b90565b60000190565b60001c90565b60018060401b031690565b61009161009691610074565b61007a565b90565b6100a39054610085565b90565b60018060401b031690565b60001b90565b906100c860018060401b03916100b1565b9181191691161790565b90565b6100e96100e46100ee926100a6565b6100d2565b6100a6565b90565b90565b90610109610104610110926100d5565b6100f1565b82546100b7565b9055565b61011d906100a6565b9052565b919061013590600060208501940190610114565b565b61013f6101f3565b61014b60008201610061565b6101d65761015b60008201610099565b61017361016d60018060401b036100a6565b916100a6565b0361017c575b50565b61019090600060018060401b0391016100f4565b60018060401b036101cd7fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916101c461002c565b91829182610121565b0390a138610179565b600063f92ee8a960e01b8152806101ef6004820161006e565b0390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009056fe60806040526004361015610013575b6114dc565b61001e6000356102dd565b806306fdde03146102d857806307a2d13a146102d3578063095ea7b3146102ce5780630962ef79146102c95780630a28a477146102c457806318160ddd146102bf57806323b872dd146102ba578063313ce567146102b5578063375b3c0a146102b05780633a46b1a8146102ab5780633f2a5540146102a65780633fd8b02f146102a15780634bf5d7e91461029c578063587cde1e146102975780635c19a95c146102925780636fcfff451461028d57806370a0823114610288578063715018a61461028357806372f702f31461027e578063779972da146102795780637ecebe0014610274578063834f587a1461026f57806384b0196e1461026a5780638c80fd90146102655780638da5cb5b146102605780638e539e8c1461025b57806391ddadf41461025657806395d89b4114610251578063976525271461024c5780639ab24eb014610247578063a2bc66be14610242578063a694fc3a1461023d578063a6b63eb814610238578063a9059cbb14610233578063c3cda5201461022e578063c6e6f59214610229578063c745220a14610224578063ce96cb771461021f578063d1f5c33b1461021a578063d5a44f8614610215578063d8fb933714610210578063dd62ed3e1461020b578063f1127ed8146102065763f2fde38b0361000e576114a9565b611473565b61138a565b611327565b6112bd565b6111c9565b611194565b61115f565b611111565b6110d7565b61100f565b610fd8565b610f4c565b610f16565b610ea6565b610e71565b610dd2565b610d9d565b610d3a565b610d05565b610cd2565b610c96565b610b3e565b610ab7565b610a84565b610a4f565b6109ae565b610979565b610944565b6108e5565b6108aa565b610833565b6107fe565b6107b9565b6106e8565b6106b3565b610641565b6105fd565b61058d565b610558565b610523565b6104ed565b610427565b610389565b60e01c90565b60405190565b600080fd5b600080fd5b60009103126102fe57565b6102ee565b5190565b60209181520190565b60005b838110610324575050906000910152565b806020918301518185015201610313565b601f801991011690565b61035e61036760209361036c9361035581610303565b93848093610307565b95869101610310565b610335565b0190565b610386916020820191600081840391015261033f565b90565b346103b9576103993660046102f3565b6103b56103a4611643565b6103ac6102e3565b91829182610370565b0390f35b6102e9565b90565b6103ca816103be565b036103d157565b600080fd5b905035906103e3826103c1565b565b906020828203126103ff576103fc916000016103d6565b90565b6102ee565b61040d906103be565b9052565b919061042590600060208501940190610404565b565b346104575761045361044261043d3660046103e5565b6116c1565b61044a6102e3565b91829182610411565b0390f35b6102e9565b60018060a01b031690565b6104709061045c565b90565b61047c81610467565b0361048357565b600080fd5b9050359061049582610473565b565b91906040838203126104c057806104b46104bd9260008601610488565b936020016103d6565b90565b6102ee565b151590565b6104d3906104c5565b9052565b91906104eb906000602085019401906104ca565b565b3461051e5761051a610509610503366004610497565b90611712565b6105116102e3565b918291826104d7565b0390f35b6102e9565b346105535761054f61053e6105393660046103e5565b611930565b6105466102e3565b91829182610411565b0390f35b6102e9565b346105885761058461057361056e3660046103e5565b611944565b61057b6102e3565b91829182610411565b0390f35b6102e9565b346105bd5761059d3660046102f3565b6105b96105a8611990565b6105b06102e3565b91829182610411565b0390f35b6102e9565b90916060828403126105f8576105f56105de8460008501610488565b936105ec8160208601610488565b936040016103d6565b90565b6102ee565b346106135761060d3660046105c2565b916119af565b6102e9565b60ff1690565b61062790610618565b9052565b919061063f9060006020850194019061061e565b565b34610671576106513660046102f3565b61066d61065c6119f9565b6106646102e3565b9182918261062b565b0390f35b6102e9565b1c90565b90565b61068d9060086106929302610676565b61067a565b90565b906106a0915461067d565b90565b6106b06003600090610695565b90565b346106e3576106c33660046102f3565b6106df6106ce6106a3565b6106d66102e3565b91829182610411565b0390f35b6102e9565b34610719576107156107046106fe366004610497565b90611a86565b61070c6102e3565b91829182610411565b0390f35b6102e9565b60018060a01b031690565b61073990600861073e9302610676565b61071e565b90565b9061074c9154610729565b90565b61075c6001600090610741565b90565b90565b61077661077161077b9261045c565b61075f565b61045c565b90565b61078790610762565b90565b6107939061077e565b90565b61079f9061078a565b9052565b91906107b790600060208501940190610796565b565b346107e9576107c93660046102f3565b6107e56107d461074f565b6107dc6102e3565b918291826107a3565b0390f35b6102e9565b6107fb6002600090610695565b90565b3461082e5761080e3660046102f3565b61082a6108196107ee565b6108216102e3565b91829182610411565b0390f35b6102e9565b34610863576108433660046102f3565b61085f61084e611ba7565b6108566102e3565b91829182610370565b0390f35b6102e9565b906020828203126108825761087f91600001610488565b90565b6102ee565b61089090610467565b9052565b91906108a890600060208501940190610887565b565b346108da576108d66108c56108c0366004610868565b611c47565b6108cd6102e3565b91829182610894565b0390f35b6102e9565b60000190565b34610913576108fd6108f8366004610868565b611c6f565b6109056102e3565b8061090f816108df565b0390f35b6102e9565b63ffffffff1690565b61092a90610918565b9052565b919061094290600060208501940190610921565b565b346109745761097061095f61095a366004610868565b611c87565b6109676102e3565b9182918261092e565b0390f35b6102e9565b346109a9576109a561099461098f366004610868565b611c9c565b61099c6102e3565b91829182610411565b0390f35b6102e9565b346109dc576109be3660046102f3565b6109c6611d12565b6109ce6102e3565b806109d8816108df565b0390f35b6102e9565b60018060a01b031690565b6109fc906008610a019302610676565b6109e1565b90565b90610a0f91546109ec565b90565b610a1d600080610a04565b90565b610a299061077e565b90565b610a3590610a20565b9052565b9190610a4d90600060208501940190610a2c565b565b34610a7f57610a5f3660046102f3565b610a7b610a6a610a12565b610a726102e3565b91829182610a39565b0390f35b6102e9565b34610ab257610a9c610a973660046103e5565b611dbc565b610aa46102e3565b80610aae816108df565b0390f35b6102e9565b34610ae757610ae3610ad2610acd366004610868565b611dc7565b610ada6102e3565b91829182610411565b0390f35b6102e9565b610af5816104c5565b03610afc57565b600080fd5b90503590610b0e82610aec565b565b9190604083820312610b395780610b2d610b369260008601610488565b93602001610b01565b90565b6102ee565b34610b6d57610b57610b51366004610b10565b90611ea1565b610b5f6102e3565b80610b69816108df565b0390f35b6102e9565b60ff60f81b1690565b610b8490610b72565b9052565b90565b610b9490610b88565b9052565b5190565b60209181520190565b60200190565b610bb4906103be565b9052565b90610bc581602093610bab565b0190565b60200190565b90610bec610be6610bdf84610b98565b8093610b9c565b92610ba5565b9060005b818110610bfd5750505090565b909192610c16610c106001928651610bb8565b94610bc9565b9101919091610bf0565b93959194610c72610c67610c8695610c59610c7c95610c939c9a610c4c60e08c019260008d0190610b7b565b8a820360208c015261033f565b9088820360408a015261033f565b976060870190610404565b6080850190610887565b60a0830190610b8b565b60c0818403910152610bcf565b90565b34610ccd57610ca63660046102f3565b610cc9610cb1611ff4565b93610cc09795979391936102e3565b97889788610c20565b0390f35b6102e9565b34610d0057610cea610ce53660046103e5565b61213f565b610cf26102e3565b80610cfc816108df565b0390f35b6102e9565b34610d3557610d153660046102f3565b610d31610d2061214a565b610d286102e3565b91829182610894565b0390f35b6102e9565b34610d6a57610d66610d55610d503660046103e5565b612169565b610d5d6102e3565b91829182610411565b0390f35b6102e9565b65ffffffffffff1690565b610d8390610d6f565b9052565b9190610d9b90600060208501940190610d7a565b565b34610dcd57610dad3660046102f3565b610dc9610db86121eb565b610dc06102e3565b91829182610d87565b0390f35b6102e9565b34610e0257610de23660046102f3565b610dfe610ded6121ff565b610df56102e3565b91829182610370565b0390f35b6102e9565b610e109061077e565b90565b90610e1d90610e07565b600052602052604060002090565b60ff1690565b610e41906008610e469302610676565b610e2b565b90565b90610e549154610e31565b90565b610e6e90610e69600791600092610e13565b610e49565b90565b34610ea157610e9d610e8c610e87366004610868565b610e57565b610e946102e3565b918291826104d7565b0390f35b6102e9565b34610ed657610ed2610ec1610ebc366004610868565b61221e565b610ec96102e3565b91829182610411565b0390f35b6102e9565b9091606082840312610f1157610f0e610ef78460008501610488565b93610f0581602086016103d6565b936040016103d6565b90565b6102ee565b34610f4757610f43610f32610f2c366004610edb565b916124cd565b610f3a6102e3565b91829182610411565b0390f35b6102e9565b34610f7c57610f78610f67610f623660046103e5565b612a6c565b610f6f6102e3565b91829182610411565b0390f35b6102e9565b919060a083820312610fd357610f9a8160008501610488565b92610fa88260208301610488565b92610fd0610fb98460408501610488565b93610fc781606086016103d6565b936080016103d6565b90565b6102ee565b3461100a57610ff4610feb366004610f81565b93929092612f02565b610ffc6102e3565b80611006816108df565b0390f35b6102e9565b346110255761101f366004610497565b90612f11565b6102e9565b61103381610618565b0361103a57565b600080fd5b9050359061104c8261102a565b565b61105781610b88565b0361105e57565b600080fd5b905035906110708261104e565b565b909160c0828403126110d25761108b8360008401610488565b9261109981602085016103d6565b926110a782604083016103d6565b926110cf6110b8846060850161103f565b936110c68160808601611063565b9360a001611063565b90565b6102ee565b3461110c576110f66110ea366004611072565b94939093929192612fa4565b6110fe6102e3565b80611108816108df565b0390f35b6102e9565b346111415761113d61112c6111273660046103e5565b613057565b6111346102e3565b91829182610411565b0390f35b6102e9565b61115c9160208201916000818403910152610bcf565b90565b3461118f5761118b61117a611175366004610868565b6130a3565b6111826102e3565b91829182611146565b0390f35b6102e9565b346111c4576111c06111af6111aa366004610868565b6130ca565b6111b76102e3565b91829182610411565b0390f35b6102e9565b346111f7576111e16111dc366004610868565b61319c565b6111e96102e3565b806111f3816108df565b0390f35b6102e9565b61121061120b611215926103be565b61075f565b6103be565b90565b90611222906111fc565b600052602052604060002090565b60001c90565b61124261124791611230565b61067a565b90565b6112549054611236565b90565b611262906005611218565b61126e6000820161124a565b9161128760026112806001850161124a565b930161124a565b90565b6040906112b46112bb94969593966112aa60608401986000850190610404565b6020830190610404565b0190610404565b565b346112f0576112ec6112d86112d33660046103e5565b611257565b6112e39391936102e3565b9384938461128a565b0390f35b6102e9565b906112ff90610e07565b600052602052604060002090565b6113249061131f6008916000926112f5565b610695565b90565b346113575761135361134261133d366004610868565b61130d565b61134a6102e3565b91829182610411565b0390f35b6102e9565b919060408382031261138557806113796113829260008601610488565b93602001610488565b90565b6102ee565b346113bb576113b76113a66113a036600461135c565b906131bf565b6113ae6102e3565b91829182610411565b0390f35b6102e9565b6113c981610918565b036113d057565b600080fd5b905035906113e2826113c0565b565b919060408382031261140d578061140161140a9260008601610488565b936020016113d5565b90565b6102ee565b61141b90610d6f565b9052565b60018060d01b031690565b6114339061141f565b9052565b9060208061145b9361145160008201516000860190611412565b015191019061142a565b565b919061147190600060408501940190611437565b565b346114a4576114a061148f6114893660046113e4565b90613238565b6114976102e3565b9182918261145d565b0390f35b6102e9565b346114d7576114c16114bc366004610868565b6132b6565b6114c96102e3565b806114d3816108df565b0390f35b6102e9565b600080fd5b606090565b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561151c575b602083101461151757565b6114e6565b91607f169161150c565b60209181520190565b600052602060002090565b906000929180549061155561154e836114fc565b8094611526565b916001811690816000146115ae5750600114611571575b505050565b61157e919293945061152f565b916000925b818410611596575050019038808061156c565b60018160209295939554848601520191019290611583565b92949550505060ff191682521515602002019038808061156c565b906115d39161153a565b90565b634e487b7160e01b600052604160045260246000fd5b906115f690610335565b810190811067ffffffffffffffff82111761161057604052565b6115d6565b9061163561162e926116256102e3565b938480926115c9565b03836115ec565b565b61164090611615565b90565b61164b6114e1565b5061165f60036116596132c1565b01611637565b90565b600090565b90565b61167e61167961168392611667565b61075f565b6103be565b90565b634e487b7160e01b600052601160045260246000fd5b6116ab6116b1919392936103be565b926103be565b82018092116116bc57565b611686565b61170a906116cd611662565b506116e96116d96132e5565b6116e3600161166a565b9061169c565b6117046116f4611990565b6116fe600161166a565b9061169c565b91613381565b90565b600090565b61172f9161171e61170d565b506117276133a5565b9190916133b2565b600190565b61174061174591611230565b61071e565b90565b6117529054611734565b90565b60e01b90565b90505190611768826103c1565b565b90602082820312611784576117819160000161175b565b90565b6102ee565b6117916102e3565b3d6000823e3d90fd5b906117c99160206117b36117ae6001611748565b61078a565b6370bb45b3906117c16102e3565b958692611755565b8252816000816117db600482016108df565b03925af1928315611824576117f5936117f8575b5061188d565b90565b6118189060203d811161181d575b61181081836115ec565b81019061176a565b6117ef565b503d611806565b611789565b90565b61184061183b61184592611829565b61075f565b6103be565b90565b1561184f57565b60006373380d9960e01b815280611868600482016108df565b0390fd5b61187861187d91611230565b6109e1565b90565b61188a905461186c565b90565b919091506118a5339261189f846130ca565b906133c2565b916118c3836118bd6118b7600061182c565b916103be565b11611848565b6118d56118cf84611944565b82613411565b6118ea6118e26000611880565b8285916134f8565b829061192b6119197ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe92610e07565b926119226102e3565b91829182610411565b0390a2565b6119419061193c611662565b61179a565b90565b61198d90611950611662565b5061196c61195c611990565b611966600161166a565b9061169c565b6119876119776132e5565b611981600161166a565b9061169c565b91613546565b90565b611998611662565b506119ac60026119a66132c1565b0161124a565b90565b6119b761170d565b50600063a24e573d60e01b8152806119d1600482016108df565b0390fd5b600090565b90565b6119f16119ec6119f6926119da565b61075f565b610618565b90565b611a016119d5565b50611a0c60126119dd565b90565b611a23611a1e611a2892610d6f565b61075f565b6103be565b90565b916020611a4d929493611a4660408201966000830190610404565b0190610d7a565b565b90611a5990610e07565b600052602052604060002090565b90565b611a7e611a79611a839261141f565b61075f565b6103be565b90565b611a8e611662565b50611a97613576565b611a9f6121eb565b83611ab2611aac83611a0f565b916103be565b1015611aec575091611ade611ad8611ad3611ae4946001611ae99701611a4f565b611a67565b91613606565b906136ff565b611a6a565b90565b83611b086000928392637669fc0f60e11b845260048401611a2b565b0390fd5b90611b1f611b186102e3565b92836115ec565b565b67ffffffffffffffff8111611b3f57611b3b602091610335565b0190565b6115d6565b90611b56611b5183611b21565b611b0c565b918252565b60007f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000910152565b611b8d601d611b44565b90611b9a60208301611b5b565b565b611ba4611b83565b90565b611baf6114e1565b50611bb86121eb565b611bd1611bcb611bc661382f565b610d6f565b91610d6f565b03611be157611bde611b9c565b90565b60006301bfc1c560e61b815280611bfa600482016108df565b0390fd5b600090565b90611c0d90610e07565b600052602052604060002090565b60018060a01b031690565b611c32611c3791611230565b611c1b565b90565b611c449054611c26565b90565b611c67611c6c91611c56611bfe565b506000611c61613576565b01611c03565b611c3a565b90565b611c8090611c7b6133a5565b613867565b565b600090565b611c9990611c93611c82565b506138fd565b90565b611cbc611cc191611cab611662565b506000611cb66132c1565b016112f5565b61124a565b90565b611ccc613935565b611cd4611cfe565b565b611cea611ce5611cef92611829565b61075f565b61045c565b90565b611cfb90611cd6565b90565b611d10611d0b6000611cf2565b613984565b565b611d1a611cc4565b565b611d2d90611d28613935565b611d6f565b565b60001b90565b90611d4260001991611d2f565b9181191691161790565b90565b90611d64611d5f611d6b926111fc565b611d4c565b8254611d35565b9055565b611d7a816002611d4f565b611da47fdb58c3448fa6dc4b2401b39b9ef3a0c9de44312a88055379c5f3bfe435781cc0916111fc565b90611dad6102e3565b80611db7816108df565b0390a2565b611dc590611d1c565b565b611de7611dec91611dd6611662565b506000611de16139f2565b016112f5565b61124a565b90565b90611e0191611dfc613935565b611e48565b565b90611e0f60ff91611d2f565b9181191691161790565b611e22906104c5565b90565b90565b90611e3d611e38611e4492611e19565b611e25565b8254611e03565b9055565b611e5d82611e5860078490610e13565b611e28565b611e9c611e8a7fc17077e55d3a8256fc9c13b798e2591ea1c9abc264b62c296034beba67b6d70092610e07565b92611e936102e3565b918291826104d7565b0390a2565b90611eab91611def565b565b600090565b600090565b606090565b90565b611ecb611ed091611230565b611ebc565b90565b611edd9054611ebf565b90565b611ef4611eef611ef992611829565b611d2f565b610b88565b90565b60007f4549503731323a20556e696e697469616c697a65640000000000000000000000910152565b611f316015602092610307565b611f3a81611efc565b0190565b611f549060208101906000818303910152611f24565b90565b15611f5e57565b611f666102e3565b62461bcd60e51b815280611f7c60048201611f3e565b0390fd5b611f899061077e565b90565b67ffffffffffffffff8111611fa45760208091020190565b6115d6565b90611fbb611fb683611f8c565b611b0c565b918252565b369037565b90611fea611fd283611fa9565b92602080611fe08693611f8c565b9201910390611fc0565b565b600f60f81b90565b611ffc611ead565b506120056114e1565b5061200e6114e1565b50612017611662565b50612020611bfe565b50612029611eb2565b50612032611eb7565b5061206b61203e613a16565b61204a60008201611ed3565b61205d6120576000611ee0565b91610b88565b1490816120b8575b50611f57565b612073613a3a565b9061207c613a59565b90469061208830611f80565b906120936000611ee0565b906120a66120a1600061182c565b611fc5565b906120af611fec565b96959493929190565b6120c59150600101611ed3565b6120d86120d26000611ee0565b91610b88565b1438612065565b6120f0906120eb613935565b6120f2565b565b6120fd816003611d4f565b6121277f47f1aa8f654e61a37d9cf2f8122235dcfeccbb3c45f09b2036e6ddba8ac0e0ab916111fc565b906121306102e3565b8061213a816108df565b0390a2565b612148906120df565b565b612152611bfe565b506121666000612160613a78565b01611c3a565b90565b612171611662565b5061217a613576565b6121826121eb565b8261219561218f83611a0f565b916103be565b10156121c657506121c3916121b86121b260026121be9401611a67565b91613606565b906136ff565b611a6a565b90565b826121e26000928392637669fc0f60e11b845260048401611a2b565b0390fd5b600090565b6121f36121e6565b506121fc61382f565b90565b6122076114e1565b5061221b60046122156132c1565b01611637565b90565b61224e61224961224461225393612233611662565b50600161223e613576565b01611a4f565b611a67565b613a9c565b611a6a565b90565b9061226090610e07565b600052602052604060002090565b90565b1561227857565b600063221b60b760e21b815280612291600482016108df565b0390fd5b9061229f906103be565b9052565b6122ad6060611b0c565b90565b906123016122f860026122c16122a3565b946122da6122d16000830161124a565b60008801612295565b6122f26122e96001830161124a565b60208801612295565b0161124a565b60408401612295565b565b61230c906122b0565b90565b61231990516103be565b90565b1561232357565b6000630861c86560e01b81528061233c600482016108df565b0390fd5b61234c61235191611230565b610e2b565b90565b61235e9054612340565b90565b1561236857565b6000635b6aa88560e01b815280612381600482016108df565b0390fd5b1561238c57565b6000637664524d60e11b8152806123a5600482016108df565b0390fd5b156123b057565b600063828aa81160e01b8152806123c9600482016108df565b0390fd5b6123dc6123e2919392936103be565b926103be565b82039182116123ed57565b611686565b1b90565b9190600861241291029161240c600019846123f2565b926123f2565b9181191691161790565b919061243261242d61243a936111fc565b611d4c565b9083546123f6565b9055565b6124509161244a611662565b9161241c565b565b60006002612479926124668380830161243e565b612473836001830161243e565b0161243e565b565b634e487b7160e01b600052600060045260246000fd5b906000036124a4576124a290612452565b565b61247b565b9160206124cb9294936124c460408201966000830190610404565b0190610404565b565b9291926124d8611662565b506124ff6124fa6124f36124ee60068590612256565b61226e565b8490613b35565b612271565b61255161251661251160058590611218565b612303565b9461253f6125266000880161230f565b612539612533600061182c565b916103be565b1161231c565b61254b6000870161230f565b906133c2565b9361256661256160078490610e13565b612354565b6000146127695761260d612626916125903361258a61258487610467565b91610467565b14612385565b61259c6040820161230f565b6125b76125b16125ac600261124a565b6103be565b916103be565b11600014612755576125fa6125cc600261124a565b5b6125f46125ee6125e942936125e46020880161230f565b61169c565b6103be565b916103be565b116123a9565b612607600085920161230f565b90613b84565b61261f612619876103be565b916103be565b1015612361565b5b61263084611944565b9161263c828490613411565b61266785612661600061265160058690611218565b019161265c8361124a565b6123cd565b90611d4f565b61268f8561268961267a600886906112f5565b916126848361124a565b6123cd565b90611d4f565b6126a660006126a060058490611218565b0161124a565b6126b96126b3600061182c565b916103be565b1461271b575b506126d56126cd6000611880565b8286916134f8565b83916127017f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e92610e07565b9261271661270d6102e3565b928392836124a9565b0390a2565b61274e90612735600061273060058490611218565b612491565b61274961274460068590612256565b61226e565b613c48565b50386126bf565b6125fa6127646040830161230f565b6125cd565b5061279761277e61277983611c9c565b6116c1565b61279061278a876103be565b916103be565b1015612361565b612627565b906127c2916127bd6127b86127b360073390610e13565b612354565b612385565b6127c5565b90565b906127f49160206127de6127d96001611748565b61078a565b6370bb45b3906127ec6102e3565b958692611755565b825281600081612806600482016108df565b03925af192831561284f5761282093612823575b506128c5565b90565b6128439060203d8111612848575b61283b81836115ec565b81019061176a565b61281a565b503d612831565b611789565b1561285b57565b6000631f2a200560e01b815280612874600482016108df565b0390fd5b1561287f57565b6000630419bcb760e51b815280612898600482016108df565b0390fd5b6128a5906103be565b60001981146128b45760010190565b611686565b6128c29061077e565b90565b919091506128e6826128e06128da600061182c565b916103be565b11612854565b33916128fc6128f760068590612256565b61226e565b9261290684613c73565b612919612913600061182c565b916103be565b14612a41575b61294782612941612932600885906112f5565b9161293c8361124a565b61169c565b90611d4f565b61295a8161295484613057565b90613c93565b6129d3612967600461124a565b61297a6129738261289c565b6004611d4f565b9461299384600061298d60058a90611218565b01611d4f565b6129ab4260016129a560058a90611218565b01611d4f565b6129cc6129b8600261124a565b60026129c660058a90611218565b01611d4f565b8590613cf5565b506129f36129e16000611880565b826129eb306128b9565b908592613da4565b6129fd600261124a565b612a277f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9092610e07565b92612a3c612a336102e3565b928392836124a9565b0390a2565b612a6782612a60612a5a612a55600361124a565b6103be565b916103be565b1015612878565b61291f565b612a7d90612a78611662565b61279c565b90565b60401c90565b612a92612a9791612a80565b610e2b565b90565b612aa49054612a86565b90565b67ffffffffffffffff1690565b612ac0612ac591611230565b612aa7565b90565b612ad29054612ab4565b90565b67ffffffffffffffff1690565b612af6612af1612afb92611829565b61075f565b612ad5565b90565b612b12612b0d612b1792611667565b61075f565b612ad5565b90565b612b239061077e565b90565b90612b3967ffffffffffffffff91611d2f565b9181191691161790565b612b57612b52612b5c92612ad5565b61075f565b612ad5565b90565b90565b90612b77612b72612b7e92612b43565b612b5f565b8254612b26565b9055565b60401b90565b90612b9760ff60401b91612b82565b9181191691161790565b90612bb6612bb1612bbd92611e19565b611e25565b8254612b88565b9055565b612bca90612afe565b9052565b9190612be290600060208501940190612bc1565b565b91939092612bf0613e00565b94612c06612c0060008801612a9a565b156104c5565b94612c1360008801612ac8565b80612c27612c216000612ae2565b91612ad5565b1480612d46575b90612c42612c3c6001612afe565b91612ad5565b1480612d1d575b612c549091156104c5565b9081612d0c575b50612cef57612c8594612c7a612c716001612afe565b60008a01612b62565b86612cdc575b612e8e565b612c8d575b50565b612c9b906000809101612ba1565b6001612cd37fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d291612cca6102e3565b91829182612bce565b0390a138612c8a565b612cea600160008a01612ba1565b612c80565b600063f92ee8a960e01b815280612d08600482016108df565b0390fd5b612d179150156104c5565b38612c5b565b50612c54612d2a30612b1a565b3b612d3e612d38600061182c565b916103be565b149050612c49565b5086612c2e565b60007f5374616b65642053485500000000000000000000000000000000000000000000910152565b612d7f600a611b44565b90612d8c60208301612d4d565b565b612d96612d75565b90565b60007f7353485500000000000000000000000000000000000000000000000000000000910152565b612dcb6004611b44565b90612dd860208301612d99565b565b612de2612dc1565b90565b612dee90610762565b90565b612dfa90612de5565b90565b90612e0e60018060a01b0391611d2f565b9181191691161790565b612e2190612de5565b90565b90565b90612e3c612e37612e4392612e18565b612e24565b8254612dfd565b9055565b612e5090610762565b90565b612e5c90612e47565b90565b612e6890612e47565b90565b90565b90612e83612e7e612e8a92612e5f565b612e6b565b8254612dfd565b9055565b612ed7612ee593612ed2612ecb612eec989795612ec6612ede96612ec1612eb3612d8e565b612ebb612dda565b90613e44565b613984565b612df1565b6000612e27565b612e53565b6001612e6e565b6002611d4f565b6003611d4f565b612f00612ef9600161166a565b6004611d4f565b565b90612f0f94939291612be4565b565b612f1961170d565b50600063a24e573d60e01b815280612f33600482016108df565b0390fd5b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf90565b612f91612f9894612f87606094989795612f7d608086019a6000870190610b8b565b6020850190610887565b6040830190610404565b0190610404565b565b60200190565b5190565b9395949092919542612fbe612fb8896103be565b916103be565b11613037579161302991613030936130206130359899613008612fdf612f37565b612ff98b938b612fed6102e3565b95869460208601612f5b565b602082018103825203826115ec565b61301a61301482612fa0565b91612f9a565b20613e50565b92909192613e6d565b9182613eb8565b613867565b565b613053876000918291632341d78760e11b835260048301610411565b0390fd5b6130a090613063611662565b5061307f61306f611990565b613079600161166a565b9061169c565b61309a61308a6132e5565b613094600161166a565b9061169c565b91613381565b90565b6130c26130bd6130c7926130b5611eb7565b506006612256565b61226e565b613efc565b90565b6130e7906130d6611662565b506130e1600061182c565b90613b84565b90565b6130fb906130f6613935565b613121565b565b1561310457565b6000639fabe1c160e01b81528061311d600482016108df565b0390fd5b6131478161314061313a6131356000611cf2565b610467565b91610467565b14156130fd565b61315a61315382612e53565b6001612e6e565b6131847f058fa9577dc29aece41d41c2d3bff2ed4e8d5085762198e8f7faab35039555da91610e07565b9061318d6102e3565b80613197816108df565b0390a2565b6131a5906130ea565b565b906131b190610e07565b600052602052604060002090565b6131ed916131e36131e8926131d2611662565b5060016131dd6132c1565b016131a7565b6112f5565b61124a565b90565b6131fa6040611b0c565b90565b600090565b600090565b61320f6131f0565b906020808361321c6131fd565b815201613227613202565b81525050565b613235613207565b90565b9061324b9161324561322d565b50613f25565b90565b61325f9061325a613935565b613261565b565b8061327d6132776132726000611cf2565b610467565b91610467565b1461328d5761328b90613984565b565b6132b261329a6000611cf2565b6000918291631e4fbdf760e01b835260048301610894565b0390fd5b6132bf9061324e565b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0090565b6132ed611662565b5061333760206133056133006000611880565b610a20565b6370a082319061332c613317306128b9565b926133206102e3565b95869485938493611755565b835260048301610894565b03915afa90811561337c5760009161334e575b5090565b61336f915060203d8111613375575b61336781836115ec565b81019061176a565b3861334a565b503d61335d565b611789565b613389611662565b50816000190481118202158302156133a057020490565b600080fd5b6133ad611bfe565b503390565b916133c09291600192613f56565b565b6133ca611662565b50806133df6133d9600061182c565b916103be565b146000146133ec5750905b565b9061340b906134046133fe84926103be565b916103be565b1115612361565b906133ea565b908161342e6134286134236000611cf2565b610467565b91610467565b1461344b5761344991906134426000611cf2565b9091614076565b565b6134706134586000611cf2565b6000918291634b637e8f60e11b835260048301610894565b0390fd5b60007f5452414e534645525f4641494c45440000000000000000000000000000000000910152565b6134a9600f602092610307565b6134b281613474565b0190565b6134cc906020810190600081830391015261349c565b90565b156134d657565b6134de6102e3565b62461bcd60e51b8152806134f4600482016134b6565b0390fd5b6044602092600080936135449661350d61170d565b506040519363a9059cbb60e01b855260018060a01b0316600485015260248401525af13d15601f3d116001600051141617166134cf565b565b9161354f611662565b5081600019048311820215810215613571578181600093850204930206110190565b600080fd5b7fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d0090565b90565b6135b16135ac6135b69261359a565b61075f565b610618565b90565b6135c29061359d565b9052565b9160206135e89294936135e1604082019660008301906135b9565b0190610404565b565b6135fe6135f9613603926103be565b61075f565b610d6f565b90565b61360e6121e6565b508061362861362265ffffffffffff611a0f565b916103be565b1161363957613636906135ea565b90565b603061365660009283926306dfcc6560e41b8452600484016135c6565b0390fd5b600090565b5490565b90565b61367a61367561367f92613663565b61075f565b6103be565b90565b90565b65ffffffffffff1690565b61369c6136a191611230565b613685565b90565b6136ae9054613690565b90565b60301c90565b60018060d01b031690565b6136ce6136d3916136b1565b6136b7565b90565b6136e090546136c2565b90565b6136f76136f26136fc92611829565b61075f565b61141f565b90565b906137569061370c61365a565b506137196000840161365f565b613723600061182c565b9080806137396137336005613666565b916103be565b116137bb575b50906137516000860193919293613682565b614345565b8061376a613764600061182c565b916103be565b1460001461378257505061377e60006136e3565b5b90565b6137b06000916137ab6137a5846137b696019261379f600161166a565b906123cd565b91613682565b614339565b016136d6565b61377f565b806137c96137cf92916141b8565b906123cd565b90836138026137fc6137f760006137f1818c016137ec8991613682565b614339565b016136a4565b610d6f565b91610d6f565b106000146138145750905b903861373f565b915061382a90613824600161166a565b9061169c565b61380d565b6138376121e6565b5061384143613606565b90565b90565b9061385c61385761386392610e07565b613844565b8254612dfd565b9055565b906138fb916138f5613877613576565b61389861388384611c47565b9161389360008792018690611c03565b613847565b828185906138d86138d26138cc7f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f95610e07565b92610e07565b92610e07565b926138e16102e3565b806138eb816108df565b0390a492916143d6565b916143ee565b565b61392d61392861392361393293613912611c82565b50600161391d613576565b01611a4f565b611a67565b6145ad565b61464d565b90565b61393d61214a565b61395661395061394b6133a5565b610467565b91610467565b0361395d57565b6139806139686133a5565b600091829163118cdaa760e01b835260048301610894565b0390fd5b61398c613a78565b6139a661399b60008301611c3a565b916000849101613847565b906139da6139d47f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610e07565b91610e07565b916139e36102e3565b806139ed816108df565b0390a3565b7f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb0090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b613a426114e1565b50613a566002613a50613a16565b01611637565b90565b613a616114e1565b50613a756003613a6f613a16565b01611637565b90565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b613aa461365a565b50613ab16000820161365f565b80613ac5613abf600061182c565b916103be565b14600014613add575050613ad960006136e3565b5b90565b613b0b600091613b06613b0084613b11960192613afa600161166a565b906123cd565b91613682565b614339565b016136d6565b613ada565b613b2a613b25613b2f926103be565b611d2f565b610b88565b90565b90565b90613b58613b526000613b5d94613b4a61170d565b500192613b16565b91613b32565b6146c3565b90565b15613b6757565b60006360956a6560e01b815280613b80600482016108df565b0390fd5b90613bd890613b91611662565b50613bd3613bce613bc6613ba486611c9c565b613bc181613bbb613bb5600061182c565b916103be565b11613b60565b6116c1565b9460086112f5565b61124a565b6123cd565b80613bf4613bee613be9600361124a565b6103be565b916103be565b1015600014613c38575b80613c11613c0b846103be565b916103be565b1015600014613c2a575050613c26600061182c565b5b90565b613c33916123cd565b613c27565b50613c43600361124a565b613bfe565b90613c6b613c656000613c7094613c5d61170d565b500192613b16565b91613b32565b61482f565b90565b613c8b6000613c9092613c84611662565b5001613b32565b614939565b90565b80613caf613ca9613ca46000611cf2565b610467565b91610467565b14613ccc57613cca91613cc26000611cf2565b919091614076565b565b613cf1613cd96000611cf2565b600091829163ec442f0560e01b835260048301610894565b0390fd5b90613d18613d126000613d1d94613d0a61170d565b500192613b16565b91613b32565b614981565b90565b60007f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000910152565b613d556014602092610307565b613d5e81613d20565b0190565b613d789060208101906000818303910152613d48565b90565b15613d8257565b613d8a6102e3565b62461bcd60e51b815280613da060048201613d62565b0390fd5b60009182606492613dfe96602096613dba61170d565b50604051946323b872dd60e01b865260018060a01b0316600486015260018060a01b0316602485015260448401525af13d15601f3d11600160005114161716613d7b565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0090565b90613e3691613e316149e8565b613e38565b565b90613e4291614bda565b565b90613e4e91613e24565b565b613e6a90613e5c611eb2565b50613e65614be6565b614bfa565b90565b92613e8892613e9194613e7e611bfe565b5092909192614cb2565b90929192614df3565b90565b916020613eb6929493613eaf60408201966000830190610887565b0190610404565b565b613ec181614eda565b91613ed4613ece846103be565b916103be565b03613edd575050565b613ef860009283926301d4b62360e61b845260048401613e94565b0390fd5b613f146000613f1992613f0d611eb7565b5001613b32565b614fe8565b613f21611eb7565b5090565b90613f4e613f49613f5393613f3861322d565b506001613f43613576565b01611a4f565b611a67565b615095565b90565b9092613f606132c1565b82613f7c613f76613f716000611cf2565b610467565b91610467565b1461404d5784613f9d613f97613f926000611cf2565b610467565b91610467565b1461402457613fc490613fbf613fb8600187930186906131a7565b87906112f5565b611d4f565b613fce575b505050565b9190916140196140076140017f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593610e07565b93610e07565b936140106102e3565b91829182610411565b0390a3388080613fc9565b6140496140316000611cf2565b6000918291634a1406b160e11b835260048301610894565b0390fd5b61407261405a6000611cf2565b600091829163e602df0560e01b835260048301610894565b0390fd5b9291614084848383916150f8565b836140a061409a6140956000611cf2565b610467565b91610467565b146140b5575b6140b392939190916152a1565b565b6140bd611990565b936140c6615286565b94806140da6140d4886103be565b916103be565b116140e7575093506140a6565b85906141046000928392630e58ae9360e11b8452600484016124a9565b0390fd5b61411c61411761412192611667565b61075f565b610618565b90565b6141439061413d61413761414894610618565b916103be565b90610676565b6103be565b90565b61416a9061416461415e61416f946103be565b916103be565b906123f2565b6103be565b90565b634e487b7160e01b600052601260045260246000fd5b61419461419a916103be565b916103be565b9081156141a5570490565b614172565b906141b591016103be565b90565b6141c0611662565b50806141d56141cf600061182c565b916103be565b1461432b578061432261431b61430b6142fb6142eb6142db6142cb6142bb6142ab61429b61428b6143289c61428561427e61426e61425e61424e61423e60016142396142336142238a6154ec565b61422d6001614108565b90614124565b9161166a565b61414b565b6142488188614188565b906141aa565b6142586001614108565b90614124565b6142688186614188565b906141aa565b6142786001614108565b90614124565b8092614188565b906141aa565b6142956001614108565b90614124565b6142a5818c614188565b906141aa565b6142b56001614108565b90614124565b6142c5818a614188565b906141aa565b6142d56001614108565b90614124565b6142e58188614188565b906141aa565b6142f56001614108565b90614124565b6143058186614188565b906141aa565b6143156001614108565b90614124565b8092614188565b906157c5565b90565b50614336600061182c565b90565b60005260206000200190565b93919092614351611662565b505b81614366614360836103be565b916103be565b10156143ce57614377828290615818565b9061438e6000614388888590614339565b016136a4565b6143a061439a87610d6f565b91610d6f565b116000146143b15750915b91614353565b9291506143c8906143c2600161166a565b9061169c565b906143ab565b925050915090565b6143e8906143e2611662565b50611c9c565b90565b90565b90916143f8613576565b918061440c61440686610467565b91610467565b141580614592575b61441f575b50505050565b8061443b6144356144306000611cf2565b610467565b91610467565b03614500575b508261445e6144586144536000611cf2565b610467565b91610467565b0361446a575b80614419565b6144a66144b39161448260016144ad95018690611a4f565b906144a061449a6144946001936158f1565b93611a67565b916143eb565b90615945565b9290611a6a565b91611a6a565b9190916144e07fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72492610e07565b926144f56144ec6102e3565b928392836124a9565b0390a2388080614464565b61454161454761453a614517600187018590611a4f565b600261453461452e614528896158f1565b93611a67565b916143eb565b90615945565b9290611a6a565b91611a6a565b9190916145747fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72492610e07565b926145896145806102e3565b928392836124a9565b0390a238614441565b50816145a76145a1600061182c565b916103be565b11614414565b60006145c2916145bb611662565b500161365f565b90565b6145d96145d46145de92610918565b61075f565b6103be565b90565b90565b6145f86145f36145fd926145e1565b61075f565b610618565b90565b614609906145e4565b9052565b91602061462f92949361462860408201966000830190614600565b0190610404565b565b61464561464061464a926103be565b61075f565b610918565b90565b614655611c82565b508061466d61466763ffffffff6145c5565b916103be565b1161467e5761467b90614631565b90565b602061469b60009283926306dfcc6560e41b84526004840161460d565b0390fd5b6146a890610b88565b90565b906146b59061469f565b600052602052604060002090565b6146e19160016146dc926146d561170d565b50016146ab565b61124a565b6146f46146ee600061182c565b916103be565b141590565b5490565b634e487b7160e01b600052603260045260246000fd5b600052602060002090565b614727816146f9565b82101561474257614739600191614713565b91020190600090565b6146fd565b61475790600861475c9302610676565b611ebc565b90565b9061476a9154614747565b90565b61477690611230565b90565b919061478f61478a6147979361469f565b61476d565b9083546123f6565b9055565b90565b634e487b7160e01b600052603160045260246000fd5b5490565b600052602060002090565b6147cc816147b4565b8210156147e7576147de6001916147b8565b91020190600090565b6146fd565b6147fe916147f8611eb2565b91614779565b565b614809816147b4565b801561482a57600190039061482761482183836147c3565b906147ec565b55565b61479e565b61483761170d565b5061484e6148496001830184906146ab565b61124a565b908161486361485d600061182c565b916103be565b1415600014614931576148e39260016148de928461488c6000966148868561166a565b906123cd565b6148a961489a8885016146f9565b6148a38661166a565b906123cd565b816148bc6148b6836103be565b916103be565b036148e8575b5050506148d86148d386830161479b565b614800565b016146ab565b61243e565b600190565b6149299261491b614907614901614924948c890161471e565b9061475f565b9361491585918c890161471e565b90614779565b918585016146ab565b611d4f565b3880806148c2565b505050600090565b600061494e91614947611662565b50016146f9565b90565b90815491600160401b83101561497c578261497491600161497a950181556147c3565b90614779565b565b6115d6565b61498961170d565b5061499e6149988284906146c3565b156104c5565b6000146149e1576149d76149dc926149c26149bb6000850161479b565b8290614951565b60016149d0600085016146f9565b93016146ab565b611d4f565b600190565b5050600090565b6149f96149f36159c5565b156104c5565b6149ff57565b6000631afcd79f60e31b815280614a18600482016108df565b0390fd5b90614a2e91614a296149e8565b614bb6565b565b601f602091010490565b5b818110614a46575050565b80614a54600060019361243e565b01614a3b565b9190601f8111614a6a575b505050565b614a76614a9b9361152f565b906020614a8284614a30565b83019310614aa3575b614a9490614a30565b0190614a3a565b388080614a65565b9150614a9481929050614a8b565b90614ac29060001990600802610676565b191690565b81614ad191614ab1565b906002021790565b90614ae381610303565b9067ffffffffffffffff8211614ba557614b0782614b0185546114fc565b85614a5a565b602090601f8311600114614b3c57918091614b2b93600092614b30575b5050614ac7565b90555b565b90915001513880614b24565b601f19831691614b4b8561152f565b9260005b818110614b8d57509160029391856001969410614b73575b50505002019055614b2e565b614b83910151601f841690614ab1565b9055388080614b67565b91936020600181928787015181550195019201614b4f565b6115d6565b90614bb491614ad9565b565b6004614bd892614bd1614bc76132c1565b9360038501614baa565b9101614baa565b565b90614be491614a1c565b565b614bee611eb2565b50614bf7615a56565b90565b604291614c05611eb2565b50604051917f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201522090565b600090565b614c4c614c5191611230565b6111fc565b90565b90565b614c6b614c66614c7092614c54565b61075f565b6103be565b90565b614ca9614cb094614c9f606094989795614c95608086019a6000870190610b8b565b602085019061061e565b6040830190610b8b565b0190610b8b565b565b939293614cbd611bfe565b50614cc6614c3b565b50614ccf611eb2565b50614cd985614c40565b614d01614cfb6fa2a8918ca85bafe22016d0b997e4df60600160ff1b03614c57565b916103be565b11614d955790614d2560209495600094939293614d1c6102e3565b94859485614c73565b838052039060015afa15614d9057614d3e600051611d2f565b80614d5a614d54614d4f6000611cf2565b610467565b91610467565b14614d7257600091614d6c6000611ee0565b91929190565b50614d7d6000611cf2565b600191614d8a6000611ee0565b91929190565b611789565b505050614da26000611cf2565b9060039291929190565b634e487b7160e01b600052602160045260246000fd5b60041115614dcc57565b614dac565b90614ddb82614dc2565b565b9190614df190600060208501940190610b8b565b565b80614e07614e016000614dd1565b91614dd1565b14600014614e13575050565b80614e27614e216001614dd1565b91614dd1565b14600014614e4c57600063f645eedf60e01b815280614e48600482016108df565b0390fd5b80614e60614e5a6002614dd1565b91614dd1565b14600014614e9057614e8c614e7483614c40565b600091829163fce698f760e01b835260048301610411565b0390fd5b614ea3614e9d6003614dd1565b91614dd1565b14614eab5750565b614ec79060009182916335e2f38360e21b835260048301614ddd565b0390fd5b6001614ed791016103be565b90565b614ef790614ee6611662565b506000614ef16139f2565b016112f5565b614f13614f038261124a565b91614f0d83614ecb565b90611d4f565b90565b606090565b60209181520190565b614f2d90610b88565b9052565b90614f3e81602093614f24565b0190565b614f4c9054611ebf565b90565b60010190565b90614f72614f6c614f65846146f9565b8093614f1b565b92614713565b9060005b818110614f835750505090565b909192614fa3614f9d600192614f9887614f42565b614f31565b94614f4f565b9101919091614f76565b90614fb791614f55565b90565b90614fda614fd392614fca6102e3565b93848092614fad565b03836115ec565b565b614fe590614fba565b90565b6000614ffd91614ff6614f16565b5001614fdc565b90565b600052602060002090565b6150148161365f565b82101561502f57615026600191615000565b91020190600090565b6146fd565b9061503e90610d6f565b9052565b9061504c9061141f565b9052565b9061508761507e60006150616131f0565b946150786150708383016136a4565b838801615034565b016136d6565b60208401615042565b565b61509290615050565b90565b6150b49160006150ae926150a761322d565b500161500b565b50615089565b90565b6040906150e16150e894969593966150d760608401986000850190610887565b6020830190610404565b0190610404565b565b906150f591036103be565b90565b9190916151036132c1565b8161511f6151196151146000611cf2565b610467565b91610467565b1460001461520e5761514783615141600284019161513c8361124a565b61169c565b90611d4f565b5b8361516461515e6151596000611cf2565b610467565b91610467565b146000146151de5761518d906151876002859201916151828361124a565b6150ea565b90611d4f565b5b9190916151d96151c76151c17fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93610e07565b93610e07565b936151d06102e3565b91829182610411565b0390a3565b615209906152036151f4600086930187906112f5565b916151fe8361124a565b6141aa565b90611d4f565b61518e565b61522461521f6000830184906112f5565b61124a565b80615237615231866103be565b916103be565b106152625761524a61525d9185906150ea565b6152586000840185906112f5565b611d4f565b615148565b9161528291509192600093849363391434e360e21b8552600485016150b7565b0390fd5b61528e611662565b5061529e60018060d01b03611a6a565b90565b916153046152fe61530b946152b4613576565b816152d06152ca6152c56000611cf2565b610467565b91610467565b1461533d575b856152f26152ec6152e76000611cf2565b610467565b91610467565b1461530d575b50611c47565b92611c47565b90916143ee565b565b60026153379101600261533161532b615325896158f1565b93611a67565b916143eb565b90615945565b506152f8565b61536760028201600161536161535b6153558a6158f1565b93611a67565b916143eb565b90615945565b50506152d6565b90565b61538561538061538a9261536e565b61075f565b610618565b90565b6153a161539c6153a69261536e565b61075f565b6103be565b90565b90565b6153c06153bb6153c5926153a9565b61075f565b610618565b90565b6153dc6153d76153e1926153a9565b61075f565b6103be565b90565b6153f86153f36153fd926145e1565b61075f565b6103be565b90565b90565b61541761541261541c92615400565b61075f565b610618565b90565b61543361542e61543892615400565b61075f565b6103be565b90565b90565b61545261544d6154579261543b565b61075f565b610618565b90565b61546e6154696154739261543b565b61075f565b6103be565b90565b90565b61548d61548861549292615476565b61075f565b610618565b90565b6154a96154a46154ae92615476565b61075f565b6103be565b90565b90565b6154c86154c36154cd926154b1565b61075f565b610618565b90565b6154e46154df6154e9926154b1565b61075f565b6103be565b90565b6154f4611662565b5061564e615502600061182c565b91615517816155116080615371565b90614124565b61552a615524600061182c565b916103be565b11615797575b6155448161553e60406153ac565b90614124565b615557615551600061182c565b916103be565b11615769575b6155718161556b60206145e4565b90614124565b61558461557e600061182c565b916103be565b1161573b575b61559e816155986010615403565b90614124565b6155b16155ab600061182c565b916103be565b1161570d575b6155cb816155c5600861543e565b90614124565b6155de6155d8600061182c565b916103be565b116156df575b6155f8816155f26004615479565b90614124565b61560b615605600061182c565b916103be565b116156b1575b6156258161561f60026154b4565b90614124565b615638615632600061182c565b916103be565b11615683575b6156486001614108565b90614124565b61566161565b600061182c565b916103be565b1161566a575b90565b61567e90615678600161166a565b906141aa565b615667565b61569a6156ab9161569460026154b4565b90614124565b926156a560026154d0565b906141aa565b9161563e565b6156c86156d9916156c26004615479565b90614124565b926156d36004615495565b906141aa565b91615611565b6156f6615707916156f0600861543e565b90614124565b92615701600861545a565b906141aa565b916155e4565b6157246157359161571e6010615403565b90614124565b9261572f601061541f565b906141aa565b916155b7565b6157526157639161574c60206145e4565b90614124565b9261575d60206153e4565b906141aa565b9161558a565b6157806157919161577a60406153ac565b90614124565b9261578b60406153c8565b906141aa565b9161555d565b6157ae6157bf916157a86080615371565b90614124565b926157b9608061538d565b906141aa565b91615530565b906157ce611662565b50816157e26157dc836103be565b916103be565b106000146157ef57505b90565b90506157ec565b615802615808916103be565b916103be565b908115615813570490565b614172565b61583d61584392615827611662565b50828116921861583760026154d0565b906157f6565b9061169c565b90565b6158526158589161141f565b9161141f565b90039060018060d01b03821161586a57565b611686565b906158829161587c61365a565b50615846565b90565b90565b61589c6158976158a192615885565b61075f565b610618565b90565b6158ad90615888565b9052565b9160206158d39294936158cc604082019660008301906158a4565b0190610404565b565b6158e96158e46158ee926103be565b61075f565b61141f565b90565b6158f961365a565b508061591361590d60018060d01b03611a6a565b916103be565b1161592457615921906158d5565b90565b60d061594160009283926306dfcc6560e41b8452600484016158b1565b0390fd5b9061597b615981939261595661365a565b5061595f61365a565b50809361597461596d6121eb565b9492613a9c565b9091615f89565b91615ac2565b91909190565b6159936159999161141f565b9161141f565b019060018060d01b0382116159aa57565b611686565b906159c2916159bc61365a565b50615987565b90565b6159cd61170d565b506159e160006159db613e00565b01612a9a565b90565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90565b90959492615a5494615a43615a4d92615a39608096615a2f60a088019c6000890190610b8b565b6020870190610b8b565b6040850190610b8b565b6060830190610404565b0190610887565b565b615a5e611eb2565b50615a676159e4565b615aac615a72615af5565b91615a9d615a7e615bac565b46615a8830611f80565b91615a916102e3565b96879560208701615a08565b602082018103825203826115ec565b615abe615ab882612fa0565b91612f9a565b2090565b91615ae76000615aec94615ad461365a565b50615add61365a565b5001929192613682565b615e02565b91909190565b90565b615afd611eb2565b50615b06613a16565b615b0e613a3a565b615b1f615b1a82615af2565b612fa0565b615b32615b2c600061182c565b916103be565b11600014615b5a57615b449150615af2565b615b56615b5082612fa0565b91612f9a565b2090565b506000615b679101611ed3565b80615b7b615b756000611ee0565b91610b88565b1415600014615b875790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615bb4611eb2565b50615bbd613a16565b615bc5613a59565b615bd6615bd182615af2565b612fa0565b615be9615be3600061182c565b916103be565b11600014615c1157615bfb9150615af2565b615c0d615c0782612fa0565b91612f9a565b2090565b506001615c1e9101611ed3565b80615c32615c2c6000611ee0565b91610b88565b1415600014615c3e5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b5490565b615c716040611b0c565b90565b600052602060002090565b615c8881615c63565b821015615ca357615c9a600191615c74565b91020190600090565b6146fd565b615cb29051610d6f565b90565b90615cc665ffffffffffff91611d2f565b9181191691161790565b615ce4615cdf615ce992610d6f565b61075f565b610d6f565b90565b90565b90615d04615cff615d0b92615cd0565b615cec565b8254615cb5565b9055565b615d19905161141f565b90565b60301b90565b90615d3465ffffffffffff1991615d1c565b9181191691161790565b615d52615d4d615d579261141f565b61075f565b61141f565b90565b90565b90615d72615d6d615d7992615d3e565b615d5a565b8254615d22565b9055565b90615da860206000615dae94615da0828201615d9a848801615ca8565b90615cef565b019201615d0f565b90615d5d565b565b9190615dc157615dbf91615d7d565b565b61247b565b90815491600160401b831015615df15782615de9916001615def95018155615c7f565b90615db0565b565b6115d6565b615dff90615050565b90565b90929192615e0e61365a565b50615e1761365a565b50615e2182615c63565b80615e35615e2f600061182c565b916103be565b11600014615f3957615e63615e5e84615e5884615e52600161166a565b906123cd565b90614339565b615df6565b90615e7060008301615ca8565b615e82615e7c85610d6f565b91610d6f565b11615f1c57615ee793602093615e9a60008501615ca8565b615eac615ea683610d6f565b91610d6f565b14600014615eeb57506000615eda615ee093615ed48a9491615ece600161166a565b906123cd565b90614339565b01615d5d565b5b01615d0f565b9190565b90615f179250615f1288615f0a615f00615c67565b9460008601615034565b868401615042565b615dc6565b615ee1565b6000632520601d60e01b815280615f35600482016108df565b0390fd5b50615f6591615f6085615f57615f4d615c67565b9460008601615034565b60208401615042565b615dc6565b615f6f60006136e3565b9190565b634e487b7160e01b600052605160045260246000fd5b91909180600214615fa857600103615f7357615fa4916159af565b905b565b50615fb29161586f565b90615fa656fea2646970667358221220fa3e98db59ee9657da3ee714b789241ea97a60843770c0dc1bf311110180ab9664736f6c634300081a0033", - "nonce": "0x10", + "input": "0x60806040523461002757610011610037565b61001961002c565b615ffa61022a8239615ffa90f35b610032565b60405190565b600080fd5b61003f610049565b610047610149565b565b610051610149565b565b60401c90565b60ff1690565b61006b61007091610053565b610059565b90565b61007d905461005f565b90565b60000190565b60001c90565b60018060401b031690565b6100a36100a891610086565b61008c565b90565b6100b59054610097565b90565b60018060401b031690565b60001b90565b906100da60018060401b03916100c3565b9181191691161790565b90565b6100fb6100f6610100926100b8565b6100e4565b6100b8565b90565b90565b9061011b610116610122926100e7565b610103565b82546100c9565b9055565b61012f906100b8565b9052565b919061014790600060208501940190610126565b565b610151610205565b61015d60008201610073565b6101e85761016d600082016100ab565b61018561017f60018060401b036100b8565b916100b8565b0361018e575b50565b6101a290600060018060401b039101610106565b60018060401b036101df7fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916101d661002c565b91829182610133565b0390a13861018b565b600063f92ee8a960e01b81528061020160048201610080565b0390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009056fe60806040526004361015610013575b6114dc565b61001e6000356102dd565b806306fdde03146102d857806307a2d13a146102d3578063095ea7b3146102ce5780630962ef79146102c95780630a28a477146102c457806318160ddd146102bf57806323b872dd146102ba578063313ce567146102b5578063313da78f146102b0578063375b3c0a146102ab5780633a46b1a8146102a65780633f2a5540146102a15780633fd8b02f1461029c5780634bf5d7e914610297578063587cde1e146102925780635c19a95c1461028d5780636fcfff451461028857806370a0823114610283578063715018a61461027e57806372f702f314610279578063779972da146102745780637ecebe001461026f578063834f587a1461026a57806384b0196e146102655780638c80fd90146102605780638da5cb5b1461025b5780638e539e8c1461025657806391ddadf41461025157806395d89b411461024c57806397652527146102475780639ab24eb014610242578063a2bc66be1461023d578063a694fc3a14610238578063a6b63eb814610233578063a9059cbb1461022e578063c3cda52014610229578063c6e6f59214610224578063ce96cb771461021f578063d1f5c33b1461021a578063d5a44f8614610215578063d8fb933714610210578063dd62ed3e1461020b578063f1127ed8146102065763f2fde38b0361000e576114a9565b611473565b61138a565b611327565b6112bd565b6111c9565b611194565b61115f565b611125565b61105d565b611026565b610f9a565b610f64565b610ef4565b610ebf565b610e20565b610deb565b610d88565b610d53565b610d20565b610ce4565b610c14565b610b8d565b610b5a565b610b25565b610a84565b610a4f565b610a1a565b6109bb565b610980565b610928565b6108f3565b6108ae565b6107dd565b6107a8565b610736565b610641565b6105fd565b61058d565b610558565b610523565b6104ed565b610427565b610389565b60e01c90565b60405190565b600080fd5b600080fd5b60009103126102fe57565b6102ee565b5190565b60209181520190565b60005b838110610324575050906000910152565b806020918301518185015201610313565b601f801991011690565b61035e61036760209361036c9361035581610303565b93848093610307565b95869101610310565b610335565b0190565b610386916020820191600081840391015261033f565b90565b346103b9576103993660046102f3565b6103b56103a4611643565b6103ac6102e3565b91829182610370565b0390f35b6102e9565b90565b6103ca816103be565b036103d157565b600080fd5b905035906103e3826103c1565b565b906020828203126103ff576103fc916000016103d6565b90565b6102ee565b61040d906103be565b9052565b919061042590600060208501940190610404565b565b346104575761045361044261043d3660046103e5565b6116c1565b61044a6102e3565b91829182610411565b0390f35b6102e9565b60018060a01b031690565b6104709061045c565b90565b61047c81610467565b0361048357565b600080fd5b9050359061049582610473565b565b91906040838203126104c057806104b46104bd9260008601610488565b936020016103d6565b90565b6102ee565b151590565b6104d3906104c5565b9052565b91906104eb906000602085019401906104ca565b565b3461051e5761051a610509610503366004610497565b90611712565b6105116102e3565b918291826104d7565b0390f35b6102e9565b346105535761054f61053e6105393660046103e5565b611930565b6105466102e3565b91829182610411565b0390f35b6102e9565b346105885761058461057361056e3660046103e5565b611944565b61057b6102e3565b91829182610411565b0390f35b6102e9565b346105bd5761059d3660046102f3565b6105b96105a8611990565b6105b06102e3565b91829182610411565b0390f35b6102e9565b90916060828403126105f8576105f56105de8460008501610488565b936105ec8160208601610488565b936040016103d6565b90565b6102ee565b346106135761060d3660046105c2565b916119af565b6102e9565b60ff1690565b61062790610618565b9052565b919061063f9060006020850194019061061e565b565b34610671576106513660046102f3565b61066d61065c6119f9565b6106646102e3565b9182918261062b565b0390f35b6102e9565b906020828203126106905761068d91600001610488565b90565b6102ee565b5190565b60209181520190565b60200190565b6106b1906103be565b9052565b906106c2816020936106a8565b0190565b60200190565b906106e96106e36106dc84610695565b8093610699565b926106a2565b9060005b8181106106fa5750505090565b90919261071361070d60019286516106b5565b946106c6565b91019190916106ed565b61073391602082019160008184039101526106cc565b90565b346107665761076261075161074c366004610676565b611a2f565b6107596102e3565b9182918261071d565b0390f35b6102e9565b1c90565b90565b610782906008610787930261076b565b61076f565b90565b906107959154610772565b90565b6107a5600560009061078a565b90565b346107d8576107b83660046102f3565b6107d46107c3610798565b6107cb6102e3565b91829182610411565b0390f35b6102e9565b3461080e5761080a6107f96107f3366004610497565b90611acd565b6108016102e3565b91829182610411565b0390f35b6102e9565b60018060a01b031690565b61082e906008610833930261076b565b610813565b90565b90610841915461081e565b90565b6108516001600090610836565b90565b90565b61086b6108666108709261045c565b610854565b61045c565b90565b61087c90610857565b90565b61088890610873565b90565b6108949061087f565b9052565b91906108ac9060006020850194019061088b565b565b346108de576108be3660046102f3565b6108da6108c9610844565b6108d16102e3565b91829182610898565b0390f35b6102e9565b6108f0600360009061078a565b90565b34610923576109033660046102f3565b61091f61090e6108e3565b6109166102e3565b91829182610411565b0390f35b6102e9565b34610958576109383660046102f3565b610954610943611bee565b61094b6102e3565b91829182610370565b0390f35b6102e9565b61096690610467565b9052565b919061097e9060006020850194019061095d565b565b346109b0576109ac61099b610996366004610676565b611c8e565b6109a36102e3565b9182918261096a565b0390f35b6102e9565b60000190565b346109e9576109d36109ce366004610676565b611cb6565b6109db6102e3565b806109e5816109b5565b0390f35b6102e9565b63ffffffff1690565b610a00906109ee565b9052565b9190610a18906000602085019401906109f7565b565b34610a4a57610a46610a35610a30366004610676565b611cce565b610a3d6102e3565b91829182610a04565b0390f35b6102e9565b34610a7f57610a7b610a6a610a65366004610676565b611ce3565b610a726102e3565b91829182610411565b0390f35b6102e9565b34610ab257610a943660046102f3565b610a9c611d59565b610aa46102e3565b80610aae816109b5565b0390f35b6102e9565b60018060a01b031690565b610ad2906008610ad7930261076b565b610ab7565b90565b90610ae59154610ac2565b90565b610af3600080610ada565b90565b610aff90610873565b90565b610b0b90610af6565b9052565b9190610b2390600060208501940190610b02565b565b34610b5557610b353660046102f3565b610b51610b40610ae8565b610b486102e3565b91829182610b0f565b0390f35b6102e9565b34610b8857610b72610b6d3660046103e5565b611e03565b610b7a6102e3565b80610b84816109b5565b0390f35b6102e9565b34610bbd57610bb9610ba8610ba3366004610676565b611e0e565b610bb06102e3565b91829182610411565b0390f35b6102e9565b610bcb816104c5565b03610bd257565b600080fd5b90503590610be482610bc2565b565b9190604083820312610c0f5780610c03610c0c9260008601610488565b93602001610bd7565b90565b6102ee565b34610c4357610c2d610c27366004610be6565b90611ee8565b610c356102e3565b80610c3f816109b5565b0390f35b6102e9565b60ff60f81b1690565b610c5a90610c48565b9052565b90565b610c6a90610c5e565b9052565b93959194610cc0610cb5610cd495610ca7610cca95610ce19c9a610c9a60e08c019260008d0190610c51565b8a820360208c015261033f565b9088820360408a015261033f565b976060870190610404565b608085019061095d565b60a0830190610c61565b60c08184039101526106cc565b90565b34610d1b57610cf43660046102f3565b610d17610cff612036565b93610d0e9795979391936102e3565b97889788610c6e565b0390f35b6102e9565b34610d4e57610d38610d333660046103e5565b612181565b610d406102e3565b80610d4a816109b5565b0390f35b6102e9565b34610d8357610d633660046102f3565b610d7f610d6e61218c565b610d766102e3565b9182918261096a565b0390f35b6102e9565b34610db857610db4610da3610d9e3660046103e5565b6121ab565b610dab6102e3565b91829182610411565b0390f35b6102e9565b65ffffffffffff1690565b610dd190610dbd565b9052565b9190610de990600060208501940190610dc8565b565b34610e1b57610dfb3660046102f3565b610e17610e0661222d565b610e0e6102e3565b91829182610dd5565b0390f35b6102e9565b34610e5057610e303660046102f3565b610e4c610e3b612241565b610e436102e3565b91829182610370565b0390f35b6102e9565b610e5e90610873565b90565b90610e6b90610e55565b600052602052604060002090565b60ff1690565b610e8f906008610e94930261076b565b610e79565b90565b90610ea29154610e7f565b90565b610ebc90610eb7600891600092610e61565b610e97565b90565b34610eef57610eeb610eda610ed5366004610676565b610ea5565b610ee26102e3565b918291826104d7565b0390f35b6102e9565b34610f2457610f20610f0f610f0a366004610676565b612260565b610f176102e3565b91829182610411565b0390f35b6102e9565b9091606082840312610f5f57610f5c610f458460008501610488565b93610f5381602086016103d6565b936040016103d6565b90565b6102ee565b34610f9557610f91610f80610f7a366004610f29565b916124f4565b610f886102e3565b91829182610411565b0390f35b6102e9565b34610fca57610fc6610fb5610fb03660046103e5565b612a93565b610fbd6102e3565b91829182610411565b0390f35b6102e9565b919060a08382031261102157610fe88160008501610488565b92610ff68260208301610488565b9261101e6110078460408501610488565b9361101581606086016103d6565b936080016103d6565b90565b6102ee565b3461105857611042611039366004610fcf565b93929092612f29565b61104a6102e3565b80611054816109b5565b0390f35b6102e9565b346110735761106d366004610497565b90612f38565b6102e9565b61108181610618565b0361108857565b600080fd5b9050359061109a82611078565b565b6110a581610c5e565b036110ac57565b600080fd5b905035906110be8261109c565b565b909160c082840312611120576110d98360008401610488565b926110e781602085016103d6565b926110f582604083016103d6565b9261111d611106846060850161108d565b9361111481608086016110b1565b9360a0016110b1565b90565b6102ee565b3461115a576111446111383660046110c0565b94939093929192612fcb565b61114c6102e3565b80611156816109b5565b0390f35b6102e9565b3461118f5761118b61117a6111753660046103e5565b61307e565b6111826102e3565b91829182610411565b0390f35b6102e9565b346111c4576111c06111af6111aa366004610676565b6130ca565b6111b76102e3565b91829182610411565b0390f35b6102e9565b346111f7576111e16111dc366004610676565b61319c565b6111e96102e3565b806111f3816109b5565b0390f35b6102e9565b61121061120b611215926103be565b610854565b6103be565b90565b90611222906111fc565b600052602052604060002090565b60001c90565b61124261124791611230565b61076f565b90565b6112549054611236565b90565b611262906007611218565b61126e6000820161124a565b9161128760026112806001850161124a565b930161124a565b90565b6040906112b46112bb94969593966112aa60608401986000850190610404565b6020830190610404565b0190610404565b565b346112f0576112ec6112d86112d33660046103e5565b611257565b6112e39391936102e3565b9384938461128a565b0390f35b6102e9565b906112ff90610e55565b600052602052604060002090565b6113249061131f6004916000926112f5565b61078a565b90565b346113575761135361134261133d366004610676565b61130d565b61134a6102e3565b91829182610411565b0390f35b6102e9565b919060408382031261138557806113796113829260008601610488565b93602001610488565b90565b6102ee565b346113bb576113b76113a66113a036600461135c565b906131bf565b6113ae6102e3565b91829182610411565b0390f35b6102e9565b6113c9816109ee565b036113d057565b600080fd5b905035906113e2826113c0565b565b919060408382031261140d578061140161140a9260008601610488565b936020016113d5565b90565b6102ee565b61141b90610dbd565b9052565b60018060d01b031690565b6114339061141f565b9052565b9060208061145b9361145160008201516000860190611412565b015191019061142a565b565b919061147190600060408501940190611437565b565b346114a4576114a061148f6114893660046113e4565b90613238565b6114976102e3565b9182918261145d565b0390f35b6102e9565b346114d7576114c16114bc366004610676565b6132b6565b6114c96102e3565b806114d3816109b5565b0390f35b6102e9565b600080fd5b606090565b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561151c575b602083101461151757565b6114e6565b91607f169161150c565b60209181520190565b600052602060002090565b906000929180549061155561154e836114fc565b8094611526565b916001811690816000146115ae5750600114611571575b505050565b61157e919293945061152f565b916000925b818410611596575050019038808061156c565b60018160209295939554848601520191019290611583565b92949550505060ff191682521515602002019038808061156c565b906115d39161153a565b90565b634e487b7160e01b600052604160045260246000fd5b906115f690610335565b810190811067ffffffffffffffff82111761161057604052565b6115d6565b9061163561162e926116256102e3565b938480926115c9565b03836115ec565b565b61164090611615565b90565b61164b6114e1565b5061165f60036116596132c1565b01611637565b90565b600090565b90565b61167e61167961168392611667565b610854565b6103be565b90565b634e487b7160e01b600052601160045260246000fd5b6116ab6116b1919392936103be565b926103be565b82018092116116bc57565b611686565b61170a906116cd611662565b506116e96116d96132f1565b6116e3600161166a565b9061169c565b6117046116f4611990565b6116fe600161166a565b9061169c565b9161338d565b90565b600090565b61172f9161171e61170d565b506117276133b1565b9190916133be565b600190565b61174061174591611230565b610813565b90565b6117529054611734565b90565b60e01b90565b90505190611768826103c1565b565b90602082820312611784576117819160000161175b565b90565b6102ee565b6117916102e3565b3d6000823e3d90fd5b906117c99160206117b36117ae6001611748565b61087f565b6370bb45b3906117c16102e3565b958692611755565b8252816000816117db600482016109b5565b03925af1928315611824576117f5936117f8575b5061188d565b90565b6118189060203d811161181d575b61181081836115ec565b81019061176a565b6117ef565b503d611806565b611789565b90565b61184061183b61184592611829565b610854565b6103be565b90565b1561184f57565b60006373380d9960e01b815280611868600482016109b5565b0390fd5b61187861187d91611230565b610ab7565b90565b61188a905461186c565b90565b919091506118a5339261189f846130ca565b906133ce565b916118c3836118bd6118b7600061182c565b916103be565b11611848565b6118d56118cf84611944565b8261341d565b6118ea6118e26000611880565b828591613504565b829061192b6119197ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe92610e55565b926119226102e3565b91829182610411565b0390a2565b6119419061193c611662565b61179a565b90565b61198d90611950611662565b5061196c61195c611990565b611966600161166a565b9061169c565b6119876119776132f1565b611981600161166a565b9061169c565b91613552565b90565b611998611662565b506119ac60026119a66132c1565b0161124a565b90565b6119b761170d565b50600063a24e573d60e01b8152806119d1600482016109b5565b0390fd5b600090565b90565b6119f16119ec6119f6926119da565b610854565b610618565b90565b611a016119d5565b50611a0c60126119dd565b90565b606090565b90611a1e90610e55565b600052602052604060002090565b90565b611a4e611a49611a5392611a41611a0f565b506006611a14565b611a2c565b613585565b90565b611a6a611a65611a6f92610dbd565b610854565b6103be565b90565b916020611a94929493611a8d60408201966000830190610404565b0190610dc8565b565b90611aa090610e55565b600052602052604060002090565b90565b611ac5611ac0611aca9261141f565b610854565b6103be565b90565b611ad5611662565b50611ade6135ae565b611ae661222d565b83611af9611af383611a56565b916103be565b1015611b33575091611b25611b1f611b1a611b2b946001611b309701611a96565b611aae565b9161363e565b90613737565b611ab1565b90565b83611b4f6000928392637669fc0f60e11b845260048401611a72565b0390fd5b90611b66611b5f6102e3565b92836115ec565b565b67ffffffffffffffff8111611b8657611b82602091610335565b0190565b6115d6565b90611b9d611b9883611b68565b611b53565b918252565b60007f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000910152565b611bd4601d611b8b565b90611be160208301611ba2565b565b611beb611bca565b90565b611bf66114e1565b50611bff61222d565b611c18611c12611c0d613867565b610dbd565b91610dbd565b03611c2857611c25611be3565b90565b60006301bfc1c560e61b815280611c41600482016109b5565b0390fd5b600090565b90611c5490610e55565b600052602052604060002090565b60018060a01b031690565b611c79611c7e91611230565b611c62565b90565b611c8b9054611c6d565b90565b611cae611cb391611c9d611c45565b506000611ca86135ae565b01611c4a565b611c81565b90565b611cc790611cc26133b1565b61389f565b565b600090565b611ce090611cda611cc9565b50613935565b90565b611d03611d0891611cf2611662565b506000611cfd6132c1565b016112f5565b61124a565b90565b611d1361396d565b611d1b611d45565b565b611d31611d2c611d3692611829565b610854565b61045c565b90565b611d4290611d1d565b90565b611d57611d526000611d39565b6139bc565b565b611d61611d0b565b565b611d7490611d6f61396d565b611db6565b565b60001b90565b90611d8960001991611d76565b9181191691161790565b90565b90611dab611da6611db2926111fc565b611d93565b8254611d7c565b9055565b611dc1816003611d96565b611deb7fdb58c3448fa6dc4b2401b39b9ef3a0c9de44312a88055379c5f3bfe435781cc0916111fc565b90611df46102e3565b80611dfe816109b5565b0390a2565b611e0c90611d63565b565b611e2e611e3391611e1d611662565b506000611e28613a2a565b016112f5565b61124a565b90565b90611e4891611e4361396d565b611e8f565b565b90611e5660ff91611d76565b9181191691161790565b611e69906104c5565b90565b90565b90611e84611e7f611e8b92611e60565b611e6c565b8254611e4a565b9055565b611ea482611e9f60088490610e61565b611e6f565b611ee3611ed17fc17077e55d3a8256fc9c13b798e2591ea1c9abc264b62c296034beba67b6d70092610e55565b92611eda6102e3565b918291826104d7565b0390a2565b90611ef291611e36565b565b600090565b600090565b90565b611f0d611f1291611230565b611efe565b90565b611f1f9054611f01565b90565b611f36611f31611f3b92611829565b611d76565b610c5e565b90565b60007f4549503731323a20556e696e697469616c697a65640000000000000000000000910152565b611f736015602092610307565b611f7c81611f3e565b0190565b611f969060208101906000818303910152611f66565b90565b15611fa057565b611fa86102e3565b62461bcd60e51b815280611fbe60048201611f80565b0390fd5b611fcb90610873565b90565b67ffffffffffffffff8111611fe65760208091020190565b6115d6565b90611ffd611ff883611fce565b611b53565b918252565b369037565b9061202c61201483611feb565b926020806120228693611fce565b9201910390612002565b565b600f60f81b90565b61203e611ef4565b506120476114e1565b506120506114e1565b50612059611662565b50612062611c45565b5061206b611ef9565b50612074611a0f565b506120ad612080613a4e565b61208c60008201611f15565b61209f6120996000611f22565b91610c5e565b1490816120fa575b50611f99565b6120b5613a72565b906120be613a91565b9046906120ca30611fc2565b906120d56000611f22565b906120e86120e3600061182c565b612007565b906120f161202e565b96959493929190565b6121079150600101611f15565b61211a6121146000611f22565b91610c5e565b14386120a7565b6121329061212d61396d565b612134565b565b61213f816005611d96565b6121697f47f1aa8f654e61a37d9cf2f8122235dcfeccbb3c45f09b2036e6ddba8ac0e0ab916111fc565b906121726102e3565b8061217c816109b5565b0390a2565b61218a90612121565b565b612194611c45565b506121a860006121a2613ab0565b01611c81565b90565b6121b3611662565b506121bc6135ae565b6121c461222d565b826121d76121d183611a56565b916103be565b10156122085750612205916121fa6121f460026122009401611aae565b9161363e565b90613737565b611ab1565b90565b826122246000928392637669fc0f60e11b845260048401611a72565b0390fd5b600090565b612235612228565b5061223e613867565b90565b6122496114e1565b5061225d60046122576132c1565b01611637565b90565b61229061228b61228661229593612275611662565b5060016122806135ae565b01611a96565b611aae565b613ad4565b611ab1565b90565b1561229f57565b600063221b60b760e21b8152806122b8600482016109b5565b0390fd5b906122c6906103be565b9052565b6122d46060611b53565b90565b9061232861231f60026122e86122ca565b946123016122f86000830161124a565b600088016122bc565b6123196123106001830161124a565b602088016122bc565b0161124a565b604084016122bc565b565b612333906122d7565b90565b61234090516103be565b90565b1561234a57565b6000630861c86560e01b815280612363600482016109b5565b0390fd5b61237361237891611230565b610e79565b90565b6123859054612367565b90565b1561238f57565b6000635b6aa88560e01b8152806123a8600482016109b5565b0390fd5b156123b357565b6000637664524d60e11b8152806123cc600482016109b5565b0390fd5b156123d757565b600063828aa81160e01b8152806123f0600482016109b5565b0390fd5b612403612409919392936103be565b926103be565b820391821161241457565b611686565b1b90565b9190600861243991029161243360001984612419565b92612419565b9181191691161790565b9190612459612454612461936111fc565b611d93565b90835461241d565b9055565b61247791612471611662565b91612443565b565b600060026124a09261248d83808301612465565b61249a8360018301612465565b01612465565b565b634e487b7160e01b600052600060045260246000fd5b906000036124cb576124c990612479565b565b6124a2565b9160206124f29294936124eb60408201966000830190610404565b0190610404565b565b9291926124ff611662565b5061252661252161251a61251560068590611a14565b611a2c565b8490613b6a565b612298565b61257861253d61253860078590611218565b61232a565b9461256661254d60008801612336565b61256061255a600061182c565b916103be565b11612343565b61257260008701612336565b906133ce565b9361258d61258860088490610e61565b61237b565b6000146127905761263461264d916125b7336125b16125ab87610467565b91610467565b146123ac565b6125c360408201612336565b6125de6125d86125d3600361124a565b6103be565b916103be565b1160001461277c576126216125f3600361124a565b5b61261b612615612610429361260b60208801612336565b61169c565b6103be565b916103be565b116123d0565b61262e6000859201612336565b90613bb9565b612646612640876103be565b916103be565b1015612388565b5b61265784611944565b9161266382849061341d565b61268e85612688600061267860078690611218565b01916126838361124a565b6123f4565b90611d96565b6126b6856126b06126a1600486906112f5565b916126ab8361124a565b6123f4565b90611d96565b6126cd60006126c760078490611218565b0161124a565b6126e06126da600061182c565b916103be565b14612742575b506126fc6126f46000611880565b828691613504565b83916127287f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e92610e55565b9261273d6127346102e3565b928392836124d0565b0390a2565b6127759061275c600061275760078490611218565b6124b8565b61277061276b60068590611a14565b611a2c565b613c7d565b50386126e6565b61262161278b60408301612336565b6125f4565b506127be6127a56127a083611ce3565b6116c1565b6127b76127b1876103be565b916103be565b1015612388565b61264e565b906127e9916127e46127df6127da60083390610e61565b61237b565b6123ac565b6127ec565b90565b9061281b9160206128056128006001611748565b61087f565b6370bb45b3906128136102e3565b958692611755565b82528160008161282d600482016109b5565b03925af1928315612876576128479361284a575b506128ec565b90565b61286a9060203d811161286f575b61286281836115ec565b81019061176a565b612841565b503d612858565b611789565b1561288257565b6000631f2a200560e01b81528061289b600482016109b5565b0390fd5b156128a657565b6000630419bcb760e51b8152806128bf600482016109b5565b0390fd5b6128cc906103be565b60001981146128db5760010190565b611686565b6128e990610873565b90565b9190915061290d82612907612901600061182c565b916103be565b1161287b565b339161292361291e60068590611a14565b611a2c565b9261292d84613ca8565b61294061293a600061182c565b916103be565b14612a68575b61296e82612968612959600485906112f5565b916129638361124a565b61169c565b90611d96565b6129818161297b8461307e565b90613cc8565b6129fa61298e600261124a565b6129a161299a826128c3565b6002611d96565b946129ba8460006129b460078a90611218565b01611d96565b6129d24260016129cc60078a90611218565b01611d96565b6129f36129df600361124a565b60026129ed60078a90611218565b01611d96565b8590613d2a565b50612a1a612a086000611880565b82612a12306128e0565b908592613dd9565b612a24600361124a565b612a4e7f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9092610e55565b92612a63612a5a6102e3565b928392836124d0565b0390a2565b612a8e82612a87612a81612a7c600561124a565b6103be565b916103be565b101561289f565b612946565b612aa490612a9f611662565b6127c3565b90565b60401c90565b612ab9612abe91612aa7565b610e79565b90565b612acb9054612aad565b90565b67ffffffffffffffff1690565b612ae7612aec91611230565b612ace565b90565b612af99054612adb565b90565b67ffffffffffffffff1690565b612b1d612b18612b2292611829565b610854565b612afc565b90565b612b39612b34612b3e92611667565b610854565b612afc565b90565b612b4a90610873565b90565b90612b6067ffffffffffffffff91611d76565b9181191691161790565b612b7e612b79612b8392612afc565b610854565b612afc565b90565b90565b90612b9e612b99612ba592612b6a565b612b86565b8254612b4d565b9055565b60401b90565b90612bbe60ff60401b91612ba9565b9181191691161790565b90612bdd612bd8612be492611e60565b611e6c565b8254612baf565b9055565b612bf190612b25565b9052565b9190612c0990600060208501940190612be8565b565b91939092612c17613e35565b94612c2d612c2760008801612ac1565b156104c5565b94612c3a60008801612aef565b80612c4e612c486000612b09565b91612afc565b1480612d6d575b90612c69612c636001612b25565b91612afc565b1480612d44575b612c7b9091156104c5565b9081612d33575b50612d1657612cac94612ca1612c986001612b25565b60008a01612b89565b86612d03575b612eb5565b612cb4575b50565b612cc2906000809101612bc8565b6001612cfa7fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d291612cf16102e3565b91829182612bf5565b0390a138612cb1565b612d11600160008a01612bc8565b612ca7565b600063f92ee8a960e01b815280612d2f600482016109b5565b0390fd5b612d3e9150156104c5565b38612c82565b50612c7b612d5130612b41565b3b612d65612d5f600061182c565b916103be565b149050612c70565b5086612c55565b60007f5374616b65642053485500000000000000000000000000000000000000000000910152565b612da6600a611b8b565b90612db360208301612d74565b565b612dbd612d9c565b90565b60007f7353485500000000000000000000000000000000000000000000000000000000910152565b612df26004611b8b565b90612dff60208301612dc0565b565b612e09612de8565b90565b612e1590610857565b90565b612e2190612e0c565b90565b90612e3560018060a01b0391611d76565b9181191691161790565b612e4890612e0c565b90565b90565b90612e63612e5e612e6a92612e3f565b612e4b565b8254612e24565b9055565b612e7790610857565b90565b612e8390612e6e565b90565b612e8f90612e6e565b90565b90565b90612eaa612ea5612eb192612e86565b612e92565b8254612e24565b9055565b612efe612f0c93612ef9612ef2612f13989795612eed612f0596612ee8612eda612db5565b612ee2612e01565b90613e79565b6139bc565b612e18565b6000612e4e565b612e7a565b6001612e95565b6003611d96565b6005611d96565b612f27612f20600161166a565b6002611d96565b565b90612f3694939291612c0b565b565b612f4061170d565b50600063a24e573d60e01b815280612f5a600482016109b5565b0390fd5b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf90565b612fb8612fbf94612fae606094989795612fa4608086019a6000870190610c61565b602085019061095d565b6040830190610404565b0190610404565b565b60200190565b5190565b9395949092919542612fe5612fdf896103be565b916103be565b1161305e5791613050916130579361304761305c989961302f613006612f5e565b6130208b938b6130146102e3565b95869460208601612f82565b602082018103825203826115ec565b61304161303b82612fc7565b91612fc1565b20613e85565b92909192613ea2565b9182613eed565b61389f565b565b61307a876000918291632341d78760e11b835260048301610411565b0390fd5b6130c79061308a611662565b506130a6613096611990565b6130a0600161166a565b9061169c565b6130c16130b16132f1565b6130bb600161166a565b9061169c565b9161338d565b90565b6130e7906130d6611662565b506130e1600061182c565b90613bb9565b90565b6130fb906130f661396d565b613121565b565b1561310457565b6000639fabe1c160e01b81528061311d600482016109b5565b0390fd5b6131478161314061313a6131356000611d39565b610467565b91610467565b14156130fd565b61315a61315382612e7a565b6001612e95565b6131847f058fa9577dc29aece41d41c2d3bff2ed4e8d5085762198e8f7faab35039555da91610e55565b9061318d6102e3565b80613197816109b5565b0390a2565b6131a5906130ea565b565b906131b190610e55565b600052602052604060002090565b6131ed916131e36131e8926131d2611662565b5060016131dd6132c1565b016131a7565b6112f5565b61124a565b90565b6131fa6040611b53565b90565b600090565b600090565b61320f6131f0565b906020808361321c6131fd565b815201613227613202565b81525050565b613235613207565b90565b9061324b9161324561322d565b50613f31565b90565b61325f9061325a61396d565b613261565b565b8061327d6132776132726000611d39565b610467565b91610467565b1461328d5761328b906139bc565b565b6132b261329a6000611d39565b6000918291631e4fbdf760e01b83526004830161096a565b0390fd5b6132bf9061324e565b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0090565b6132ee90610873565b90565b6132f9611662565b50613343602061331161330c6000611880565b610af6565b6370a0823190613338613323306132e5565b9261332c6102e3565b95869485938493611755565b83526004830161096a565b03915afa9081156133885760009161335a575b5090565b61337b915060203d8111613381575b61337381836115ec565b81019061176a565b38613356565b503d613369565b611789565b613395611662565b50816000190481118202158302156133ac57020490565b600080fd5b6133b9611c45565b503390565b916133cc9291600192613f62565b565b6133d6611662565b50806133eb6133e5600061182c565b916103be565b146000146133f85750905b565b906134179061341061340a84926103be565b916103be565b1115612388565b906133f6565b908161343a61343461342f6000611d39565b610467565b91610467565b1461345757613455919061344e6000611d39565b9091614082565b565b61347c6134646000611d39565b6000918291634b637e8f60e11b83526004830161096a565b0390fd5b60007f5452414e534645525f4641494c45440000000000000000000000000000000000910152565b6134b5600f602092610307565b6134be81613480565b0190565b6134d890602081019060008183039101526134a8565b90565b156134e257565b6134ea6102e3565b62461bcd60e51b815280613500600482016134c2565b0390fd5b6044602092600080936135509661351961170d565b506040519363a9059cbb60e01b855260018060a01b0316600485015260248401525af13d15601f3d116001600051141617166134db565b565b9161355b611662565b508160001904831182021581021561357d578181600093850204930206110190565b600080fd5b90565b61359d60006135a292613596611a0f565b5001613582565b6141f5565b6135aa611a0f565b5090565b7fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d0090565b90565b6135e96135e46135ee926135d2565b610854565b610618565b90565b6135fa906135d5565b9052565b916020613620929493613619604082019660008301906135f1565b0190610404565b565b61363661363161363b926103be565b610854565b610dbd565b90565b613646612228565b508061366061365a65ffffffffffff611a56565b916103be565b116136715761366e90613622565b90565b603061368e60009283926306dfcc6560e41b8452600484016135fe565b0390fd5b600090565b5490565b90565b6136b26136ad6136b79261369b565b610854565b6103be565b90565b90565b65ffffffffffff1690565b6136d46136d991611230565b6136bd565b90565b6136e690546136c8565b90565b60301c90565b60018060d01b031690565b61370661370b916136e9565b6136ef565b90565b61371890546136fa565b90565b61372f61372a61373492611829565b610854565b61141f565b90565b9061378e90613744613692565b5061375160008401613697565b61375b600061182c565b90808061377161376b600561369e565b916103be565b116137f3575b509061378960008601939192936136ba565b61444a565b806137a261379c600061182c565b916103be565b146000146137ba5750506137b6600061371b565b5b90565b6137e86000916137e36137dd846137ee9601926137d7600161166a565b906123f4565b916136ba565b61443e565b0161370e565b6137b7565b8061380161380792916142bd565b906123f4565b908361383a61383461382f6000613829818c0161382489916136ba565b61443e565b016136dc565b610dbd565b91610dbd565b1060001461384c5750905b9038613777565b91506138629061385c600161166a565b9061169c565b613845565b61386f612228565b506138794361363e565b90565b90565b9061389461388f61389b92610e55565b61387c565b8254612e24565b9055565b906139339161392d6138af6135ae565b6138d06138bb84611c8e565b916138cb60008792018690611c4a565b61387f565b8281859061391061390a6139047f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f95610e55565b92610e55565b92610e55565b926139196102e3565b80613923816109b5565b0390a492916144db565b916144f3565b565b61396561396061395b61396a9361394a611cc9565b5060016139556135ae565b01611a96565b611aae565b6146b2565b614752565b90565b61397561218c565b61398e6139886139836133b1565b610467565b91610467565b0361399557565b6139b86139a06133b1565b600091829163118cdaa760e01b83526004830161096a565b0390fd5b6139c4613ab0565b6139de6139d360008301611c81565b91600084910161387f565b90613a12613a0c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610e55565b91610e55565b91613a1b6102e3565b80613a25816109b5565b0390a3565b7f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb0090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b613a7a6114e1565b50613a8e6002613a88613a4e565b01611637565b90565b613a996114e1565b50613aad6003613aa7613a4e565b01611637565b90565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b613adc613692565b50613ae960008201613697565b80613afd613af7600061182c565b916103be565b14600014613b15575050613b11600061371b565b5b90565b613b43600091613b3e613b3884613b49960192613b32600161166a565b906123f4565b916136ba565b61443e565b0161370e565b613b12565b613b62613b5d613b67926103be565b611d76565b610c5e565b90565b90613b8d613b876000613b9294613b7f61170d565b500192613b4e565b91613582565b6147c8565b90565b15613b9c57565b60006360956a6560e01b815280613bb5600482016109b5565b0390fd5b90613c0d90613bc6611662565b50613c08613c03613bfb613bd986611ce3565b613bf681613bf0613bea600061182c565b916103be565b11613b95565b6116c1565b9460046112f5565b61124a565b6123f4565b80613c29613c23613c1e600561124a565b6103be565b916103be565b1015600014613c6d575b80613c46613c40846103be565b916103be565b1015600014613c5f575050613c5b600061182c565b5b90565b613c68916123f4565b613c5c565b50613c78600561124a565b613c33565b90613ca0613c9a6000613ca594613c9261170d565b500192613b4e565b91613582565b614925565b90565b613cc06000613cc592613cb9611662565b5001613582565b614a2f565b90565b80613ce4613cde613cd96000611d39565b610467565b91610467565b14613d0157613cff91613cf76000611d39565b919091614082565b565b613d26613d0e6000611d39565b600091829163ec442f0560e01b83526004830161096a565b0390fd5b90613d4d613d476000613d5294613d3f61170d565b500192613b4e565b91613582565b614a77565b90565b60007f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000910152565b613d8a6014602092610307565b613d9381613d55565b0190565b613dad9060208101906000818303910152613d7d565b90565b15613db757565b613dbf6102e3565b62461bcd60e51b815280613dd560048201613d97565b0390fd5b60009182606492613e3396602096613def61170d565b50604051946323b872dd60e01b865260018060a01b0316600486015260018060a01b0316602485015260448401525af13d15601f3d11600160005114161716613db0565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0090565b90613e6b91613e66614ade565b613e6d565b565b90613e7791614cd0565b565b90613e8391613e59565b565b613e9f90613e91611ef9565b50613e9a614cdc565b614cf0565b90565b92613ebd92613ec694613eb3611c45565b5092909192614da8565b90929192614ee9565b90565b916020613eeb929493613ee46040820196600083019061095d565b0190610404565b565b613ef681614fd0565b91613f09613f03846103be565b916103be565b03613f12575050565b613f2d60009283926301d4b62360e61b845260048401613ec9565b0390fd5b90613f5a613f55613f5f93613f4461322d565b506001613f4f6135ae565b01611a96565b611aae565b6150a1565b90565b9092613f6c6132c1565b82613f88613f82613f7d6000611d39565b610467565b91610467565b146140595784613fa9613fa3613f9e6000611d39565b610467565b91610467565b1461403057613fd090613fcb613fc4600187930186906131a7565b87906112f5565b611d96565b613fda575b505050565b91909161402561401361400d7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593610e55565b93610e55565b9361401c6102e3565b91829182610411565b0390a3388080613fd5565b61405561403d6000611d39565b6000918291634a1406b160e11b83526004830161096a565b0390fd5b61407e6140666000611d39565b600091829163e602df0560e01b83526004830161096a565b0390fd5b929161409084838391615104565b836140ac6140a66140a16000611d39565b610467565b91610467565b146140c1575b6140bf92939190916152ad565b565b6140c9611990565b936140d2615292565b94806140e66140e0886103be565b916103be565b116140f3575093506140b2565b85906141106000928392630e58ae9360e11b8452600484016124d0565b0390fd5b606090565b5490565b60209181520190565b600052602060002090565b61413a90610c5e565b9052565b9061414b81602093614131565b0190565b6141599054611f01565b90565b60010190565b9061417f61417961417284614119565b809361411d565b92614126565b9060005b8181106141905750505090565b9091926141b06141aa6001926141a58761414f565b61413e565b9461415c565b9101919091614183565b906141c491614162565b90565b906141e76141e0926141d76102e3565b938480926141ba565b03836115ec565b565b6141f2906141c7565b90565b600061420a91614203614114565b50016141e9565b90565b61422161421c61422692611667565b610854565b610618565b90565b6142489061424261423c61424d94610618565b916103be565b9061076b565b6103be565b90565b61426f90614269614263614274946103be565b916103be565b90612419565b6103be565b90565b634e487b7160e01b600052601260045260246000fd5b61429961429f916103be565b916103be565b9081156142aa570490565b614277565b906142ba91016103be565b90565b6142c5611662565b50806142da6142d4600061182c565b916103be565b1461443057806144276144206144106144006143f06143e06143d06143c06143b06143a061439061442d9c61438a614383614373614363614353614343600161433e6143386143288a6154f8565b614332600161420d565b90614229565b9161166a565b614250565b61434d818861428d565b906142af565b61435d600161420d565b90614229565b61436d818661428d565b906142af565b61437d600161420d565b90614229565b809261428d565b906142af565b61439a600161420d565b90614229565b6143aa818c61428d565b906142af565b6143ba600161420d565b90614229565b6143ca818a61428d565b906142af565b6143da600161420d565b90614229565b6143ea818861428d565b906142af565b6143fa600161420d565b90614229565b61440a818661428d565b906142af565b61441a600161420d565b90614229565b809261428d565b906157d1565b90565b5061443b600061182c565b90565b60005260206000200190565b93919092614456611662565b505b8161446b614465836103be565b916103be565b10156144d35761447c828290615824565b90614493600061448d88859061443e565b016136dc565b6144a561449f87610dbd565b91610dbd565b116000146144b65750915b91614458565b9291506144cd906144c7600161166a565b9061169c565b906144b0565b925050915090565b6144ed906144e7611662565b50611ce3565b90565b90565b90916144fd6135ae565b918061451161450b86610467565b91610467565b141580614697575b614524575b50505050565b8061454061453a6145356000611d39565b610467565b91610467565b03614605575b508261456361455d6145586000611d39565b610467565b91610467565b0361456f575b8061451e565b6145ab6145b89161458760016145b295018690611a96565b906145a561459f6145996001936158fd565b93611aae565b916144f0565b90615951565b9290611ab1565b91611ab1565b9190916145e57fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72492610e55565b926145fa6145f16102e3565b928392836124d0565b0390a2388080614569565b61464661464c61463f61461c600187018590611a96565b600261463961463361462d896158fd565b93611aae565b916144f0565b90615951565b9290611ab1565b91611ab1565b9190916146797fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72492610e55565b9261468e6146856102e3565b928392836124d0565b0390a238614546565b50816146ac6146a6600061182c565b916103be565b11614519565b60006146c7916146c0611662565b5001613697565b90565b6146de6146d96146e3926109ee565b610854565b6103be565b90565b90565b6146fd6146f8614702926146e6565b610854565b610618565b90565b61470e906146e9565b9052565b91602061473492949361472d60408201966000830190614705565b0190610404565b565b61474a61474561474f926103be565b610854565b6109ee565b90565b61475a611cc9565b508061477261476c63ffffffff6146ca565b916103be565b116147835761478090614736565b90565b60206147a060009283926306dfcc6560e41b845260048401614712565b0390fd5b6147ad90610c5e565b90565b906147ba906147a4565b600052602052604060002090565b6147e69160016147e1926147da61170d565b50016147b0565b61124a565b6147f96147f3600061182c565b916103be565b141590565b634e487b7160e01b600052603260045260246000fd5b61481d81614119565b8210156148385761482f600191614126565b91020190600090565b6147fe565b61484d906008614852930261076b565b611efe565b90565b90614860915461483d565b90565b61486c90611230565b90565b919061488561488061488d936147a4565b614863565b90835461241d565b9055565b90565b634e487b7160e01b600052603160045260246000fd5b5490565b600052602060002090565b6148c2816148aa565b8210156148dd576148d46001916148ae565b91020190600090565b6147fe565b6148f4916148ee611ef9565b9161486f565b565b6148ff816148aa565b801561492057600190039061491d61491783836148b9565b906148e2565b55565b614894565b61492d61170d565b5061494461493f6001830184906147b0565b61124a565b9081614959614953600061182c565b916103be565b1415600014614a27576149d99260016149d4928461498260009661497c8561166a565b906123f4565b61499f614990888501614119565b6149998661166a565b906123f4565b816149b26149ac836103be565b916103be565b036149de575b5050506149ce6149c9868301614891565b6148f6565b016147b0565b612465565b600190565b614a1f92614a116149fd6149f7614a1a948c8901614814565b90614855565b93614a0b85918c8901614814565b9061486f565b918585016147b0565b611d96565b3880806149b8565b505050600090565b6000614a4491614a3d611662565b5001614119565b90565b90815491600160401b831015614a725782614a6a916001614a70950181556148b9565b9061486f565b565b6115d6565b614a7f61170d565b50614a94614a8e8284906147c8565b156104c5565b600014614ad757614acd614ad292614ab8614ab160008501614891565b8290614a47565b6001614ac660008501614119565b93016147b0565b611d96565b600190565b5050600090565b614aef614ae96159d1565b156104c5565b614af557565b6000631afcd79f60e31b815280614b0e600482016109b5565b0390fd5b90614b2491614b1f614ade565b614cac565b565b601f602091010490565b5b818110614b3c575050565b80614b4a6000600193612465565b01614b31565b9190601f8111614b60575b505050565b614b6c614b919361152f565b906020614b7884614b26565b83019310614b99575b614b8a90614b26565b0190614b30565b388080614b5b565b9150614b8a81929050614b81565b90614bb8906000199060080261076b565b191690565b81614bc791614ba7565b906002021790565b90614bd981610303565b9067ffffffffffffffff8211614c9b57614bfd82614bf785546114fc565b85614b50565b602090601f8311600114614c3257918091614c2193600092614c26575b5050614bbd565b90555b565b90915001513880614c1a565b601f19831691614c418561152f565b9260005b818110614c8357509160029391856001969410614c69575b50505002019055614c24565b614c79910151601f841690614ba7565b9055388080614c5d565b91936020600181928787015181550195019201614c45565b6115d6565b90614caa91614bcf565b565b6004614cce92614cc7614cbd6132c1565b9360038501614ca0565b9101614ca0565b565b90614cda91614b12565b565b614ce4611ef9565b50614ced615a62565b90565b604291614cfb611ef9565b50604051917f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201522090565b600090565b614d42614d4791611230565b6111fc565b90565b90565b614d61614d5c614d6692614d4a565b610854565b6103be565b90565b614d9f614da694614d95606094989795614d8b608086019a6000870190610c61565b602085019061061e565b6040830190610c61565b0190610c61565b565b939293614db3611c45565b50614dbc614d31565b50614dc5611ef9565b50614dcf85614d36565b614df7614df16fa2a8918ca85bafe22016d0b997e4df60600160ff1b03614d4d565b916103be565b11614e8b5790614e1b60209495600094939293614e126102e3565b94859485614d69565b838052039060015afa15614e8657614e34600051611d76565b80614e50614e4a614e456000611d39565b610467565b91610467565b14614e6857600091614e626000611f22565b91929190565b50614e736000611d39565b600191614e806000611f22565b91929190565b611789565b505050614e986000611d39565b9060039291929190565b634e487b7160e01b600052602160045260246000fd5b60041115614ec257565b614ea2565b90614ed182614eb8565b565b9190614ee790600060208501940190610c61565b565b80614efd614ef76000614ec7565b91614ec7565b14600014614f09575050565b80614f1d614f176001614ec7565b91614ec7565b14600014614f4257600063f645eedf60e01b815280614f3e600482016109b5565b0390fd5b80614f56614f506002614ec7565b91614ec7565b14600014614f8657614f82614f6a83614d36565b600091829163fce698f760e01b835260048301610411565b0390fd5b614f99614f936003614ec7565b91614ec7565b14614fa15750565b614fbd9060009182916335e2f38360e21b835260048301614ed3565b0390fd5b6001614fcd91016103be565b90565b614fed90614fdc611662565b506000614fe7613a2a565b016112f5565b615009614ff98261124a565b9161500383614fc1565b90611d96565b90565b600052602060002090565b61502081613697565b82101561503b5761503260019161500c565b91020190600090565b6147fe565b9061504a90610dbd565b9052565b906150589061141f565b9052565b9061509361508a600061506d6131f0565b9461508461507c8383016136dc565b838801615040565b0161370e565b6020840161504e565b565b61509e9061505c565b90565b6150c09160006150ba926150b361322d565b5001615017565b50615095565b90565b6040906150ed6150f494969593966150e36060840198600085019061095d565b6020830190610404565b0190610404565b565b9061510191036103be565b90565b91909161510f6132c1565b8161512b6151256151206000611d39565b610467565b91610467565b1460001461521a576151538361514d60028401916151488361124a565b61169c565b90611d96565b5b8361517061516a6151656000611d39565b610467565b91610467565b146000146151ea576151999061519360028592019161518e8361124a565b6150f6565b90611d96565b5b9190916151e56151d36151cd7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93610e55565b93610e55565b936151dc6102e3565b91829182610411565b0390a3565b6152159061520f615200600086930187906112f5565b9161520a8361124a565b6142af565b90611d96565b61519a565b61523061522b6000830184906112f5565b61124a565b8061524361523d866103be565b916103be565b1061526e576152566152699185906150f6565b6152646000840185906112f5565b611d96565b615154565b9161528e91509192600093849363391434e360e21b8552600485016150c3565b0390fd5b61529a611662565b506152aa60018060d01b03611ab1565b90565b9161531061530a615317946152c06135ae565b816152dc6152d66152d16000611d39565b610467565b91610467565b14615349575b856152fe6152f86152f36000611d39565b610467565b91610467565b14615319575b50611c8e565b92611c8e565b90916144f3565b565b60026153439101600261533d615337615331896158fd565b93611aae565b916144f0565b90615951565b50615304565b61537360028201600161536d6153676153618a6158fd565b93611aae565b916144f0565b90615951565b50506152e2565b90565b61539161538c6153969261537a565b610854565b610618565b90565b6153ad6153a86153b29261537a565b610854565b6103be565b90565b90565b6153cc6153c76153d1926153b5565b610854565b610618565b90565b6153e86153e36153ed926153b5565b610854565b6103be565b90565b6154046153ff615409926146e6565b610854565b6103be565b90565b90565b61542361541e6154289261540c565b610854565b610618565b90565b61543f61543a6154449261540c565b610854565b6103be565b90565b90565b61545e61545961546392615447565b610854565b610618565b90565b61547a61547561547f92615447565b610854565b6103be565b90565b90565b61549961549461549e92615482565b610854565b610618565b90565b6154b56154b06154ba92615482565b610854565b6103be565b90565b90565b6154d46154cf6154d9926154bd565b610854565b610618565b90565b6154f06154eb6154f5926154bd565b610854565b6103be565b90565b615500611662565b5061565a61550e600061182c565b916155238161551d608061537d565b90614229565b615536615530600061182c565b916103be565b116157a3575b6155508161554a60406153b8565b90614229565b61556361555d600061182c565b916103be565b11615775575b61557d8161557760206146e9565b90614229565b61559061558a600061182c565b916103be565b11615747575b6155aa816155a4601061540f565b90614229565b6155bd6155b7600061182c565b916103be565b11615719575b6155d7816155d1600861544a565b90614229565b6155ea6155e4600061182c565b916103be565b116156eb575b615604816155fe6004615485565b90614229565b615617615611600061182c565b916103be565b116156bd575b6156318161562b60026154c0565b90614229565b61564461563e600061182c565b916103be565b1161568f575b615654600161420d565b90614229565b61566d615667600061182c565b916103be565b11615676575b90565b61568a90615684600161166a565b906142af565b615673565b6156a66156b7916156a060026154c0565b90614229565b926156b160026154dc565b906142af565b9161564a565b6156d46156e5916156ce6004615485565b90614229565b926156df60046154a1565b906142af565b9161561d565b615702615713916156fc600861544a565b90614229565b9261570d6008615466565b906142af565b916155f0565b6157306157419161572a601061540f565b90614229565b9261573b601061542b565b906142af565b916155c3565b61575e61576f9161575860206146e9565b90614229565b9261576960206153f0565b906142af565b91615596565b61578c61579d9161578660406153b8565b90614229565b9261579760406153d4565b906142af565b91615569565b6157ba6157cb916157b4608061537d565b90614229565b926157c56080615399565b906142af565b9161553c565b906157da611662565b50816157ee6157e8836103be565b916103be565b106000146157fb57505b90565b90506157f8565b61580e615814916103be565b916103be565b90811561581f570490565b614277565b61584961584f92615833611662565b50828116921861584360026154dc565b90615802565b9061169c565b90565b61585e6158649161141f565b9161141f565b90039060018060d01b03821161587657565b611686565b9061588e91615888613692565b50615852565b90565b90565b6158a86158a36158ad92615891565b610854565b610618565b90565b6158b990615894565b9052565b9160206158df9294936158d8604082019660008301906158b0565b0190610404565b565b6158f56158f06158fa926103be565b610854565b61141f565b90565b615905613692565b508061591f61591960018060d01b03611ab1565b916103be565b116159305761592d906158e1565b90565b60d061594d60009283926306dfcc6560e41b8452600484016158bd565b0390fd5b9061598761598d9392615962613692565b5061596b613692565b50809361598061597961222d565b9492613ad4565b9091615f95565b91615ace565b91909190565b61599f6159a59161141f565b9161141f565b019060018060d01b0382116159b657565b611686565b906159ce916159c8613692565b50615993565b90565b6159d961170d565b506159ed60006159e7613e35565b01612ac1565b90565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90565b90959492615a6094615a4f615a5992615a45608096615a3b60a088019c6000890190610c61565b6020870190610c61565b6040850190610c61565b6060830190610404565b019061095d565b565b615a6a611ef9565b50615a736159f0565b615ab8615a7e615b01565b91615aa9615a8a615bb8565b46615a9430611fc2565b91615a9d6102e3565b96879560208701615a14565b602082018103825203826115ec565b615aca615ac482612fc7565b91612fc1565b2090565b91615af36000615af894615ae0613692565b50615ae9613692565b50019291926136ba565b615e0e565b91909190565b90565b615b09611ef9565b50615b12613a4e565b615b1a613a72565b615b2b615b2682615afe565b612fc7565b615b3e615b38600061182c565b916103be565b11600014615b6657615b509150615afe565b615b62615b5c82612fc7565b91612fc1565b2090565b506000615b739101611f15565b80615b87615b816000611f22565b91610c5e565b1415600014615b935790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615bc0611ef9565b50615bc9613a4e565b615bd1613a91565b615be2615bdd82615afe565b612fc7565b615bf5615bef600061182c565b916103be565b11600014615c1d57615c079150615afe565b615c19615c1382612fc7565b91612fc1565b2090565b506001615c2a9101611f15565b80615c3e615c386000611f22565b91610c5e565b1415600014615c4a5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b5490565b615c7d6040611b53565b90565b600052602060002090565b615c9481615c6f565b821015615caf57615ca6600191615c80565b91020190600090565b6147fe565b615cbe9051610dbd565b90565b90615cd265ffffffffffff91611d76565b9181191691161790565b615cf0615ceb615cf592610dbd565b610854565b610dbd565b90565b90565b90615d10615d0b615d1792615cdc565b615cf8565b8254615cc1565b9055565b615d25905161141f565b90565b60301b90565b90615d4065ffffffffffff1991615d28565b9181191691161790565b615d5e615d59615d639261141f565b610854565b61141f565b90565b90565b90615d7e615d79615d8592615d4a565b615d66565b8254615d2e565b9055565b90615db460206000615dba94615dac828201615da6848801615cb4565b90615cfb565b019201615d1b565b90615d69565b565b9190615dcd57615dcb91615d89565b565b6124a2565b90815491600160401b831015615dfd5782615df5916001615dfb95018155615c8b565b90615dbc565b565b6115d6565b615e0b9061505c565b90565b90929192615e1a613692565b50615e23613692565b50615e2d82615c6f565b80615e41615e3b600061182c565b916103be565b11600014615f4557615e6f615e6a84615e6484615e5e600161166a565b906123f4565b9061443e565b615e02565b90615e7c60008301615cb4565b615e8e615e8885610dbd565b91610dbd565b11615f2857615ef393602093615ea660008501615cb4565b615eb8615eb283610dbd565b91610dbd565b14600014615ef757506000615ee6615eec93615ee08a9491615eda600161166a565b906123f4565b9061443e565b01615d69565b5b01615d1b565b9190565b90615f239250615f1e88615f16615f0c615c73565b9460008601615040565b86840161504e565b615dd2565b615eed565b6000632520601d60e01b815280615f41600482016109b5565b0390fd5b50615f7191615f6c85615f63615f59615c73565b9460008601615040565b6020840161504e565b615dd2565b615f7b600061371b565b9190565b634e487b7160e01b600052605160045260246000fd5b91909180600214615fb457600103615f7f57615fb0916159bb565b905b565b50615fbe9161587b565b90615fb256fea2646970667358221220f01e5e9106b47ae0350fc6bd9506e2cd4d0698f90cd7841fa2c23e79673f886d64736f6c634300081a0033", + "nonce": "0x15", "chainId": "0xaa36a7" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x40b6ee0e135749707ef0a1505b08dab1c3c4048fe1f097eafba627f970a2bcb6", + "hash": "0x10c9e15442394db4ca349c2be1bbf0be64a0be5debf5afd8a21c9d0292bee934", "transactionType": "CREATE", "contractName": null, - "contractAddress": "0x60076ebcca7ad8825f10d3649378931d9c1cb24e", + "contractAddress": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", "function": null, "arguments": null, "transaction": { "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", "gas": "0x156f29", "value": "0x0", - "input": "0x60a060405261001561000f6101d3565b91610261565b61001d610033565b6107526107e082396080518160cd015261075290f35b60405190565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061006390610039565b810190811060018060401b0382111761007b57604052565b610043565b9061009361008c610033565b9283610059565b565b600080fd5b600080fd5b60018060a01b031690565b6100b39061009f565b90565b6100bf816100aa565b036100c657565b600080fd5b905051906100d8826100b6565b565b600080fd5b600080fd5b60018060401b038111610100576100fc602091610039565b0190565b610043565b60005b838110610119575050906000910152565b806020918301518185015201610108565b9092919261013f61013a826100e4565b610080565b9381855260208501908284011161015b5761015992610105565b565b6100df565b9080601f8301121561017e5781602061017b9351910161012a565b90565b6100da565b916060838303126101ce5761019b82600085016100cb565b926101a983602083016100cb565b92604082015160018060401b0381116101c9576101c69201610160565b90565b61009a565b610095565b6101f1611a8b803803806101e681610080565b928339810190610183565b909192565b6101ff906100aa565b9052565b9190610217906000602085019401906101f6565b565b610221610033565b3d6000823e3d90fd5b90565b61024161023c6102469261009f565b61022a565b61009f565b90565b6102529061022d565b90565b61025e90610249565b90565b9161026c91926102d1565b610274610033565b90610b59820182811060018060401b038211176102cc57829161029e91610b59610f328539610203565b03906000f080156102c7576102b290610255565b6080526102c56102c06102ef565b610329565b565b610219565b610043565b906102db916103ae565b565b600090565b6102ec90516100aa565b90565b6102f76102dd565b5061030260806102e2565b90565b916020610327929493610320604082019660008301906101f6565b01906101f6565b565b610374906103356104bf565b817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9161036c610363610033565b92839283610305565b0390a161054c565b565b61037f90610249565b90565b60000190565b5190565b90565b90565b6103a66103a16103ab9261038f565b61022a565b61038c565b90565b906103b8826105ff565b816103e37fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91610376565b906103ec610033565b806103f681610382565b0390a261040281610388565b61041561040f6000610392565b9161038c565b1160001461042a57610426916106d6565b505b565b5050610434610657565b610428565b90565b90565b60001b90565b61045961045461045e92610439565b61043f565b61043c565b90565b61048a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103610445565b90565b60001c90565b60018060a01b031690565b6104aa6104af9161048d565b610493565b90565b6104bc905461049e565b90565b6104c76102dd565b506104e360006104dd6104d8610461565b610706565b016104b2565b90565b6104fa6104f56104ff9261038f565b61022a565b61009f565b90565b61050b906104e6565b90565b9061051f60018060a01b039161043f565b9181191691161790565b90565b9061054161053c61054892610376565b610529565b825461050e565b9055565b8061056861056261055d6000610502565b6100aa565b916100aa565b1461058b5761058990600061058361057e610461565b610706565b0161052c565b565b6105b06105986000610502565b6000918291633173bdd160e11b835260048301610203565b0390fd5b90565b6105cb6105c66105d0926105b4565b61043f565b61043c565b90565b6105fc7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105b7565b90565b803b61061461060e6000610392565b9161038c565b146106375761063590600061062f61062a6105d3565b610706565b0161052c565b565b610653906000918291634c9c8ce360e01b835260048301610203565b0390fd5b3461066b6106656000610392565b9161038c565b1161067257565b600063b398979f60e01b81528061068b60048201610382565b0390fd5b606090565b906106a66106a1836100e4565b610080565b918252565b3d6000146106c8576106bc3d610694565b903d6000602084013e5b565b6106d061068f565b906106c6565b600080610703936106e561068f565b508390602081019051915af4906106fa6106ab565b9091909161070e565b90565b90565b151590565b906107229061071b61068f565b5015610709565b60001461072f5750610796565b61073882610388565b61074b6107456000610392565b9161038c565b148061077a575b61075a575090565b610776906000918291639996b31560e01b835260048301610203565b0390fd5b50803b61079061078a6000610392565b9161038c565b14610752565b61079f81610388565b6107b26107ac6000610392565b9161038c565b116000146107c257805190602001fd5b6000630a12f52160e11b8152806107db60048201610382565b0390fdfe608060405261000c61000e565b005b610016610041565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b60000190565b3361005b6100556100506100c2565b610023565b91610023565b146000146100b85763ffffffff60e01b6000351661008861008263278f794360e11b61002f565b9161002f565b14156000146100ae5760006334ad5dbb60e21b8152806100aa6004820161003b565b0390fd5b6100b66102fd565b565b6100ef565b600090565b6100ca6100bd565b507f000000000000000000000000000000000000000000000000000000000000000090565b6100f761033d565b610351565b90565b90565b90565b61011961011461011e926100fc565b610102565b6100ff565b90565b60405190565b600080fd5b600080fd5b9093929384831161015157841161014c576001820201920390565b61012c565b610127565b91565b600080fd5b600080fd5b61016c90610018565b90565b61017881610163565b0361017f57565b600080fd5b905035906101918261016f565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906101c79061019d565b810190811067ffffffffffffffff8211176101e157604052565b6101a7565b906101f96101f2610121565b92836101bd565b565b67ffffffffffffffff81116102195761021560209161019d565b0190565b6101a7565b90826000939282370152565b9092919261023f61023a826101fb565b6101e6565b9381855260208501908284011161025b576102599261021e565b565b610198565b9080601f8301121561027e5781602061027b9335910161022a565b90565b610193565b9190916040818403126102c45761029d8360008301610184565b92602082013567ffffffffffffffff81116102bf576102bc9201610260565b90565b61015e565b610159565b6102dd6102d86102e292610018565b610102565b610018565b90565b6102ee906102c9565b90565b6102fa906102e5565b90565b61033b61033661032f6103276103216000366103196004610105565b908092610131565b90610156565b810190610283565b91906102f1565b6103a3565b565b6103456100bd565b5061034e6104b4565b90565b60008091368280378136915af43d6000803e60001461036f573d6000f35b3d6000fd5b61037d906102e5565b90565b5190565b90565b61039b6103966103a092610384565b610102565b6100ff565b90565b906103ad8261053c565b816103d87fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91610374565b906103e1610121565b806103eb8161003b565b0390a26103f781610380565b61040a6104046000610387565b916100ff565b1160001461041f5761041b91610613565b505b565b5050610429610594565b61041d565b90565b90565b60001b90565b61044e6104496104539261042e565b610434565b610431565b90565b61047f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61043a565b90565b60001c90565b60018060a01b031690565b61049f6104a491610482565b610488565b90565b6104b19054610493565b90565b6104bc6100bd565b506104d860006104d26104cd610456565b610643565b016104a7565b90565b6104e490610023565b9052565b91906104fc906000602085019401906104db565b565b9061050f60018060a01b0391610434565b9181191691161790565b90565b9061053161052c61053892610374565b610519565b82546104fe565b9055565b803b61055161054b6000610387565b916100ff565b146105745761057290600061056c610567610456565b610643565b0161051c565b565b610590906000918291634c9c8ce360e01b8352600483016104e8565b0390fd5b346105a86105a26000610387565b916100ff565b116105af57565b600063b398979f60e01b8152806105c86004820161003b565b0390fd5b606090565b906105e36105de836101fb565b6101e6565b918252565b3d600014610605576105f93d6105d1565b903d6000602084013e5b565b61060d6105cc565b90610603565b600080610640936106226105cc565b508390602081019051915af4906106376105e8565b9091909161064b565b90565b90565b151590565b9061065f906106586105cc565b5015610646565b60001461066c57506106d3565b61067582610380565b6106886106826000610387565b916100ff565b14806106b7575b610697575090565b6106b3906000918291639996b31560e01b8352600483016104e8565b0390fd5b50803b6106cd6106c76000610387565b916100ff565b1461068f565b6106dc81610380565b6106ef6106e96000610387565b916100ff565b116000146106ff57805190602001fd5b6000630a12f52160e11b8152806107186004820161003b565b0390fdfea264697066735822122043e4e8c50f891e734dc14682393fe8d624d67844a88f7d6eccae37e704ddd1f564736f6c634300081a003360806040523461002f576100196100146100fa565b61011b565b610021610034565b61087b6102de823961087b90f35b61003a565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906100699061003f565b810190811060018060401b0382111761008157604052565b610049565b90610099610092610034565b928361005f565b565b600080fd5b60018060a01b031690565b6100b4906100a0565b90565b6100c0816100ab565b036100c757565b600080fd5b905051906100d9826100b7565b565b906020828203126100f5576100f2916000016100cc565b90565b61009b565b610118610b598038038061010d81610086565b9283398101906100db565b90565b61012490610177565b565b90565b90565b61014061013b61014592610126565b610129565b6100a0565b90565b6101519061012c565b90565b61015d906100ab565b9052565b919061017590600060208501940190610154565b565b8061019361018d6101886000610148565b6100ab565b916100ab565b146101a3576101a19061027c565b565b6101c86101b06000610148565b6000918291631e4fbdf760e01b835260048301610161565b0390fd5b60001c90565b60018060a01b031690565b6101e96101ee916101cc565b6101d2565b90565b6101fb90546101dd565b90565b60001b90565b9061021560018060a01b03916101fe565b9181191691161790565b61023361022e610238926100a0565b610129565b6100a0565b90565b6102449061021f565b90565b6102509061023b565b90565b90565b9061026b61026661027292610247565b610253565b8254610204565b9055565b60000190565b61028660006101f1565b610291826000610256565b906102c56102bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610247565b91610247565b916102ce610034565b806102d881610276565b0390a356fe60806040526004361015610013575b61049f565b61001e60003561006d565b8063715018a6146100685780638da5cb5b146100635780639623609d1461005e578063ad3cb1cc146100595763f2fde38b0361000e5761046c565b610418565b6102d6565b610106565b610099565b60e01c90565b60405190565b600080fd5b600080fd5b600091031261008e57565b61007e565b60000190565b346100c7576100a9366004610083565b6100b16104f8565b6100b9610073565b806100c381610093565b0390f35b610079565b60018060a01b031690565b6100e0906100cc565b90565b6100ec906100d7565b9052565b9190610104906000602085019401906100e3565b565b3461013657610116366004610083565b610132610121610539565b610129610073565b918291826100f0565b0390f35b610079565b600080fd5b610149906100d7565b90565b61015581610140565b0361015c57565b600080fd5b9050359061016e8261014c565b565b610179816100d7565b0361018057565b600080fd5b9050359061019282610170565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906101c89061019e565b810190811067ffffffffffffffff8211176101e257604052565b6101a8565b906101fa6101f3610073565b92836101be565b565b67ffffffffffffffff811161021a5761021660209161019e565b0190565b6101a8565b90826000939282370152565b9092919261024061023b826101fc565b6101e7565b9381855260208501908284011161025c5761025a9261021f565b565b610199565b9080601f8301121561027f5781602061027c9335910161022b565b90565b610194565b916060838303126102d15761029c8260008501610161565b926102aa8360208301610185565b92604082013567ffffffffffffffff81116102cc576102c99201610261565b90565b61013b565b61007e565b6102ea6102e4366004610284565b916106b8565b6102f2610073565b806102fc81610093565b0390f35b67ffffffffffffffff811161031e5761031a60209161019e565b0190565b6101a8565b9061033561033083610300565b6101e7565b918252565b60007f352e302e30000000000000000000000000000000000000000000000000000000910152565b61036c6005610323565b906103796020830161033a565b565b610383610362565b90565b61038e61037b565b90565b610399610386565b90565b5190565b60209181520190565b60005b8381106103bd575050906000910152565b8060209183015181850152016103ac565b6103ed6103f66020936103fb936103e48161039c565b938480936103a0565b958691016103a9565b61019e565b0190565b61041591602082019160008184039101526103ce565b90565b3461044857610428366004610083565b610444610433610391565b61043b610073565b918291826103ff565b0390f35b610079565b906020828203126104675761046491600001610185565b90565b61007e565b3461049a5761048461047f36600461044d565b61072d565b61048c610073565b8061049681610093565b0390f35b610079565b600080fd5b6104ac610738565b6104b46104e4565b565b90565b90565b6104d06104cb6104d5926104b6565b6104b9565b6100cc565b90565b6104e1906104bc565b90565b6104f66104f160006104d8565b6107d7565b565b6105006104a4565b565b600090565b60001c90565b60018060a01b031690565b61052461052991610507565b61050d565b90565b6105369054610518565b90565b610541610502565b5061054c600061052c565b90565b90610562929161055d610738565b610629565b565b61057861057361057d926100cc565b6104b9565b6100cc565b90565b61058990610564565b90565b61059590610580565b90565b600080fd5b60e01b90565b60009103126105ae57565b61007e565b5190565b60209181520190565b6105df6105e86020936105ed936105d6816105b3565b938480936105b7565b958691016103a9565b61019e565b0190565b9161061592610608604082019360008301906100e3565b60208184039101526105c0565b90565b610620610073565b3d6000823e3d90fd5b6106329061058c565b91634f1ef28634939093929193813b156106b3576000936106649161066f610658610073565b9788968795869461059d565b8452600484016105f1565b03925af180156106ae57610681575b50565b6106a19060003d81116106a7575b61069981836101be565b8101906105a3565b3861067e565b503d61068f565b610618565b610598565b906106c3929161054f565b565b6106d6906106d1610738565b6106d8565b565b806106f46106ee6106e960006104d8565b6100d7565b916100d7565b1461070457610702906107d7565b565b61072961071160006104d8565b6000918291631e4fbdf760e01b8352600483016100f0565b0390fd5b610736906106c5565b565b610740610539565b61075961075361074e610838565b6100d7565b916100d7565b0361076057565b61078361076b610838565b600091829163118cdaa760e01b8352600483016100f0565b0390fd5b60001b90565b9061079e60018060a01b0391610787565b9181191691161790565b6107b190610580565b90565b90565b906107cc6107c76107d3926107a8565b6107b4565b825461078d565b9055565b6107e1600061052c565b6107ec8260006107b7565b9061082061081a7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936107a8565b916107a8565b91610829610073565b8061083381610093565b0390a3565b610840610502565b50339056fea2646970667358221220001626b7d7499f9f720fcbe3cf752c138e58fe5f28f481aaf6035735817dd7df64736f6c634300081a00330000000000000000000000004aaef0819cd76750644855bd1694fdb0e7f11a80000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c5364500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x11", + "input": "0x60a060405261001561000f6101d3565b91610261565b61001d610033565b6107526107e082396080518160cd015261075290f35b60405190565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061006390610039565b810190811060018060401b0382111761007b57604052565b610043565b9061009361008c610033565b9283610059565b565b600080fd5b600080fd5b60018060a01b031690565b6100b39061009f565b90565b6100bf816100aa565b036100c657565b600080fd5b905051906100d8826100b6565b565b600080fd5b600080fd5b60018060401b038111610100576100fc602091610039565b0190565b610043565b60005b838110610119575050906000910152565b806020918301518185015201610108565b9092919261013f61013a826100e4565b610080565b9381855260208501908284011161015b5761015992610105565b565b6100df565b9080601f8301121561017e5781602061017b9351910161012a565b90565b6100da565b916060838303126101ce5761019b82600085016100cb565b926101a983602083016100cb565b92604082015160018060401b0381116101c9576101c69201610160565b90565b61009a565b610095565b6101f1611a8b803803806101e681610080565b928339810190610183565b909192565b6101ff906100aa565b9052565b9190610217906000602085019401906101f6565b565b610221610033565b3d6000823e3d90fd5b90565b61024161023c6102469261009f565b61022a565b61009f565b90565b6102529061022d565b90565b61025e90610249565b90565b9161026c91926102d1565b610274610033565b90610b59820182811060018060401b038211176102cc57829161029e91610b59610f328539610203565b03906000f080156102c7576102b290610255565b6080526102c56102c06102ef565b610329565b565b610219565b610043565b906102db916103ae565b565b600090565b6102ec90516100aa565b90565b6102f76102dd565b5061030260806102e2565b90565b916020610327929493610320604082019660008301906101f6565b01906101f6565b565b610374906103356104bf565b817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9161036c610363610033565b92839283610305565b0390a161054c565b565b61037f90610249565b90565b60000190565b5190565b90565b90565b6103a66103a16103ab9261038f565b61022a565b61038c565b90565b906103b8826105ff565b816103e37fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91610376565b906103ec610033565b806103f681610382565b0390a261040281610388565b61041561040f6000610392565b9161038c565b1160001461042a57610426916106d6565b505b565b5050610434610657565b610428565b90565b90565b60001b90565b61045961045461045e92610439565b61043f565b61043c565b90565b61048a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103610445565b90565b60001c90565b60018060a01b031690565b6104aa6104af9161048d565b610493565b90565b6104bc905461049e565b90565b6104c76102dd565b506104e360006104dd6104d8610461565b610706565b016104b2565b90565b6104fa6104f56104ff9261038f565b61022a565b61009f565b90565b61050b906104e6565b90565b9061051f60018060a01b039161043f565b9181191691161790565b90565b9061054161053c61054892610376565b610529565b825461050e565b9055565b8061056861056261055d6000610502565b6100aa565b916100aa565b1461058b5761058990600061058361057e610461565b610706565b0161052c565b565b6105b06105986000610502565b6000918291633173bdd160e11b835260048301610203565b0390fd5b90565b6105cb6105c66105d0926105b4565b61043f565b61043c565b90565b6105fc7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105b7565b90565b803b61061461060e6000610392565b9161038c565b146106375761063590600061062f61062a6105d3565b610706565b0161052c565b565b610653906000918291634c9c8ce360e01b835260048301610203565b0390fd5b3461066b6106656000610392565b9161038c565b1161067257565b600063b398979f60e01b81528061068b60048201610382565b0390fd5b606090565b906106a66106a1836100e4565b610080565b918252565b3d6000146106c8576106bc3d610694565b903d6000602084013e5b565b6106d061068f565b906106c6565b600080610703936106e561068f565b508390602081019051915af4906106fa6106ab565b9091909161070e565b90565b90565b151590565b906107229061071b61068f565b5015610709565b60001461072f5750610796565b61073882610388565b61074b6107456000610392565b9161038c565b148061077a575b61075a575090565b610776906000918291639996b31560e01b835260048301610203565b0390fd5b50803b61079061078a6000610392565b9161038c565b14610752565b61079f81610388565b6107b26107ac6000610392565b9161038c565b116000146107c257805190602001fd5b6000630a12f52160e11b8152806107db60048201610382565b0390fdfe608060405261000c61000e565b005b610016610041565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b60000190565b3361005b6100556100506100c2565b610023565b91610023565b146000146100b85763ffffffff60e01b6000351661008861008263278f794360e11b61002f565b9161002f565b14156000146100ae5760006334ad5dbb60e21b8152806100aa6004820161003b565b0390fd5b6100b66102fd565b565b6100ef565b600090565b6100ca6100bd565b507f000000000000000000000000000000000000000000000000000000000000000090565b6100f761033d565b610351565b90565b90565b90565b61011961011461011e926100fc565b610102565b6100ff565b90565b60405190565b600080fd5b600080fd5b9093929384831161015157841161014c576001820201920390565b61012c565b610127565b91565b600080fd5b600080fd5b61016c90610018565b90565b61017881610163565b0361017f57565b600080fd5b905035906101918261016f565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906101c79061019d565b810190811067ffffffffffffffff8211176101e157604052565b6101a7565b906101f96101f2610121565b92836101bd565b565b67ffffffffffffffff81116102195761021560209161019d565b0190565b6101a7565b90826000939282370152565b9092919261023f61023a826101fb565b6101e6565b9381855260208501908284011161025b576102599261021e565b565b610198565b9080601f8301121561027e5781602061027b9335910161022a565b90565b610193565b9190916040818403126102c45761029d8360008301610184565b92602082013567ffffffffffffffff81116102bf576102bc9201610260565b90565b61015e565b610159565b6102dd6102d86102e292610018565b610102565b610018565b90565b6102ee906102c9565b90565b6102fa906102e5565b90565b61033b61033661032f6103276103216000366103196004610105565b908092610131565b90610156565b810190610283565b91906102f1565b6103a3565b565b6103456100bd565b5061034e6104b4565b90565b60008091368280378136915af43d6000803e60001461036f573d6000f35b3d6000fd5b61037d906102e5565b90565b5190565b90565b61039b6103966103a092610384565b610102565b6100ff565b90565b906103ad8261053c565b816103d87fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91610374565b906103e1610121565b806103eb8161003b565b0390a26103f781610380565b61040a6104046000610387565b916100ff565b1160001461041f5761041b91610613565b505b565b5050610429610594565b61041d565b90565b90565b60001b90565b61044e6104496104539261042e565b610434565b610431565b90565b61047f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61043a565b90565b60001c90565b60018060a01b031690565b61049f6104a491610482565b610488565b90565b6104b19054610493565b90565b6104bc6100bd565b506104d860006104d26104cd610456565b610643565b016104a7565b90565b6104e490610023565b9052565b91906104fc906000602085019401906104db565b565b9061050f60018060a01b0391610434565b9181191691161790565b90565b9061053161052c61053892610374565b610519565b82546104fe565b9055565b803b61055161054b6000610387565b916100ff565b146105745761057290600061056c610567610456565b610643565b0161051c565b565b610590906000918291634c9c8ce360e01b8352600483016104e8565b0390fd5b346105a86105a26000610387565b916100ff565b116105af57565b600063b398979f60e01b8152806105c86004820161003b565b0390fd5b606090565b906105e36105de836101fb565b6101e6565b918252565b3d600014610605576105f93d6105d1565b903d6000602084013e5b565b61060d6105cc565b90610603565b600080610640936106226105cc565b508390602081019051915af4906106376105e8565b9091909161064b565b90565b90565b151590565b9061065f906106586105cc565b5015610646565b60001461066c57506106d3565b61067582610380565b6106886106826000610387565b916100ff565b14806106b7575b610697575090565b6106b3906000918291639996b31560e01b8352600483016104e8565b0390fd5b50803b6106cd6106c76000610387565b916100ff565b1461068f565b6106dc81610380565b6106ef6106e96000610387565b916100ff565b116000146106ff57805190602001fd5b6000630a12f52160e11b8152806107186004820161003b565b0390fdfea264697066735822122043e4e8c50f891e734dc14682393fe8d624d67844a88f7d6eccae37e704ddd1f564736f6c634300081a003360806040523461002f576100196100146100fa565b61011b565b610021610034565b61087b6102de823961087b90f35b61003a565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906100699061003f565b810190811060018060401b0382111761008157604052565b610049565b90610099610092610034565b928361005f565b565b600080fd5b60018060a01b031690565b6100b4906100a0565b90565b6100c0816100ab565b036100c757565b600080fd5b905051906100d9826100b7565b565b906020828203126100f5576100f2916000016100cc565b90565b61009b565b610118610b598038038061010d81610086565b9283398101906100db565b90565b61012490610177565b565b90565b90565b61014061013b61014592610126565b610129565b6100a0565b90565b6101519061012c565b90565b61015d906100ab565b9052565b919061017590600060208501940190610154565b565b8061019361018d6101886000610148565b6100ab565b916100ab565b146101a3576101a19061027c565b565b6101c86101b06000610148565b6000918291631e4fbdf760e01b835260048301610161565b0390fd5b60001c90565b60018060a01b031690565b6101e96101ee916101cc565b6101d2565b90565b6101fb90546101dd565b90565b60001b90565b9061021560018060a01b03916101fe565b9181191691161790565b61023361022e610238926100a0565b610129565b6100a0565b90565b6102449061021f565b90565b6102509061023b565b90565b90565b9061026b61026661027292610247565b610253565b8254610204565b9055565b60000190565b61028660006101f1565b610291826000610256565b906102c56102bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610247565b91610247565b916102ce610034565b806102d881610276565b0390a356fe60806040526004361015610013575b61049f565b61001e60003561006d565b8063715018a6146100685780638da5cb5b146100635780639623609d1461005e578063ad3cb1cc146100595763f2fde38b0361000e5761046c565b610418565b6102d6565b610106565b610099565b60e01c90565b60405190565b600080fd5b600080fd5b600091031261008e57565b61007e565b60000190565b346100c7576100a9366004610083565b6100b16104f8565b6100b9610073565b806100c381610093565b0390f35b610079565b60018060a01b031690565b6100e0906100cc565b90565b6100ec906100d7565b9052565b9190610104906000602085019401906100e3565b565b3461013657610116366004610083565b610132610121610539565b610129610073565b918291826100f0565b0390f35b610079565b600080fd5b610149906100d7565b90565b61015581610140565b0361015c57565b600080fd5b9050359061016e8261014c565b565b610179816100d7565b0361018057565b600080fd5b9050359061019282610170565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906101c89061019e565b810190811067ffffffffffffffff8211176101e257604052565b6101a8565b906101fa6101f3610073565b92836101be565b565b67ffffffffffffffff811161021a5761021660209161019e565b0190565b6101a8565b90826000939282370152565b9092919261024061023b826101fc565b6101e7565b9381855260208501908284011161025c5761025a9261021f565b565b610199565b9080601f8301121561027f5781602061027c9335910161022b565b90565b610194565b916060838303126102d15761029c8260008501610161565b926102aa8360208301610185565b92604082013567ffffffffffffffff81116102cc576102c99201610261565b90565b61013b565b61007e565b6102ea6102e4366004610284565b916106b8565b6102f2610073565b806102fc81610093565b0390f35b67ffffffffffffffff811161031e5761031a60209161019e565b0190565b6101a8565b9061033561033083610300565b6101e7565b918252565b60007f352e302e30000000000000000000000000000000000000000000000000000000910152565b61036c6005610323565b906103796020830161033a565b565b610383610362565b90565b61038e61037b565b90565b610399610386565b90565b5190565b60209181520190565b60005b8381106103bd575050906000910152565b8060209183015181850152016103ac565b6103ed6103f66020936103fb936103e48161039c565b938480936103a0565b958691016103a9565b61019e565b0190565b61041591602082019160008184039101526103ce565b90565b3461044857610428366004610083565b610444610433610391565b61043b610073565b918291826103ff565b0390f35b610079565b906020828203126104675761046491600001610185565b90565b61007e565b3461049a5761048461047f36600461044d565b61072d565b61048c610073565b8061049681610093565b0390f35b610079565b600080fd5b6104ac610738565b6104b46104e4565b565b90565b90565b6104d06104cb6104d5926104b6565b6104b9565b6100cc565b90565b6104e1906104bc565b90565b6104f66104f160006104d8565b6107d7565b565b6105006104a4565b565b600090565b60001c90565b60018060a01b031690565b61052461052991610507565b61050d565b90565b6105369054610518565b90565b610541610502565b5061054c600061052c565b90565b90610562929161055d610738565b610629565b565b61057861057361057d926100cc565b6104b9565b6100cc565b90565b61058990610564565b90565b61059590610580565b90565b600080fd5b60e01b90565b60009103126105ae57565b61007e565b5190565b60209181520190565b6105df6105e86020936105ed936105d6816105b3565b938480936105b7565b958691016103a9565b61019e565b0190565b9161061592610608604082019360008301906100e3565b60208184039101526105c0565b90565b610620610073565b3d6000823e3d90fd5b6106329061058c565b91634f1ef28634939093929193813b156106b3576000936106649161066f610658610073565b9788968795869461059d565b8452600484016105f1565b03925af180156106ae57610681575b50565b6106a19060003d81116106a7575b61069981836101be565b8101906105a3565b3861067e565b503d61068f565b610618565b610598565b906106c3929161054f565b565b6106d6906106d1610738565b6106d8565b565b806106f46106ee6106e960006104d8565b6100d7565b916100d7565b1461070457610702906107d7565b565b61072961071160006104d8565b6000918291631e4fbdf760e01b8352600483016100f0565b0390fd5b610736906106c5565b565b610740610539565b61075961075361074e610838565b6100d7565b916100d7565b0361076057565b61078361076b610838565b600091829163118cdaa760e01b8352600483016100f0565b0390fd5b60001b90565b9061079e60018060a01b0391610787565b9181191691161790565b6107b190610580565b90565b90565b906107cc6107c76107d3926107a8565b6107b4565b825461078d565b9055565b6107e1600061052c565b6107ec8260006107b7565b9061082061081a7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936107a8565b916107a8565b91610829610073565b8061083381610093565b0390a3565b610840610502565b50339056fea2646970667358221220001626b7d7499f9f720fcbe3cf752c138e58fe5f28f481aaf6035735817dd7df64736f6c634300081a0033000000000000000000000000322b6543e76e22f2a165b4e78a7d3f7815295377000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c5364500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x16", "chainId": "0xaa36a7" }, "additionalContracts": [ { "transactionType": "CREATE", - "address": "0xa9527a0e445d0bd93cdc7eb5ed881a0048e4400f", + "address": "0x1d492fcabf9b1ad1631ce6cb9453083ac0c49cd7", "initCode": "0x60806040523461002f576100196100146100fa565b61011b565b610021610034565b61087b6102de823961087b90f35b61003a565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906100699061003f565b810190811060018060401b0382111761008157604052565b610049565b90610099610092610034565b928361005f565b565b600080fd5b60018060a01b031690565b6100b4906100a0565b90565b6100c0816100ab565b036100c757565b600080fd5b905051906100d9826100b7565b565b906020828203126100f5576100f2916000016100cc565b90565b61009b565b610118610b598038038061010d81610086565b9283398101906100db565b90565b61012490610177565b565b90565b90565b61014061013b61014592610126565b610129565b6100a0565b90565b6101519061012c565b90565b61015d906100ab565b9052565b919061017590600060208501940190610154565b565b8061019361018d6101886000610148565b6100ab565b916100ab565b146101a3576101a19061027c565b565b6101c86101b06000610148565b6000918291631e4fbdf760e01b835260048301610161565b0390fd5b60001c90565b60018060a01b031690565b6101e96101ee916101cc565b6101d2565b90565b6101fb90546101dd565b90565b60001b90565b9061021560018060a01b03916101fe565b9181191691161790565b61023361022e610238926100a0565b610129565b6100a0565b90565b6102449061021f565b90565b6102509061023b565b90565b90565b9061026b61026661027292610247565b610253565b8254610204565b9055565b60000190565b61028660006101f1565b610291826000610256565b906102c56102bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610247565b91610247565b916102ce610034565b806102d881610276565b0390a356fe60806040526004361015610013575b61049f565b61001e60003561006d565b8063715018a6146100685780638da5cb5b146100635780639623609d1461005e578063ad3cb1cc146100595763f2fde38b0361000e5761046c565b610418565b6102d6565b610106565b610099565b60e01c90565b60405190565b600080fd5b600080fd5b600091031261008e57565b61007e565b60000190565b346100c7576100a9366004610083565b6100b16104f8565b6100b9610073565b806100c381610093565b0390f35b610079565b60018060a01b031690565b6100e0906100cc565b90565b6100ec906100d7565b9052565b9190610104906000602085019401906100e3565b565b3461013657610116366004610083565b610132610121610539565b610129610073565b918291826100f0565b0390f35b610079565b600080fd5b610149906100d7565b90565b61015581610140565b0361015c57565b600080fd5b9050359061016e8261014c565b565b610179816100d7565b0361018057565b600080fd5b9050359061019282610170565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906101c89061019e565b810190811067ffffffffffffffff8211176101e257604052565b6101a8565b906101fa6101f3610073565b92836101be565b565b67ffffffffffffffff811161021a5761021660209161019e565b0190565b6101a8565b90826000939282370152565b9092919261024061023b826101fc565b6101e7565b9381855260208501908284011161025c5761025a9261021f565b565b610199565b9080601f8301121561027f5781602061027c9335910161022b565b90565b610194565b916060838303126102d15761029c8260008501610161565b926102aa8360208301610185565b92604082013567ffffffffffffffff81116102cc576102c99201610261565b90565b61013b565b61007e565b6102ea6102e4366004610284565b916106b8565b6102f2610073565b806102fc81610093565b0390f35b67ffffffffffffffff811161031e5761031a60209161019e565b0190565b6101a8565b9061033561033083610300565b6101e7565b918252565b60007f352e302e30000000000000000000000000000000000000000000000000000000910152565b61036c6005610323565b906103796020830161033a565b565b610383610362565b90565b61038e61037b565b90565b610399610386565b90565b5190565b60209181520190565b60005b8381106103bd575050906000910152565b8060209183015181850152016103ac565b6103ed6103f66020936103fb936103e48161039c565b938480936103a0565b958691016103a9565b61019e565b0190565b61041591602082019160008184039101526103ce565b90565b3461044857610428366004610083565b610444610433610391565b61043b610073565b918291826103ff565b0390f35b610079565b906020828203126104675761046491600001610185565b90565b61007e565b3461049a5761048461047f36600461044d565b61072d565b61048c610073565b8061049681610093565b0390f35b610079565b600080fd5b6104ac610738565b6104b46104e4565b565b90565b90565b6104d06104cb6104d5926104b6565b6104b9565b6100cc565b90565b6104e1906104bc565b90565b6104f66104f160006104d8565b6107d7565b565b6105006104a4565b565b600090565b60001c90565b60018060a01b031690565b61052461052991610507565b61050d565b90565b6105369054610518565b90565b610541610502565b5061054c600061052c565b90565b90610562929161055d610738565b610629565b565b61057861057361057d926100cc565b6104b9565b6100cc565b90565b61058990610564565b90565b61059590610580565b90565b600080fd5b60e01b90565b60009103126105ae57565b61007e565b5190565b60209181520190565b6105df6105e86020936105ed936105d6816105b3565b938480936105b7565b958691016103a9565b61019e565b0190565b9161061592610608604082019360008301906100e3565b60208184039101526105c0565b90565b610620610073565b3d6000823e3d90fd5b6106329061058c565b91634f1ef28634939093929193813b156106b3576000936106649161066f610658610073565b9788968795869461059d565b8452600484016105f1565b03925af180156106ae57610681575b50565b6106a19060003d81116106a7575b61069981836101be565b8101906105a3565b3861067e565b503d61068f565b610618565b610598565b906106c3929161054f565b565b6106d6906106d1610738565b6106d8565b565b806106f46106ee6106e960006104d8565b6100d7565b916100d7565b1461070457610702906107d7565b565b61072961071160006104d8565b6000918291631e4fbdf760e01b8352600483016100f0565b0390fd5b610736906106c5565b565b610740610539565b61075961075361074e610838565b6100d7565b916100d7565b0361076057565b61078361076b610838565b600091829163118cdaa760e01b8352600483016100f0565b0390fd5b60001b90565b9061079e60018060a01b0391610787565b9181191691161790565b6107b190610580565b90565b90565b906107cc6107c76107d3926107a8565b6107b4565b825461078d565b9055565b6107e1600061052c565b6107ec8260006107b7565b9061082061081a7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936107a8565b916107a8565b91610829610073565b8061083381610093565b0390a3565b610840610502565b50339056fea2646970667358221220001626b7d7499f9f720fcbe3cf752c138e58fe5f28f481aaf6035735817dd7df64736f6c634300081a0033000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c53645" } ], "isFixedGasLimit": false }, { - "hash": "0xb1d1883a6de3b02afe4ba2682da8730ceba88d132458b228b05bd66779ae49b0", + "hash": "0xa53a13c5a9d801698af243e992580139d58cecfe6c6006c36a1e0ca26175b458", "transactionType": "CALL", "contractName": null, - "contractAddress": "0x60076ebcca7ad8825f10d3649378931d9c1cb24e", + "contractAddress": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", "function": "initialize(address,address,address,uint256,uint256)", "arguments": [ "0xcAd73213b07F35265fa46298a7Cc3405C3c53645", - "0x443f63a625a8424e62db5B252A7aa5d0CF94828B", - "0x8B5E338c47Dee476e7437060f625aDD05d0CFED7", + "0x5A58b845e72DC32968fA9921bF2A800Ade3e4cfD", + "0x51CadF0a4b497552A9B294BEAAa0579Bf4Cc0913", "15724800", "50000000000000000000000" ], "transaction": { "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", - "to": "0x60076ebcca7ad8825f10d3649378931d9c1cb24e", - "gas": "0x51004", + "to": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", + "gas": "0x55c62", "value": "0x0", - "input": "0xa6b63eb8000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c53645000000000000000000000000443f63a625a8424e62db5b252a7aa5d0cf94828b0000000000000000000000008b5e338c47dee476e7437060f625add05d0cfed70000000000000000000000000000000000000000000000000000000000eff100000000000000000000000000000000000000000000000a968163f0a57b400000", - "nonce": "0x12", + "input": "0xa6b63eb8000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c536450000000000000000000000005a58b845e72dc32968fa9921bf2a800ade3e4cfd00000000000000000000000051cadf0a4b497552a9b294beaaa0579bf4cc09130000000000000000000000000000000000000000000000000000000000eff100000000000000000000000000000000000000000000000a968163f0a57b400000", + "nonce": "0x17", "chainId": "0xaa36a7" }, "additionalContracts": [], @@ -107,200 +107,200 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x6b21ac", + "cumulativeGasUsed": "0xb804f8", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x2252727054b964643f99ace96279a725bffe4cc6e77185204559946577fac676", - "transactionIndex": "0x32", - "blockHash": "0x183b5a6f93b93dce45c7083ed9e2c7e4cba25f2b3665051662c64396c250d57d", - "blockNumber": "0x606790", + "transactionHash": "0x511c99117ed16c6274aef4ace0451d26b9e0b43cb502376c20c627015c4013e9", + "transactionIndex": "0x4e", + "blockHash": "0x9878d37d0edaf9110e23107a997d285851a3a6ee4a7bc76bfedd00ae8e6dfc40", + "blockNumber": "0x60f1d1", "gasUsed": "0xd8cdc", - "effectiveGasPrice": "0x12245e78c", + "effectiveGasPrice": "0x16f043", "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", "to": null, - "contractAddress": "0x443f63a625a8424e62db5b252a7aa5d0cf94828b" + "contractAddress": "0x5a58b845e72dc32968fa9921bf2a800ade3e4cfd" }, { "status": "0x1", - "cumulativeGasUsed": "0x705abf", + "cumulativeGasUsed": "0x91afa0", "logs": [ { - "address": "0x8b5e338c47dee476e7437060f625add05d0cfed7", + "address": "0x51cadf0a4b497552a9b294beaaa0579bf4cc0913", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c53645" ], "data": "0x", - "blockHash": "0x7ed1f83c6150e1561c05745c59e10ea384a865108ddf2bec3d73a12a71c59a6e", - "blockNumber": "0x606792", - "transactionHash": "0x83fb5819942c26d26ea8c71b3c91b823f1b58e8d3e1998e7367d7d88a04d9dc5", - "transactionIndex": "0x42", - "logIndex": "0x4f", + "blockHash": "0xfcb4a419882e7beb9478207801fb53bc224bbf971fe48ebfc5694c0670fc79c0", + "blockNumber": "0x60f1d2", + "transactionHash": "0x75c9d9b0946f8924ce82be4264e586b3149a8ae4d088e090cc8183c9a0a169c3", + "transactionIndex": "0x3d", + "logIndex": "0x3d", "removed": false } ], - "logsBloom": "0x02000000000000000000000000000000000000000000000000800000000000000400000000000000000000000000000000000000001000000000000000000000000000000000008000000000000000000001000000000000000000000000000000040000020000000000000000000a00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "logsBloom": "0x02000000000000000000000000000000000000000000000000800020000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000001000001000000000000000000000000000000040000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000200000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x83fb5819942c26d26ea8c71b3c91b823f1b58e8d3e1998e7367d7d88a04d9dc5", - "transactionIndex": "0x42", - "blockHash": "0x7ed1f83c6150e1561c05745c59e10ea384a865108ddf2bec3d73a12a71c59a6e", - "blockNumber": "0x606792", + "transactionHash": "0x75c9d9b0946f8924ce82be4264e586b3149a8ae4d088e090cc8183c9a0a169c3", + "transactionIndex": "0x3d", + "blockHash": "0xfcb4a419882e7beb9478207801fb53bc224bbf971fe48ebfc5694c0670fc79c0", + "blockNumber": "0x60f1d2", "gasUsed": "0x10fa35", - "effectiveGasPrice": "0x11bc11fa0", + "effectiveGasPrice": "0x16f043", "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", "to": null, - "contractAddress": "0x8b5e338c47dee476e7437060f625add05d0cfed7" + "contractAddress": "0x51cadf0a4b497552a9b294beaaa0579bf4cc0913" }, { "status": "0x1", - "cumulativeGasUsed": "0x14b5025", + "cumulativeGasUsed": "0x157e2f4", "logs": [ { - "address": "0x4aaef0819cd76750644855bd1694fdb0e7f11a80", + "address": "0x322b6543e76e22f2a165b4e78a7d3f7815295377", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", - "blockHash": "0x5e5fbb0bbeefa054c8171cab15912973bc331613eaae7f3910ef50b621d9eb10", - "blockNumber": "0x606797", - "transactionHash": "0xed34cd4f0643fd6d7cf32fbfe25ae24a830acc023dae93e61f91d6a09dbf3fef", - "transactionIndex": "0x3b", - "logIndex": "0x4b", + "blockHash": "0x8d22d0234d26dcbd38147b6164dd19dbc057dc61cb7178bf297b24613075f9f6", + "blockNumber": "0x60f1d3", + "transactionHash": "0x9690e59e4b397852947dc644630f781b5fc13044166a46b99ae7766bc7836608", + "transactionIndex": "0x6d", + "logIndex": "0x9d", "removed": false } ], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000002000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000002000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xed34cd4f0643fd6d7cf32fbfe25ae24a830acc023dae93e61f91d6a09dbf3fef", - "transactionIndex": "0x3b", - "blockHash": "0x5e5fbb0bbeefa054c8171cab15912973bc331613eaae7f3910ef50b621d9eb10", - "blockNumber": "0x606797", - "gasUsed": "0x5243c0", - "effectiveGasPrice": "0x15b50094b", + "transactionHash": "0x9690e59e4b397852947dc644630f781b5fc13044166a46b99ae7766bc7836608", + "transactionIndex": "0x6d", + "blockHash": "0x8d22d0234d26dcbd38147b6164dd19dbc057dc61cb7178bf297b24613075f9f6", + "blockNumber": "0x60f1d3", + "gasUsed": "0x525206", + "effectiveGasPrice": "0x16f043", "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", "to": null, - "contractAddress": "0x4aaef0819cd76750644855bd1694fdb0e7f11a80" + "contractAddress": "0x322b6543e76e22f2a165b4e78a7d3f7815295377" }, { "status": "0x1", - "cumulativeGasUsed": "0xf74c1f", + "cumulativeGasUsed": "0xa9f9de", "logs": [ { - "address": "0x60076ebcca7ad8825f10d3649378931d9c1cb24e", + "address": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", "topics": [ "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", - "0x0000000000000000000000004aaef0819cd76750644855bd1694fdb0e7f11a80" + "0x000000000000000000000000322b6543e76e22f2a165b4e78a7d3f7815295377" ], "data": "0x", - "blockHash": "0x44ccf7e8d7dedc7aae459ebab3070deb4b4042f6bca3ee403ae9e0a4a3167091", - "blockNumber": "0x606798", - "transactionHash": "0x40b6ee0e135749707ef0a1505b08dab1c3c4048fe1f097eafba627f970a2bcb6", - "transactionIndex": "0x40", - "logIndex": "0x68", + "blockHash": "0xb9ae38b447207c9705ec4e47c40cee739ba055e1a12fb8a59cfceea319116363", + "blockNumber": "0x60f1d4", + "transactionHash": "0x10c9e15442394db4ca349c2be1bbf0be64a0be5debf5afd8a21c9d0292bee934", + "transactionIndex": "0x3e", + "logIndex": "0x81", "removed": false }, { - "address": "0xa9527a0e445d0bd93cdc7eb5ed881a0048e4400f", + "address": "0x1d492fcabf9b1ad1631ce6cb9453083ac0c49cd7", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c53645" ], "data": "0x", - "blockHash": "0x44ccf7e8d7dedc7aae459ebab3070deb4b4042f6bca3ee403ae9e0a4a3167091", - "blockNumber": "0x606798", - "transactionHash": "0x40b6ee0e135749707ef0a1505b08dab1c3c4048fe1f097eafba627f970a2bcb6", - "transactionIndex": "0x40", - "logIndex": "0x69", + "blockHash": "0xb9ae38b447207c9705ec4e47c40cee739ba055e1a12fb8a59cfceea319116363", + "blockNumber": "0x60f1d4", + "transactionHash": "0x10c9e15442394db4ca349c2be1bbf0be64a0be5debf5afd8a21c9d0292bee934", + "transactionIndex": "0x3e", + "logIndex": "0x82", "removed": false }, { - "address": "0x60076ebcca7ad8825f10d3649378931d9c1cb24e", + "address": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", "topics": [ "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9527a0e445d0bd93cdc7eb5ed881a0048e4400f", - "blockHash": "0x44ccf7e8d7dedc7aae459ebab3070deb4b4042f6bca3ee403ae9e0a4a3167091", - "blockNumber": "0x606798", - "transactionHash": "0x40b6ee0e135749707ef0a1505b08dab1c3c4048fe1f097eafba627f970a2bcb6", - "transactionIndex": "0x40", - "logIndex": "0x6a", + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d492fcabf9b1ad1631ce6cb9453083ac0c49cd7", + "blockHash": "0xb9ae38b447207c9705ec4e47c40cee739ba055e1a12fb8a59cfceea319116363", + "blockNumber": "0x60f1d4", + "transactionHash": "0x10c9e15442394db4ca349c2be1bbf0be64a0be5debf5afd8a21c9d0292bee934", + "transactionIndex": "0x3e", + "logIndex": "0x83", "removed": false } ], - "logsBloom": "0x02000000000020000000000000000000400000000000000000800000000000000000000000000008000080000000000000400000001000000000000000000000000000000000000000000000000002000001000000000000000000000000000000840000020000004000000000000800000000800000000000000000000010400000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000400000000000000000120000000000000000000000000000000000000000000000000000000000000000000", + "logsBloom": "0x02000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000001000000000000010000000000000000000000000000000000002000001000000000000000000000000000000040000020000000000000000000802000000800000000000040000000000400000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000001000000000400000000010000000000000020000000000000008000000000000000000400000000000000000020000000000200000000000000020000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x40b6ee0e135749707ef0a1505b08dab1c3c4048fe1f097eafba627f970a2bcb6", - "transactionIndex": "0x40", - "blockHash": "0x44ccf7e8d7dedc7aae459ebab3070deb4b4042f6bca3ee403ae9e0a4a3167091", - "blockNumber": "0x606798", + "transactionHash": "0x10c9e15442394db4ca349c2be1bbf0be64a0be5debf5afd8a21c9d0292bee934", + "transactionIndex": "0x3e", + "blockHash": "0xb9ae38b447207c9705ec4e47c40cee739ba055e1a12fb8a59cfceea319116363", + "blockNumber": "0x60f1d4", "gasUsed": "0x107f4f", - "effectiveGasPrice": "0x17b1077e4", + "effectiveGasPrice": "0x16f044", "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", "to": null, - "contractAddress": "0x60076ebcca7ad8825f10d3649378931d9c1cb24e" + "contractAddress": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3" }, { "status": "0x1", - "cumulativeGasUsed": "0x5c2de3", + "cumulativeGasUsed": "0x560033", "logs": [ { - "address": "0x60076ebcca7ad8825f10d3649378931d9c1cb24e", + "address": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000cad73213b07f35265fa46298a7cc3405c3c53645" ], "data": "0x", - "blockHash": "0xc666061b9ee2518a4b7822926ff8f54b84eb59513e52bda1ed45a17a182ae6de", - "blockNumber": "0x606799", - "transactionHash": "0xb1d1883a6de3b02afe4ba2682da8730ceba88d132458b228b05bd66779ae49b0", - "transactionIndex": "0x3c", - "logIndex": "0x45", + "blockHash": "0xacb2d55b66ec5b31d9b18c874002a2be1f020a8b897b049121b43824ece736ac", + "blockNumber": "0x60f1d5", + "transactionHash": "0xa53a13c5a9d801698af243e992580139d58cecfe6c6006c36a1e0ca26175b458", + "transactionIndex": "0x35", + "logIndex": "0x3d", "removed": false }, { - "address": "0x60076ebcca7ad8825f10d3649378931d9c1cb24e", + "address": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0xc666061b9ee2518a4b7822926ff8f54b84eb59513e52bda1ed45a17a182ae6de", - "blockNumber": "0x606799", - "transactionHash": "0xb1d1883a6de3b02afe4ba2682da8730ceba88d132458b228b05bd66779ae49b0", - "transactionIndex": "0x3c", - "logIndex": "0x46", + "blockHash": "0xacb2d55b66ec5b31d9b18c874002a2be1f020a8b897b049121b43824ece736ac", + "blockNumber": "0x60f1d5", + "transactionHash": "0xa53a13c5a9d801698af243e992580139d58cecfe6c6006c36a1e0ca26175b458", + "transactionIndex": "0x35", + "logIndex": "0x3e", "removed": false } ], - "logsBloom": "0x02000000000000000000000000000000000000000000000000800000000000000000000000000000000080000000000000000000001000000000000000000000000000000000000000000000000000000001000000000000000000000000000000040000020000004000000000000800000000000000000000000000000010400000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "logsBloom": "0x02000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000001000000000000000000000000000000040000020000000000000000000800000000000000000000040000000000400000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000008000000000000000000004000000000000000020000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xb1d1883a6de3b02afe4ba2682da8730ceba88d132458b228b05bd66779ae49b0", - "transactionIndex": "0x3c", - "blockHash": "0xc666061b9ee2518a4b7822926ff8f54b84eb59513e52bda1ed45a17a182ae6de", - "blockNumber": "0x606799", - "gasUsed": "0x3aa4c", - "effectiveGasPrice": "0x1968be5ff", + "transactionHash": "0xa53a13c5a9d801698af243e992580139d58cecfe6c6006c36a1e0ca26175b458", + "transactionIndex": "0x35", + "blockHash": "0xacb2d55b66ec5b31d9b18c874002a2be1f020a8b897b049121b43824ece736ac", + "blockNumber": "0x60f1d5", + "gasUsed": "0x3aa62", + "effectiveGasPrice": "0x16f044", "from": "0xcad73213b07f35265fa46298a7cc3405c3c53645", - "to": "0x60076ebcca7ad8825f10d3649378931d9c1cb24e", + "to": "0x3a09441fbe7279cea668e05d9459b61821bf0dd3", "contractAddress": null } ], "libraries": [], "pending": [], "returns": { - "rewardsDistributor": { - "internal_type": "contract RewardsDistributor", - "value": "0x8B5E338c47Dee476e7437060f625aDD05d0CFED7" - }, "stakingProxy": { "internal_type": "contract Staking", - "value": "0x60076ebcca7aD8825F10d3649378931D9C1cB24E" + "value": "0x3a09441FBe7279CEa668E05d9459B61821Bf0dD3" + }, + "rewardsDistributor": { + "internal_type": "contract RewardsDistributor", + "value": "0x51CadF0a4b497552A9B294BEAAa0579Bf4Cc0913" } }, - "timestamp": 1721089445, + "timestamp": 1721609738, "chain": 11155111, - "commit": "ffa5272" + "commit": "40cfed7" } \ No newline at end of file From 62b72e7348c735904c0b919b93fb674fbd7efd98 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Wed, 24 Jul 2024 09:37:32 -0300 Subject: [PATCH 08/17] forge install: solady v0.0.227 --- .gitmodules | 3 +++ lib/solady | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/solady diff --git a/.gitmodules b/.gitmodules index 9be1e9d..e0b7c02 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "lib/solmate"] path = lib/solmate url = https://github.com/transmissions11/solmate +[submodule "lib/solady"] + path = lib/solady + url = https://github.com/Vectorized/solady diff --git a/lib/solady b/lib/solady new file mode 160000 index 0000000..1f43cc8 --- /dev/null +++ b/lib/solady @@ -0,0 +1 @@ +Subproject commit 1f43cc8005cc3b3c8361dd7dbdd2cdeaf0f99e66 From 1643af2e77eb73aa4767ce7fe875bf9e6cb953f5 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Wed, 24 Jul 2024 09:49:21 -0300 Subject: [PATCH 09/17] use BaseStaking for DelegatStaking --- remappings.txt | 1 + src/BaseStaking.sol | 14 ++- src/DelegateStaking.sol | 187 ++-------------------------------------- src/Staking.sol | 19 +--- test/Staking.t.sol | 2 +- 5 files changed, 24 insertions(+), 199 deletions(-) diff --git a/remappings.txt b/remappings.txt index 63bbb7d..58c82ad 100644 --- a/remappings.txt +++ b/remappings.txt @@ -2,3 +2,4 @@ @openzeppelin=lib/openzeppelin-contracts/ @openzeppelin-upgradeable=lib/openzeppelin-contracts-upgradeable/ @solmate=lib/solmate/src/ +@solady=lib/solady/src diff --git a/src/BaseStaking.sol b/src/BaseStaking.sol index 9f8c757..e809971 100644 --- a/src/BaseStaking.sol +++ b/src/BaseStaking.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.26; -import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import {OwnableUpgradeable} from "@openzeppelin-upgradeable/contracts/access/OwnableUpgradeable.sol"; import {ERC20VotesUpgradeable} from "@openzeppelin-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; +import {EnumerableSetLib} from "@solady/utils/EnumerableSetLib.sol"; import {IERC20} from "./interfaces/IERC20.sol"; import {SafeTransferLib} from "./libraries/SafeTransferLib.sol"; @@ -18,6 +18,7 @@ abstract contract BaseStaking is OwnableUpgradeable, ERC20VotesUpgradeable { /*////////////////////////////////////////////////////////////// LIBRARIES //////////////////////////////////////////////////////////////*/ + using EnumerableSetLib for EnumerableSetLib.Uint256Set; using SafeTransferLib for IERC20; @@ -49,6 +50,10 @@ abstract contract BaseStaking is OwnableUpgradeable, ERC20VotesUpgradeable { /// @notice how many SHU a user has locked mapping(address user => uint256 totalLocked) public totalLocked; + // @notice stake ids belonging to a user + mapping(address user => EnumerableSetLib.Uint256Set stakeIds) + internal userStakes; + /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ @@ -202,6 +207,13 @@ abstract contract BaseStaking is OwnableUpgradeable, ERC20VotesUpgradeable { return shares.mulDivDown(_totalAssets() + 1, totalSupply() + 1); } + /// @notice Get the stake ids belonging to a user + function getUserStakeIds( + address user + ) external view returns (uint256[] memory) { + return userStakes[user].values(); + } + function maxWithdraw(address user) public view virtual returns (uint256); /*////////////////////////////////////////////////////////////// diff --git a/src/DelegateStaking.sol b/src/DelegateStaking.sol index fbca4c6..d0f4232 100644 --- a/src/DelegateStaking.sol +++ b/src/DelegateStaking.sol @@ -1,10 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.26; -import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; +import {EnumerableSetLib} from "@solady/utils/EnumerableSetLib.sol"; import {OwnableUpgradeable} from "@openzeppelin-upgradeable/contracts/access/OwnableUpgradeable.sol"; import {ERC20VotesUpgradeable} from "@openzeppelin-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; +import {BaseStaking} from "./BaseStaking.sol"; import {IERC20} from "./interfaces/IERC20.sol"; import {SafeTransferLib} from "./libraries/SafeTransferLib.sol"; import {FixedPointMathLib} from "./libraries/FixedPointMathLib.sol"; @@ -20,7 +21,7 @@ contract DelegateStaking is BaseStaking { /*////////////////////////////////////////////////////////////// LIBRARIES //////////////////////////////////////////////////////////////*/ - using EnumerableSet for EnumerableSet.UintSet; + using EnumerableSetLib for EnumerableSetLib.Uint256Set; using SafeTransferLib for IERC20; @@ -28,25 +29,10 @@ contract DelegateStaking is BaseStaking { VARIABLES //////////////////////////////////////////////////////////////*/ - /// @notice the staking token, i.e. SHU - /// @dev set in initialize, can't be changed - IERC20 public stakingToken; - - /// @notice the rewards distributor contract - /// @dev only owner can change - IRewardsDistributor public rewardsDistributor; - /// @notice the staking contract /// @dev only owner can change IStaking public staking; - /// @notice Unique identifier that will be used for the next stake. - uint256 internal nextStakeId; - - /// @notice the lock period in seconds - /// @dev only owner can change - uint256 public lockPeriod; - /*////////////////////////////////////////////////////////////// STRUCTS //////////////////////////////////////////////////////////////*/ @@ -67,12 +53,6 @@ contract DelegateStaking is BaseStaking { /// @notice stores the metadata associated with a given stake mapping(uint256 id => Stake _stake) public stakes; - // @notice stake ids belonging to a user - mapping(address user => EnumerableSet.UintSet stakeIds) private userStakes; - - /// @notice how many SHU a user has locked - mapping(address user => uint256 totalLocked) public totalLocked; - /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ @@ -88,28 +68,13 @@ contract DelegateStaking is BaseStaking { /// @notice Emitted when a keyper unstakes SHU event Unstaked(address indexed user, uint256 amount, uint256 shares); - /// @notice Emitted when a keyper claims rewards - event RewardsClaimed(address indexed user, uint256 rewards); - - /// @notice Emitted when the rewards distributor is changed - event NewRewardsDistributor(address indexed rewardsDistributor); - /// @notice Emitted when a new staking contract is set event NewStakingContract(address indexed stakingContract); - /// @notice Emitted when the lock period is changed - event NewLockPeriod(uint256 indexed lockPeriod); - /*////////////////////////////////////////////////////////////// ERRORS //////////////////////////////////////////////////////////////*/ - /// @notice Thrown when transfer/tranferFrom is called - error TransferDisabled(); - - /// @notice Thrown when a keyper has no shares - error UserHasNoShares(); - /// @notice Trown when amount is zero error ZeroAmount(); @@ -120,32 +85,13 @@ contract DelegateStaking is BaseStaking { /// @notice Thrown when someone try to unstake a stake that doesn't exist error StakeDoesNotExist(); - /// @notice Thrown when someone try to unstake a amount that is greater than - /// the stake amount belonging to the stake id - error WithdrawAmountTooHigh(); - /// @notice Thrown when someone try to unstake a stake that is still locked error StakeIsStillLocked(); - /// @notice Thrown when a keyper try to claim rewards but has no rewards to - /// claim - error NoRewardsToClaim(); - - /// @notice Thrown when the argument is the zero address - error AddressZero(); - /*////////////////////////////////////////////////////////////// MODIFIERS //////////////////////////////////////////////////////////////*/ - /// @notice Update rewards for a keyper - modifier updateRewards() { - // Distribute rewards - rewardsDistributor.collectRewards(); - - _; - } - /// @notice Ensure logic contract is unusable constructor() { _disableInitializers(); @@ -284,54 +230,10 @@ contract DelegateStaking is BaseStaking { emit Unstaked(user, amount, shares); } - /// @notice Claim rewards - /// - If no amount is specified, will claim all the rewards - /// - If the amount is specified, the amount must be less than the - /// maximum withdrawable amount. The maximum withdrawable amount - /// is the total amount of assets the user has minus the - /// total locked amount - /// - If the claim results in a balance less than the total locked - /// amount, the claim will be rejected - /// - The keyper can claim the rewards at any time as longs there is - /// a reward to claim - /// @param amount The amount of rewards to claim - function claimRewards( - uint256 amount - ) external updateRewards returns (uint256 rewards) { - address user = msg.sender; - - // Prevents the keyper from claiming more than they should - uint256 maxWithdrawAmount = maxWithdraw(user); - - rewards = _calculateWithdrawAmount(amount, maxWithdrawAmount); - - require(rewards > 0, NoRewardsToClaim()); - - // Calculates the amount of shares to burn - uint256 shares = previewWithdraw(rewards); - - _burn(user, shares); - - stakingToken.safeTransfer(user, rewards); - - emit RewardsClaimed(user, rewards); - } - /*////////////////////////////////////////////////////////////// RESTRICTED FUNCTIONS //////////////////////////////////////////////////////////////*/ - /// @notice Set the rewards distributor contract - /// @param _rewardsDistributor The address of the rewards distributor contract - function setRewardsDistributor( - address _rewardsDistributor - ) external onlyOwner { - require(_rewardsDistributor != address(0), AddressZero()); - rewardsDistributor = IRewardsDistributor(_rewardsDistributor); - - emit NewRewardsDistributor(_rewardsDistributor); - } - function setStakingContract(address _stakingContract) external onlyOwner { require(_stakingContract != address(0), AddressZero()); staking = IStaking(_stakingContract); @@ -339,68 +241,10 @@ contract DelegateStaking is BaseStaking { emit NewStakingContract(_stakingContract); } - /// @notice Set the lock period - /// @param _lockPeriod The lock period in seconds - function setLockPeriod(uint256 _lockPeriod) external onlyOwner { - lockPeriod = _lockPeriod; - - emit NewLockPeriod(_lockPeriod); - } - - /*////////////////////////////////////////////////////////////// - TRANSFER LOGIC - //////////////////////////////////////////////////////////////*/ - - /// @notice Transfer is disabled - function transfer(address, uint256) public pure override returns (bool) { - revert TransferDisabled(); - } - - /// @notice Transfer is disabled - function transferFrom( - address, - address, - uint256 - ) public pure override returns (bool) { - revert TransferDisabled(); - } - /*////////////////////////////////////////////////////////////// - VIEW FUNCTIONS + OVERRIDE //////////////////////////////////////////////////////////////*/ - /// @notice Get the stake ids belonging to a user - function getUserStakeIds( - address keyper - ) external view returns (uint256[] memory) { - return userStakes[keyper].values(); - } - - function previewWithdraw( - uint256 assets - ) public view virtual returns (uint256) { - // sum + 1 on both sides to prevent donation attack - return assets.mulDivUp(totalSupply() + 1, _totalAssets() + 1); - } - - /// @notice Get the total amount of shares the assets are worth - /// @param assets The amount of assets - function convertToShares( - uint256 assets - ) public view virtual returns (uint256) { - // sum + 1 on both sides to prevent donation attack - return assets.mulDivDown(totalSupply() + 1, _totalAssets() + 1); - } - - /// @notice Get the total amount of assets the shares are worth - /// @param shares The amount of shares - function convertToAssets( - uint256 shares - ) public view virtual returns (uint256) { - // sum + 1 on both sides to prevent donation attack - return shares.mulDivDown(_totalAssets() + 1, totalSupply() + 1); - } - /// @notice Get the maximum amount of assets that a keyper can withdraw //// - if the user has no shares, the function will revert /// - if the user dSHU balance is less or equal than the total @@ -409,7 +253,7 @@ contract DelegateStaking is BaseStaking { /// @return amount The maximum amount of assets that a user can withdraw function maxWithdraw( address user - ) public view virtual returns (uint256 amount) { + ) public view override returns (uint256 amount) { uint256 shares = balanceOf(user); require(shares > 0, UserHasNoShares()); @@ -419,25 +263,4 @@ contract DelegateStaking is BaseStaking { // need the first branch as convertToAssets rounds down amount = locked >= assets ? 0 : assets - locked; } - - /// @notice Get the amount of SHU staked for all keypers - function _totalAssets() internal view virtual returns (uint256) { - return stakingToken.balanceOf(address(this)); - } - - /// @notice Calculates the amount to withdraw - /// @param _amount The amount to withdraw - /// @param maxWithdrawAmount The maximum amount that can be withdrawn - function _calculateWithdrawAmount( - uint256 _amount, - uint256 maxWithdrawAmount - ) internal pure returns (uint256 amount) { - // If the amount is 0, withdraw all available amount - if (_amount == 0) { - amount = maxWithdrawAmount; - } else { - require(_amount <= maxWithdrawAmount, WithdrawAmountTooHigh()); - amount = _amount; - } - } } diff --git a/src/Staking.sol b/src/Staking.sol index e4eaacc..2e5c8ab 100644 --- a/src/Staking.sol +++ b/src/Staking.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.26; -import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import {ERC20VotesUpgradeable} from "@openzeppelin-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; +import {EnumerableSetLib} from "@solady/utils/EnumerableSetLib.sol"; import {BaseStaking} from "./BaseStaking.sol"; import {SafeTransferLib} from "./libraries/SafeTransferLib.sol"; @@ -16,8 +16,7 @@ contract Staking is BaseStaking { /*////////////////////////////////////////////////////////////// LIBRARIES //////////////////////////////////////////////////////////////*/ - - using EnumerableSet for EnumerableSet.UintSet; + using EnumerableSetLib for EnumerableSetLib.Uint256Set; using SafeTransferLib for IERC20; @@ -45,9 +44,6 @@ contract Staking is BaseStaking { MAPPINGS //////////////////////////////////////////////////////////////*/ - // @notice stake ids belonging to a user - mapping(address user => EnumerableSet.UintSet stakeIds) internal userStakes; - /// @notice stores the metadata associated with a given stake mapping(uint256 id => Stake _stake) public stakes; @@ -149,7 +145,7 @@ contract Staking is BaseStaking { address keyper = msg.sender; // Get the keyper stakes - EnumerableSet.UintSet storage stakesIds = userStakes[keyper]; + EnumerableSetLib.Uint256Set storage stakesIds = userStakes[keyper]; // If the keyper has no stakes, the first stake must be at least the minimum stake if (stakesIds.length() == 0) { @@ -298,7 +294,7 @@ contract Staking is BaseStaking { } /*////////////////////////////////////////////////////////////// - VIEW FUNCTIONS + OVERRIDE //////////////////////////////////////////////////////////////*/ /// @notice Get the maximum amount of assets that a keyper can withdraw @@ -313,13 +309,6 @@ contract Staking is BaseStaking { return _maxWithdraw(keyper, 0); } - /// @notice Get the stake ids belonging to a user - function getUserStakeIds( - address user - ) external view returns (uint256[] memory) { - return userStakes[user].values(); - } - /*////////////////////////////////////////////////////////////// INTERNAL FUNCTIONS //////////////////////////////////////////////////////////////*/ diff --git a/test/Staking.t.sol b/test/Staking.t.sol index 576bfa1..f40d02d 100644 --- a/test/Staking.t.sol +++ b/test/Staking.t.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.26; import "@forge-std/Test.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {FixedPointMathLib} from "@solmate/utils/FixedPointMathLib.sol"; +import {FixedPointMathLib} from "src/libraries/FixedPointMathLib.sol"; import {TransparentUpgradeableProxy, ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {Staking} from "src/Staking.sol"; From 9a8d8df849b626dae41fcaf7fdf475efe22915b5 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Wed, 24 Jul 2024 10:16:54 -0300 Subject: [PATCH 10/17] move deposit / withdraw to BaseStaking --- src/BaseStaking.sol | 31 +++++++++++++++++++++++++++++++ src/DelegateStaking.sol | 33 ++++++++++----------------------- src/Staking.sol | 34 ++++++++-------------------------- 3 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/BaseStaking.sol b/src/BaseStaking.sol index e809971..6fb3ddd 100644 --- a/src/BaseStaking.sol +++ b/src/BaseStaking.sol @@ -64,6 +64,7 @@ abstract contract BaseStaking is OwnableUpgradeable, ERC20VotesUpgradeable { /// @notice Emitted when the rewards distributor is changed event NewRewardsDistributor(address indexed rewardsDistributor); + /// @notice Emitted when the lock period is changed event NewLockPeriod(uint256 indexed lockPeriod); /*////////////////////////////////////////////////////////////// @@ -220,6 +221,36 @@ abstract contract BaseStaking is OwnableUpgradeable, ERC20VotesUpgradeable { INTERNAL FUNCTIONS //////////////////////////////////////////////////////////////*/ + function _deposit(address user, uint256 amount) internal { + // Calculate the amount of shares to mint + uint256 shares = convertToShares(amount); + + // Update the total locked amount + totalLocked[user] += amount; + + // Mint the shares + _mint(user, shares); + + // Lock the SHU in the contract + stakingToken.safeTransferFrom(user, address(this), amount); + } + + function _withdraw( + address user, + uint256 amount + ) internal returns (uint256 shares) { + shares = previewWithdraw(amount); + + // Burn the shares + _burn(user, shares); + + // Decrease the amount from the total locked + totalLocked[user] -= amount; + + // Transfer the SHU to the keyper + stakingToken.safeTransfer(user, amount); + } + /// @notice Get the amount of SHU staked for all keypers function _totalAssets() internal view virtual returns (uint256) { return stakingToken.balanceOf(address(this)); diff --git a/src/DelegateStaking.sol b/src/DelegateStaking.sol index d0f4232..cb9def5 100644 --- a/src/DelegateStaking.sol +++ b/src/DelegateStaking.sol @@ -88,6 +88,9 @@ contract DelegateStaking is BaseStaking { /// @notice Thrown when someone try to unstake a stake that is still locked error StakeIsStillLocked(); + /// @notice Thrown when the address is not a keyper + error AddressIsNotAKeyper(); + /*////////////////////////////////////////////////////////////// MODIFIERS //////////////////////////////////////////////////////////////*/ @@ -137,28 +140,22 @@ contract DelegateStaking is BaseStaking { ) external updateRewards returns (uint256 stakeId) { require(amount > 0, ZeroAmount()); - address user = msg.sender; - - // Update the keyper's SHU balance - totalLocked[user] += amount; + require(staking.keypers(keyper), AddressIsNotAKeyper()); - // Mint the shares - _mint(user, convertToShares(amount)); + address user = msg.sender; - // Get next stake id and increment it stakeId = nextStakeId++; + // Add the stake id to the user stakes + userStakes[user].add(stakeId); + // Add the stake to the stakes mapping stakes[stakeId].keyper = keyper; stakes[stakeId].amount = amount; stakes[stakeId].timestamp = block.timestamp; stakes[stakeId].lockPeriod = lockPeriod; - // Add the stake to the keyper stakes - userStakes[user].add(stakeId); - - // Lock the SHU in the contract - stakingToken.safeTransferFrom(user, address(this), amount); + _deposit(user, amount); emit Staked(user, keyper, amount, lockPeriod); } @@ -203,18 +200,9 @@ contract DelegateStaking is BaseStaking { StakeIsStillLocked() ); - // Calculates the amounf of shares to burn - uint256 shares = previewWithdraw(amount); - - // Burn the shares - _burn(user, shares); - // Decrease the amount from the stake stakes[stakeId].amount -= amount; - // Decrease the amount from the total locked - totalLocked[user] -= amount; - // If the stake is empty, remove it if (stakes[stakeId].amount == 0) { // Remove the stake from the stakes mapping @@ -224,8 +212,7 @@ contract DelegateStaking is BaseStaking { userStakes[user].remove(stakeId); } - // Transfer the SHU to the keyper - stakingToken.safeTransfer(user, amount); + uint256 shares = _withdraw(user, amount); emit Unstaked(user, amount, shares); } diff --git a/src/Staking.sol b/src/Staking.sol index 2e5c8ab..e313f20 100644 --- a/src/Staking.sol +++ b/src/Staking.sol @@ -142,37 +142,29 @@ contract Staking is BaseStaking { ) external onlyKeyper updateRewards returns (uint256 stakeId) { require(amount > 0, ZeroAmount()); - address keyper = msg.sender; + address user = msg.sender; // Get the keyper stakes - EnumerableSetLib.Uint256Set storage stakesIds = userStakes[keyper]; + EnumerableSetLib.Uint256Set storage stakesIds = userStakes[user]; // If the keyper has no stakes, the first stake must be at least the minimum stake if (stakesIds.length() == 0) { require(amount >= minStake, FirstStakeLessThanMinStake()); } - // Update the keyper's SHU balance - totalLocked[keyper] += amount; - - // Mint the shares - _mint(keyper, convertToShares(amount)); - - // Get next stake id and increment it stakeId = nextStakeId++; + // Add the stake id to the user stakes + userStakes[user].add(stakeId); + // Add the stake to the stakes mapping stakes[stakeId].amount = amount; stakes[stakeId].timestamp = block.timestamp; stakes[stakeId].lockPeriod = lockPeriod; - // Add the stake to the keyper stakes - stakesIds.add(stakeId); - - // Lock the SHU in the contract - stakingToken.safeTransferFrom(keyper, address(this), amount); + _deposit(user, amount); - emit Staked(keyper, amount, lockPeriod); + emit Staked(user, amount, lockPeriod); } /// @notice Unstake SHU @@ -245,18 +237,9 @@ contract Staking is BaseStaking { ); } - // Calculates the amount of shares to burn - uint256 shares = previewWithdraw(amount); - - // Burn the shares - _burn(keyper, shares); - // Decrease the amount from the stake stakes[stakeId].amount -= amount; - // Decrease the amount from the total locked - totalLocked[keyper] -= amount; - // If the stake is empty, remove it if (stakes[stakeId].amount == 0) { // Remove the stake from the stakes mapping @@ -266,8 +249,7 @@ contract Staking is BaseStaking { userStakes[keyper].remove(stakeId); } - // Transfer the SHU to the keyper - stakingToken.safeTransfer(keyper, amount); + uint256 shares = _withdraw(keyper, amount); emit Unstaked(keyper, amount, shares); } From 084988fbb0a692123f91c4d6489a11812be47b4a Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Wed, 24 Jul 2024 10:20:38 -0300 Subject: [PATCH 11/17] natspec --- src/BaseStaking.sol | 20 ++++++++++++++------ src/DelegateStaking.sol | 15 ++++++--------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/BaseStaking.sol b/src/BaseStaking.sol index 6fb3ddd..458dd77 100644 --- a/src/BaseStaking.sol +++ b/src/BaseStaking.sol @@ -36,13 +36,13 @@ abstract contract BaseStaking is OwnableUpgradeable, ERC20VotesUpgradeable { /// @dev only owner can change IRewardsDistributor public rewardsDistributor; - /// @notice Unique identifier that will be used for the next stake. - uint256 internal nextStakeId; - /// @notice the lock period in seconds /// @dev only owner can change uint256 public lockPeriod; + /// @notice Unique identifier that will be used for the next stake. + uint256 internal nextStakeId; + /*////////////////////////////////////////////////////////////// MAPPINGS //////////////////////////////////////////////////////////////*/ @@ -215,12 +215,17 @@ abstract contract BaseStaking is OwnableUpgradeable, ERC20VotesUpgradeable { return userStakes[user].values(); } + /// @notice Get the total amount of assets that a keyper can withdraw + /// @dev must be implemented by the child contract function maxWithdraw(address user) public view virtual returns (uint256); /*////////////////////////////////////////////////////////////// INTERNAL FUNCTIONS //////////////////////////////////////////////////////////////*/ + /// @notice Deposit SHU into the contract + /// @param user The user address + /// @param amount The amount of SHU to deposit function _deposit(address user, uint256 amount) internal { // Calculate the amount of shares to mint uint256 shares = convertToShares(amount); @@ -235,18 +240,21 @@ abstract contract BaseStaking is OwnableUpgradeable, ERC20VotesUpgradeable { stakingToken.safeTransferFrom(user, address(this), amount); } + /// @notice Withdraw SHU from the contract + /// @param user The user address + /// @param amount The amount of SHU to withdraw function _withdraw( address user, uint256 amount ) internal returns (uint256 shares) { shares = previewWithdraw(amount); - // Burn the shares - _burn(user, shares); - // Decrease the amount from the total locked totalLocked[user] -= amount; + // Burn the shares + _burn(user, shares); + // Transfer the SHU to the keyper stakingToken.safeTransfer(user, amount); } diff --git a/src/DelegateStaking.sol b/src/DelegateStaking.sol index cb9def5..77c35ef 100644 --- a/src/DelegateStaking.sol +++ b/src/DelegateStaking.sol @@ -91,15 +91,6 @@ contract DelegateStaking is BaseStaking { /// @notice Thrown when the address is not a keyper error AddressIsNotAKeyper(); - /*////////////////////////////////////////////////////////////// - MODIFIERS - //////////////////////////////////////////////////////////////*/ - - /// @notice Ensure logic contract is unusable - constructor() { - _disableInitializers(); - } - /// @notice Initialize the contract /// @param _owner The owner of the contract, i.e. the DAO contract address /// @param _stakingToken The address of the staking token, i.e. SHU @@ -221,6 +212,12 @@ contract DelegateStaking is BaseStaking { RESTRICTED FUNCTIONS //////////////////////////////////////////////////////////////*/ + /// @notice Set the staking contract + /// The staking contract is the contract that will be used to + /// determine if an address is a keyper + /// @param _stakingContract The address of the staking contract + /// @dev Only the owner can call this function + /// @dev The staking contract must not be the zero address function setStakingContract(address _stakingContract) external onlyOwner { require(_stakingContract != address(0), AddressZero()); staking = IStaking(_stakingContract); From 129815326976081ba7cbdc9020ff300b37d11c39 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Thu, 25 Jul 2024 18:48:56 -0300 Subject: [PATCH 12/17] secrets > env --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6102247..ad069d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ on: env: FOUNDRY_PROFILE: ci - MAINNET_RPC_URL: ${{secrets.MAINNET_RPC_URL}} + MAINNET_RPC_URL: ${{ env.MAINNET_RPC_URL}} jobs: build: From a7696a457fd30fa5c236bc431b9255457fd6486e Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Thu, 25 Jul 2024 18:52:21 -0300 Subject: [PATCH 13/17] delete extra space --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad069d8..112e398 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ on: env: FOUNDRY_PROFILE: ci - MAINNET_RPC_URL: ${{ env.MAINNET_RPC_URL}} + MAINNET_RPC_URL: ${{env.MAINNET_RPC_URL}} jobs: build: From 1b424f74b378ac3a8eb530b87aeb27513f4c7ac0 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Thu, 25 Jul 2024 18:55:58 -0300 Subject: [PATCH 14/17] env -> vars --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 112e398..31fc0db 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ on: env: FOUNDRY_PROFILE: ci - MAINNET_RPC_URL: ${{env.MAINNET_RPC_URL}} + MAINNET_RPC_URL: ${{ vars.MAINNET_RPC_URL }} jobs: build: From 3d5ee4f8118c1248a3d02431b84213691404bda3 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Thu, 25 Jul 2024 18:57:34 -0300 Subject: [PATCH 15/17] decrease coverage due to disableInitializers branch --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31fc0db..4ca28d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -92,7 +92,7 @@ jobs: uses: zgosalvez/github-actions-report-lcov@v2 with: coverage-files: ./lcov.info - minimum-coverage: 100 + minimum-coverage: 97 lint: runs-on: ubuntu-latest From 6c3fa38444e8e66ee652b2ff28ab4614640db9a7 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Thu, 25 Jul 2024 19:29:23 -0300 Subject: [PATCH 16/17] stake delegate fuzzing tests --- test/DelegateStaking.t.sol | 235 ++++++++++++++++++++++++++++++++++++- test/Staking.t.sol | 40 +++++-- 2 files changed, 263 insertions(+), 12 deletions(-) diff --git a/test/DelegateStaking.t.sol b/test/DelegateStaking.t.sol index bfe39d5..8a4c23d 100644 --- a/test/DelegateStaking.t.sol +++ b/test/DelegateStaking.t.sol @@ -4,6 +4,7 @@ pragma solidity 0.8.26; import "@forge-std/Test.sol"; import {TransparentUpgradeableProxy, ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {FixedPointMathLib} from "src/libraries/FixedPointMathLib.sol"; import {Staking} from "src/Staking.sol"; import {DelegateStaking} from "src/DelegateStaking.sol"; @@ -14,6 +15,8 @@ import {ProxyUtils} from "test/helpers/ProxyUtils.sol"; import {DelegateStakingHarness} from "test/helpers/DelegateStakingHarness.sol"; contract DelegateStakingTest is Test { + using FixedPointMathLib for uint256; + DelegateStakingHarness public delegate; IRewardsDistributor public rewardsDistributor; Staking public staking; @@ -143,6 +146,29 @@ contract DelegateStakingTest is Test { stakeId = delegate.stake(_keyper, _amount); vm.stopPrank(); } + + function _previewWithdrawIncludeRewardsDistributed( + uint256 _amount, + uint256 _rewardsDistributed + ) internal view returns (uint256) { + uint256 supply = delegate.totalSupply(); + + uint256 assets = govToken.balanceOf(address(delegate)) + + _rewardsDistributed; + return _amount.mulDivUp(supply + 1, assets + 1); + } + + function _convertToSharesIncludeRewardsDistributed( + uint256 _amount, + uint256 _rewardsDistributed + ) internal view returns (uint256) { + uint256 supply = delegate.totalSupply(); + + uint256 assets = govToken.balanceOf(address(delegate)) + + _rewardsDistributed; + + return _amount.mulDivDown(supply + 1, assets + 1); + } } contract Initializer is DelegateStakingTest { @@ -198,7 +224,10 @@ contract Stake is DelegateStakingTest { _mintGovToken(_depositor, _amount); _setKeyper(_keyper, true); - vm.assume(_depositor != address(0)); + vm.assume( + _depositor != address(0) && + _depositor != ProxyUtils.getAdminAddress(address(delegate)) + ); vm.startPrank(_depositor); govToken.approve(address(delegate), _amount); @@ -210,4 +239,208 @@ contract Stake is DelegateStakingTest { assertEq(stakeId, expectedStakeId, "Wrong stake id"); vm.stopPrank(); } + + function testFuzz_IncreaseNextStakeId( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + vm.assume( + _depositor != address(0) && + _depositor != ProxyUtils.getAdminAddress(address(delegate)) + ); + + uint256 expectedStakeId = delegate.exposed_nextStakeId() + 1; + + _stake(_depositor, _keyper, _amount); + + assertEq(delegate.exposed_nextStakeId(), expectedStakeId); + } + + function testFuzz_TransferTokensWhenStaking( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + vm.assume( + _depositor != address(0) && + _depositor != ProxyUtils.getAdminAddress(address(delegate)) + ); + + assertEq(govToken.balanceOf(address(delegate)), 0); + + _stake(_depositor, _keyper, _amount); + + assertEq( + govToken.balanceOf(_depositor), + 0, + "Tokens were not transferred" + ); + assertEq( + govToken.balanceOf(address(delegate)), + _amount, + "Tokens were not transferred" + ); + vm.stopPrank(); + } + + function testFuzz_EmitAStakeEventWhenStaking( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + vm.assume( + _depositor != address(0) && + _depositor != ProxyUtils.getAdminAddress(address(delegate)) + ); + + vm.startPrank(_depositor); + govToken.approve(address(delegate), _amount); + vm.expectEmit(); + emit DelegateStaking.Staked(_depositor, _keyper, _amount, LOCK_PERIOD); + delegate.stake(_keyper, _amount); + vm.stopPrank(); + } + + function testFuzz_UpdateTotalSupplyWhenStaking( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + vm.assume( + _depositor != address(0) && + _depositor != ProxyUtils.getAdminAddress(address(delegate)) + ); + + _stake(_depositor, _keyper, _amount); + + assertEq(delegate.totalSupply(), _amount); + } + + function testFuzz_UpdateTotalSupplyWhenTwoAccountsStakes( + address _keyper, + address _depositor1, + address _depositor2, + uint256 _amount1, + uint256 _amount2 + ) public { + _amount1 = _boundToRealisticStake(_amount1); + _amount2 = _boundToRealisticStake(_amount2); + + _mintGovToken(_depositor1, _amount1); + _mintGovToken(_depositor2, _amount2); + + _setKeyper(_keyper, true); + + _stake(_depositor1, _keyper, _amount1); + _stake(_depositor2, _keyper, _amount2); + + assertEq( + delegate.totalSupply(), + _amount1 + _amount2, + "Wrong total supply" + ); + } + + function testFuzz_UpdateSharesWhenStaking( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + uint256 shares = delegate.convertToShares(_amount); + + _stake(_depositor, _keyper, _amount); + + assertEq(delegate.balanceOf(_depositor), shares); + } + + function testFuzz_UpdateSharesWhenStakingTwice( + address _keyper, + address _depositor, + uint256 _amount1, + uint256 _amount2, + uint256 _jump + ) public { + _amount1 = _boundToRealisticStake(_amount1); + _amount2 = _boundToRealisticStake(_amount2); + + _jump = _boundRealisticTimeAhead(_jump); + + _mintGovToken(_depositor, _amount1 + _amount2); + _setKeyper(_keyper, true); + + uint256 _shares1 = staking.convertToShares(_amount1); + _stake(_depositor, _keyper, _amount1); + + _jumpAhead(_jump); + uint256 _shares2 = _convertToSharesIncludeRewardsDistributed( + _amount2, + REWARD_RATE * _jump + ); + + _stake(_keyper, _depositor, _amount2); + + // need to accept a small error due to the donation attack prevention + assertApproxEqAbs( + delegate.balanceOf(_depositor), + _shares1 + _shares2, + 1e18, + "Wrong balance" + ); + } + + function testFuzz_Depositor1AndDepositor2ReceivesTheSameAmountOfSharesWhenStakingSameAmountInTheSameBlock( + address _keyper1, + address _keyper2, + address _depositor1, + address _depositor2, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor1, _amount); + _mintGovToken(_depositor2, _amount); + + _setKeyper(_keyper1, true); + _setKeyper(_keyper2, true); + + uint256 shares = delegate.convertToShares(_amount); + + _stake(_depositor1, _keyper1, _amount); + _stake(_depositor2, _keyper2, _amount); + + assertEq( + delegate.balanceOf(_depositor1), + delegate.balanceOf(_depositor2), + "Wrong balance" + ); + assertEq(delegate.balanceOf(_depositor1), shares); + assertEq(delegate.balanceOf(_depositor2), shares); + assertEq(delegate.totalSupply(), 2 * shares); + } } diff --git a/test/Staking.t.sol b/test/Staking.t.sol index f40d02d..eff9e66 100644 --- a/test/Staking.t.sol +++ b/test/Staking.t.sol @@ -216,11 +216,29 @@ contract Stake is StakingTest { vm.stopPrank(); } - // TODO function testFuzz_IncreaseNextStakeId( address _depositor, uint256 _amount - ) public {} + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_depositor, true); + + vm.assume(_depositor != address(0)); + + uint256 nextStakeIdBefore = staking.exposed_nextStakeId(); + + _stake(_depositor, _amount); + + uint256 nextStakeIdAfter = staking.exposed_nextStakeId(); + + assertEq( + nextStakeIdAfter - nextStakeIdBefore, + 1, + "Wrong next stake id" + ); + } function testFuzz_TransferTokensWhenStaking( address _depositor, @@ -230,6 +248,8 @@ contract Stake is StakingTest { _mintGovToken(_depositor, _amount); _setKeyper(_depositor, true); + assertEq(govToken.balanceOf(address(staking)), 0); + _stake(_depositor, _amount); assertEq(govToken.balanceOf(_depositor), 0, "Wrong balance"); assertEq( @@ -259,7 +279,7 @@ contract Stake is StakingTest { vm.stopPrank(); } - function testFuzz_UpdatesTotalSupplyWhenStaking( + function testFuzz_UpdateTotalSupplyWhenStaking( address _depositor, uint256 _amount ) public { @@ -275,7 +295,7 @@ contract Stake is StakingTest { assertEq(staking.totalSupply(), _amount, "Wrong total supply"); } - function testFuzz_UpdatesTotalSupplyWhenTwoAccountsStakes( + function testFuzz_UpdateTotalSupplyWhenTwoAccountsStakes( address _depositor1, address _depositor2, uint256 _amount1, @@ -290,9 +310,6 @@ contract Stake is StakingTest { _setKeyper(_depositor1, true); _setKeyper(_depositor2, true); - vm.assume(_depositor1 != address(0)); - vm.assume(_depositor2 != address(0)); - _stake(_depositor1, _amount1); _stake(_depositor2, _amount2); @@ -312,8 +329,6 @@ contract Stake is StakingTest { _mintGovToken(_depositor, _amount); _setKeyper(_depositor, true); - vm.assume(_depositor != address(0)); - uint256 _shares = staking.convertToShares(_amount); _stake(_depositor, _amount); @@ -335,8 +350,6 @@ contract Stake is StakingTest { _mintGovToken(_depositor, _amount1 + _amount2); _setKeyper(_depositor, true); - vm.assume(_depositor != address(0)); - uint256 _shares1 = staking.convertToShares(_amount1); uint256 timestampBefore = vm.getBlockTimestamp(); @@ -405,6 +418,8 @@ contract Stake is StakingTest { vm.assume(_depositor1 != address(0)); vm.assume(_depositor2 != address(0)); + uint256 shares = staking.convertToShares(_amount); + _stake(_depositor1, _amount); _stake(_depositor2, _amount); @@ -413,6 +428,9 @@ contract Stake is StakingTest { staking.balanceOf(_depositor2), "Wrong balance" ); + assertEq(staking.balanceOf(_depositor1), shares); + assertEq(staking.balanceOf(_depositor2), shares); + assertEq(staking.totalSupply(), 2 * shares); } function testFuzz_Depositor1ReceivesMoreShareWhenStakingBeforeDepositor2( From 32d2ccce2c6ac7a96950207990cc0cf4777f5218 Mon Sep 17 00:00:00 2001 From: Ana Julia Date: Sun, 28 Jul 2024 20:17:57 -0300 Subject: [PATCH 17/17] stake fuzzing --- test/DelegateStaking.t.sol | 269 ++++++++++++++++++++++++++++++++++++- test/Staking.t.sol | 22 ++- 2 files changed, 275 insertions(+), 16 deletions(-) diff --git a/test/DelegateStaking.t.sol b/test/DelegateStaking.t.sol index 8a4c23d..7f27709 100644 --- a/test/DelegateStaking.t.sol +++ b/test/DelegateStaking.t.sol @@ -75,7 +75,7 @@ contract DelegateStakingTest is Test { ); rewardsDistributor.setRewardConfiguration( - address(staking), + address(delegate), REWARD_RATE ); @@ -396,14 +396,15 @@ contract Stake is DelegateStakingTest { uint256 _shares1 = staking.convertToShares(_amount1); _stake(_depositor, _keyper, _amount1); + uint256 timestampBefore = vm.getBlockTimestamp(); _jumpAhead(_jump); uint256 _shares2 = _convertToSharesIncludeRewardsDistributed( _amount2, - REWARD_RATE * _jump + REWARD_RATE * (vm.getBlockTimestamp() - timestampBefore) ); - _stake(_keyper, _depositor, _amount2); + _stake(_depositor, _keyper, _amount2); // need to accept a small error due to the donation attack prevention assertApproxEqAbs( @@ -443,4 +444,266 @@ contract Stake is DelegateStakingTest { assertEq(delegate.balanceOf(_depositor2), shares); assertEq(delegate.totalSupply(), 2 * shares); } + + function testFuzz_Depositor1ReceivesMoreShareWhenStakingBeforeDepositor2( + address _keyper1, + address _keyper2, + address _depositor1, + address _depositor2, + uint256 _amount, + uint256 _jump + ) public { + _amount = _boundToRealisticStake(_amount); + + _jump = _boundRealisticTimeAhead(_jump); + + _mintGovToken(_depositor1, _amount); + _mintGovToken(_depositor2, _amount); + + _setKeyper(_keyper1, true); + _setKeyper(_keyper2, true); + + _stake(_depositor1, _keyper1, _amount); + _jumpAhead(_jump); + _stake(_depositor2, _keyper2, _amount); + + assertGt( + delegate.balanceOf(_depositor1), + delegate.balanceOf(_depositor2), + "Wrong balance" + ); + } + + function testFuzz_UpdateContractGovTokenBalanceWhenStaking( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + uint256 govTokenBalance = govToken.balanceOf(address(delegate)); + + _stake(_depositor, _keyper, _amount); + + assertEq( + govToken.balanceOf(address(delegate)), + govTokenBalance + _amount, + "Wrong balance" + ); + } + + function testFuzz_TrackAmountStakedWhenStaking( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + uint256 stakeId = _stake(_depositor, _keyper, _amount); + + (, uint256 amount, , ) = delegate.stakes(stakeId); + + assertEq(amount, _amount, "Wrong amount"); + } + + function testFuzz_TrackKeyperWhenStaking( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + uint256 stakeId = _stake(_depositor, _keyper, _amount); + + (address keyper, , , ) = delegate.stakes(stakeId); + + assertEq(keyper, _keyper, "Wrong keyper"); + } + + function testFuzz_TrackTimestampWhenStaking( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + uint256 stakeId = _stake(_depositor, _keyper, _amount); + + (, , uint256 timestamp, ) = delegate.stakes(stakeId); + + assertEq(timestamp, vm.getBlockTimestamp(), "Wrong timestamp"); + } + + function testFuzz_TrackLockPeriodWhenStaking( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + uint256 stakeId = _stake(_depositor, _keyper, _amount); + + (, , , uint256 lockPeriod) = delegate.stakes(stakeId); + + assertEq(lockPeriod, LOCK_PERIOD, "Wrong lock period"); + } + + function testFuzz_TrackStakeIndividuallyPerStake( + address _keyper, + address _depositor, + uint256 _amount1, + uint256 _amount2 + ) public { + _amount1 = _boundToRealisticStake(_amount1); + _amount2 = _boundToRealisticStake(_amount2); + + _mintGovToken(_depositor, _amount1 + _amount2); + _setKeyper(_keyper, true); + + uint256 stakeId1 = _stake(_depositor, _keyper, _amount1); + + (, uint256 amount1, uint256 timestamp1, ) = delegate.stakes(stakeId1); + + _jumpAhead(1); + + uint256 stakeId2 = _stake(_depositor, _keyper, _amount2); + + (, uint256 amount2, uint256 timestamp2, ) = delegate.stakes(stakeId2); + + assertEq(amount1, _amount1, "Wrong amount"); + assertEq(amount2, _amount2, "Wrong amount"); + + assertEq(timestamp1, vm.getBlockTimestamp() - 1, "Wrong timestamp"); + assertEq(timestamp2, vm.getBlockTimestamp(), "Wrong timestamp"); + } + + function testFuzz_StakeReturnsStakeId( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + uint256 stakeId = _stake(_depositor, _keyper, _amount); + + assertGt(stakeId, 0, "Wrong stake id"); + } + + function testFuzz_IncreaseTotalLockedWhenStaking( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + _setKeyper(_keyper, true); + + uint256 totalLocked = delegate.totalLocked(_depositor); + + _stake(_depositor, _keyper, _amount); + + assertEq( + delegate.totalLocked(_depositor), + totalLocked + _amount, + "Wrong total locked" + ); + } + + function testFuzz_RevertIf_KeyperIsNotAKeyper( + address _keyper, + address _depositor, + uint256 _amount + ) public { + _amount = _boundToRealisticStake(_amount); + + _mintGovToken(_depositor, _amount); + + vm.expectRevert(DelegateStaking.AddressIsNotAKeyper.selector); + delegate.stake(_keyper, _amount); + } + + function testFuzz_RevertIf_ZeroAmount( + address _keyper, + address _depositor + ) public { + _mintGovToken(_depositor, 0); + + vm.expectRevert(DelegateStaking.ZeroAmount.selector); + delegate.stake(_keyper, 0); + } + + // function test_DonationAttackNoRewards( + // address keyper, + // address bob, + // address alice, + // uint256 bobAmount + // ) public { + // vm.assume(bob != alice); + // rewardsDistributor.removeRewardConfiguration(address(delegate)); + + // _setKeyper(keyper, true); + + // bobAmount = _boundToRealisticStake(bobAmount); + + // // alice deposits 1 + // _mintGovToken(alice, 1); + // uint256 aliceStakeId = _stake(alice, keyper, 1); + + // // simulate donation + // govToken.mint(address(delegate), bobAmount); + + // // bob stake + // _mintGovToken(bob, bobAmount); + // uint256 bobStakeId = _stake(bob, keyper, bobAmount); + + // _jumpAhead(vm.getBlockTimestamp() + LOCK_PERIOD); + + // // alice withdraw rewards (bob stake) even when there is no rewards distributed + // vm.startPrank(alice); + // //delegate.unstake(aliceStakeId, 0); + // delegate.claimRewards(0); + // vm.stopPrank(); + + // uint256 aliceBalanceAfterAttack = govToken.balanceOf(alice); + + // // attack should not be profitable for alice + // assertGtDecimal( + // bobAmount + 1, // amount alice has spend in total + // aliceBalanceAfterAttack, + // 1e18, + // "Alice receive more than expend for the attack" + // ); + + // vm.startPrank(bob); + // delegate.unstake(bobStakeId, 0); + // delegate.claimRewards(0); + + // uint256 bobBalanceAfterAttack = govToken.balanceOf(bob); + + // // at the end Alice still earn less than bob + // assertGt( + // bobBalanceAfterAttack, + // aliceBalanceAfterAttack, + // "Alice earn more than Bob after the attack" + // ); + // } } diff --git a/test/Staking.t.sol b/test/Staking.t.sol index eff9e66..520f4e0 100644 --- a/test/Staking.t.sol +++ b/test/Staking.t.sol @@ -454,7 +454,7 @@ contract Stake is StakingTest { _stake(_depositor2, _amount); - assertGe( + assertGt( staking.balanceOf(_depositor1), staking.balanceOf(_depositor2), "Wrong balance" @@ -483,7 +483,7 @@ contract Stake is StakingTest { ); } - function testFuzz_trackAmountStakedWhenStaking( + function testFuzz_TrackAmountStakedWhenStaking( address _depositor, uint256 _amount ) public { @@ -501,7 +501,7 @@ contract Stake is StakingTest { assertEq(amount, _amount, "Wrong amount"); } - function testFuzz_trackTimestampWhenStaking( + function testFuzz_TrackTimestampWhenStaking( address _depositor, uint256 _amount ) public { @@ -510,8 +510,6 @@ contract Stake is StakingTest { _mintGovToken(_depositor, _amount); _setKeyper(_depositor, true); - vm.assume(_depositor != address(0)); - uint256 stakeId = _stake(_depositor, _amount); (, uint256 timestamp, ) = staking.stakes(stakeId); @@ -519,7 +517,7 @@ contract Stake is StakingTest { assertEq(timestamp, vm.getBlockTimestamp(), "Wrong timestamp"); } - function testFuzz_trackLockPeriodWhenStaking( + function testFuzz_TrackLockPeriodWhenStaking( address _depositor, uint256 _amount ) public { @@ -537,7 +535,7 @@ contract Stake is StakingTest { assertEq(lockPeriod, LOCK_PERIOD, "Wrong lock period"); } - function testFuzz_trackStakeIndividuallyPerStake( + function testFuzz_TrackStakeIndividuallyPerStake( address _depositor, uint256 _amount1, uint256 _amount2 @@ -548,8 +546,6 @@ contract Stake is StakingTest { _mintGovToken(_depositor, _amount1 + _amount2); _setKeyper(_depositor, true); - vm.assume(_depositor != address(0) && _depositor != address(this)); - uint256 stakeId1 = _stake(_depositor, _amount1); (uint256 amount1, uint256 timestamp, ) = staking.stakes(stakeId1); @@ -566,7 +562,7 @@ contract Stake is StakingTest { assertEq(timestamp2, vm.getBlockTimestamp(), "Wrong timestamp"); } - function testFuzz_stakeReturnsStakeId( + function testFuzz_StakeReturnsStakeId( address _depositor, uint256 _amount ) public { @@ -582,7 +578,7 @@ contract Stake is StakingTest { assertGt(stakeId, 0, "Wrong stake id"); } - function testFuzz_increaseTotalLockedWhenStaking( + function testFuzz_IncreaseTotalLockedWhenStaking( address _depositor, uint256 _amount ) public { @@ -736,12 +732,12 @@ contract Stake is StakingTest { // ); // } - function test_DonationAttackNoRewards( + function testFuzz_DonationAttackNoRewards( address bob, address alice, uint256 attackSize ) public { - vm.assume(bob != alice && bob != address(0)); + vm.assume(bob != alice); rewardsDistributor.removeRewardConfiguration(address(staking)); attackSize = bound(attackSize, 2, 1000);