Source Code
Overview
S Balance
S Value
$5.47 (@ $0.07/S)Latest 25 from a total of 45,855 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Sell Shares | 34948313 | 219 days ago | IN | 0 S | 0.00536695 | ||||
| Sell Shares | 34948183 | 219 days ago | IN | 0 S | 0.00536695 | ||||
| Sell Shares | 34947846 | 219 days ago | IN | 0 S | 0.00536695 | ||||
| Buy Shares | 34947819 | 219 days ago | IN | 0.64152 S | 0.00973824 | ||||
| Buy Shares | 34947650 | 219 days ago | IN | 0.61798 S | 0.00973758 | ||||
| Buy Shares | 34947540 | 219 days ago | IN | 0.59488 S | 0.00973824 | ||||
| Buy Shares | 34947509 | 219 days ago | IN | 0.57222 S | 0.00973824 | ||||
| Buy Shares | 34947353 | 219 days ago | IN | 0.55 S | 0.00973824 | ||||
| Buy Shares | 34947279 | 219 days ago | IN | 0.52822 S | 0.00973824 | ||||
| Buy Shares | 34947264 | 219 days ago | IN | 0.50688 S | 0.00973824 | ||||
| Buy Shares | 34947158 | 219 days ago | IN | 0.48598 S | 0.00973758 | ||||
| Buy Shares | 34947120 | 219 days ago | IN | 0.46552 S | 0.00973758 | ||||
| Buy Shares | 34947062 | 219 days ago | IN | 0.4455 S | 0.00973824 | ||||
| Buy Shares | 34947004 | 219 days ago | IN | 0.42592 S | 0.00973824 | ||||
| Buy Shares | 34946960 | 219 days ago | IN | 0.00088 S | 0.0097389 | ||||
| Buy Shares | 34946917 | 219 days ago | IN | 0.40678 S | 0.00973824 | ||||
| Buy Shares | 34946913 | 219 days ago | IN | 0.38808 S | 0.00973824 | ||||
| Buy Shares | 34946886 | 219 days ago | IN | 0 S | 0.01054724 | ||||
| Buy Shares | 34946722 | 219 days ago | IN | 0.36982 S | 0.00973758 | ||||
| Buy Shares | 34946622 | 219 days ago | IN | 0.00022 S | 0.0120544 | ||||
| Buy Shares | 34945943 | 219 days ago | IN | 0.0495 S | 0.00973824 | ||||
| Buy Shares | 34945813 | 219 days ago | IN | 0 S | 0.01054724 | ||||
| Buy Shares | 34945208 | 219 days ago | IN | 0.352 S | 0.00973758 | ||||
| Buy Shares | 34944918 | 219 days ago | IN | 0.00088 S | 0.00973824 | ||||
| Buy Shares | 34935093 | 220 days ago | IN | 0.00088 S | 0.00973824 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 34948313 | 219 days ago | 0.02704 S | ||||
| 34948313 | 219 days ago | 0.02704 S | ||||
| 34948313 | 219 days ago | 0.48672 S | ||||
| 34948183 | 219 days ago | 0.02809 S | ||||
| 34948183 | 219 days ago | 0.02809 S | ||||
| 34948183 | 219 days ago | 0.50562 S | ||||
| 34947846 | 219 days ago | 0.02916 S | ||||
| 34947846 | 219 days ago | 0.02916 S | ||||
| 34947846 | 219 days ago | 0.52488 S | ||||
| 34947819 | 219 days ago | 0.02916 S | ||||
| 34947819 | 219 days ago | 0.02916 S | ||||
| 34947650 | 219 days ago | 0.02809 S | ||||
| 34947650 | 219 days ago | 0.02809 S | ||||
| 34947540 | 219 days ago | 0.02704 S | ||||
| 34947540 | 219 days ago | 0.02704 S | ||||
| 34947509 | 219 days ago | 0.02601 S | ||||
| 34947509 | 219 days ago | 0.02601 S | ||||
| 34947353 | 219 days ago | 0.025 S | ||||
| 34947353 | 219 days ago | 0.025 S | ||||
| 34947279 | 219 days ago | 0.02401 S | ||||
| 34947279 | 219 days ago | 0.02401 S | ||||
| 34947264 | 219 days ago | 0.02304 S | ||||
| 34947264 | 219 days ago | 0.02304 S | ||||
| 34947158 | 219 days ago | 0.02209 S | ||||
| 34947158 | 219 days ago | 0.02209 S |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Chat3_V2
Compiler Version
v0.8.27+commit.40a35a09
Optimization Enabled:
No with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "./AuthorityVerifier.sol";
pragma solidity ^0.8.20;
contract Chat3_V2 is Ownable, AuthorityVerifier {
constructor() Ownable(msg.sender) {}
address public protocolFeeDestination;
uint256 public protocolFeePercent;
uint256 public subjectFeePercent;
uint256 public maxAmountAtATime = 1;
bool public tradable = false;
event Trade(
address indexed trader,
address indexed subject,
bool indexed isBuy,
uint256 shareAmount,
uint256 ethAmount,
uint256 protocolEthAmount,
uint256 subjectEthAmount,
uint256 supply
);
using EnumerableSet for EnumerableSet.AddressSet;
// SharesSubject => list of holders
mapping(address => EnumerableSet.AddressSet) private _holders;
// SharesSubject => Holder => Amount
mapping(address => mapping(address => uint256)) public sharesBalance;
// SharesSubject => Supply
mapping(address => uint256) public sharesSupply;
// transfer fee earned
mapping(address => uint256) public accumulated;
struct FinalizedSubject {
bool isClosed;
uint256 finalSupply;
}
// SharesSubject => FinalizedSubject
mapping(address => FinalizedSubject) public finalizedSubjects;
function setFeeDestination(address _feeDestination) public onlyOwner {
protocolFeeDestination = _feeDestination;
}
function setProtocolFeePercent(uint256 _feePercent) public onlyOwner {
protocolFeePercent = _feePercent;
}
function setSubjectFeePercent(uint256 _feePercent) public onlyOwner {
subjectFeePercent = _feePercent;
}
function setMaxAmountAtATime(uint256 _newAmount) public onlyOwner {
maxAmountAtATime = _newAmount;
}
function setTradableOn() public onlyOwner {
require(tradable == false, "Already tradable");
tradable = true;
}
function getPrice(uint256 supply, uint256 amount) public pure returns (uint256) {
require(amount == 1, "only one at a time");
uint256 sum1 = supply == 0 ? 0 : (supply - 1) * (supply) * (2 * (supply - 1) + 1) / 6;
uint256 sum2 = supply == 0 && amount == 1
? 0
: (supply - 1 + amount) * (supply + amount) * (2 * (supply - 1 + amount) + 1) / 6;
uint256 summation = sum2 - sum1;
return summation * 1 ether / 5000;
}
function getBuyPrice(address sharesSubject, uint256 amount) public view returns (uint256) {
return getPrice(sharesSupply[sharesSubject], amount);
}
function getSellPrice(address sharesSubject, uint256 amount) public view returns (uint256) {
return getPrice(sharesSupply[sharesSubject] - amount, amount);
}
function getBuyPriceAfterFee(address sharesSubject, uint256 amount) public view returns (uint256) {
uint256 price = getBuyPrice(sharesSubject, amount);
uint256 protocolFee = price * protocolFeePercent / 1 ether;
uint256 subjectFee = price * subjectFeePercent / 1 ether;
return price + protocolFee + subjectFee;
}
function getSellPriceAfterFee(address sharesSubject, uint256 amount) public view returns (uint256) {
uint256 price = getSellPrice(sharesSubject, amount);
uint256 protocolFee = price * protocolFeePercent / 1 ether;
uint256 subjectFee = price * subjectFeePercent / 1 ether;
return price - protocolFee - subjectFee;
}
function buyShares(address sharesSubject, uint256 nonce, bytes memory signature, uint256 amount) public payable {
require(amount <= maxAmountAtATime, "max amount at a time exceeded");
require(!finalizedSubjects[sharesSubject].isClosed, "Already finalized");
require(verify(sharesSubject, amount, nonce, signature), "invalid signature");
uint256 supply = sharesSupply[sharesSubject];
require(tradable == true, "Not tradable yet");
uint256 price = getPrice(supply, amount);
uint256 protocolFee = price * protocolFeePercent / 1 ether;
uint256 subjectFee = price * subjectFeePercent / 1 ether;
require(msg.value >= price + protocolFee + subjectFee, "Insufficient payment");
increaseSharesBalance(sharesSubject, msg.sender, amount);
sharesSupply[sharesSubject] = supply + amount;
emit Trade(msg.sender, sharesSubject, true, amount, price, protocolFee, subjectFee, supply + amount);
(bool success1,) = protocolFeeDestination.call{value: protocolFee}("");
(bool success2,) = sharesSubject.call{value: subjectFee}("");
require(success1 && success2, "Unable to send funds");
accumulated[sharesSubject] = accumulated[sharesSubject] + subjectFee;
}
function sellShares(address sharesSubject, uint256 amount) public payable {
require(amount <= maxAmountAtATime, "max amount at a time exceeded");
require(!finalizedSubjects[sharesSubject].isClosed, "Already finalized");
uint256 supply = sharesSupply[sharesSubject];
require(supply > amount, "Cannot sell the last share");
uint256 price = getPrice(supply - amount, amount);
uint256 protocolFee = price * protocolFeePercent / 1 ether;
uint256 subjectFee = price * subjectFeePercent / 1 ether;
decreaseSharesBalance(sharesSubject, msg.sender, amount);
sharesSupply[sharesSubject] = supply - amount;
emit Trade(msg.sender, sharesSubject, false, amount, price, protocolFee, subjectFee, supply - amount);
(bool success1,) = msg.sender.call{value: price - protocolFee - subjectFee}("");
(bool success2,) = protocolFeeDestination.call{value: protocolFee}("");
(bool success3,) = sharesSubject.call{value: subjectFee}("");
require(success1 && success2 && success3, "Unable to send funds");
accumulated[sharesSubject] = accumulated[sharesSubject] + subjectFee;
}
function sellSharesBatch(uint256 count) public payable {
address sharesSubject = msg.sender;
uint256 holdersSell = _holders[sharesSubject].length();
holdersSell = holdersSell < count ? holdersSell : count;
require(holdersSell > 0, "Cannot sell no holders");
if (!finalizedSubjects[sharesSubject].isClosed) {
finalizedSubjects[sharesSubject] = FinalizedSubject(true, sharesSupply[sharesSubject]);
}
uint256 supply = finalizedSubjects[sharesSubject].finalSupply;
require(supply > 1, "Cannot sell the last share");
uint256 averageSharesPrice = (supply - 1) * supply * (2 * (supply - 1) + 1) / 6 * 1 ether / 5000 / supply - 1;
uint256 protocolFee = averageSharesPrice * protocolFeePercent / 1 ether;
uint256 subjectFee = averageSharesPrice * subjectFeePercent / 1 ether;
uint256 sellPrice = averageSharesPrice - protocolFee - subjectFee;
uint256 sellCount = 0;
for (uint256 i = 0; i < holdersSell; i++) {
address holder = _holders[sharesSubject].at(0);
uint256 amount = sharesBalance[sharesSubject][holder];
sellCount += amount;
_holders[sharesSubject].remove(holder);
uint256 currentSupply = sharesSupply[sharesSubject] - amount;
sharesSupply[sharesSubject] = currentSupply;
emit Trade(
holder,
sharesSubject,
false,
amount,
sellPrice * amount,
protocolFee * amount,
subjectFee * amount,
currentSupply
);
(bool success,) = holder.call{value: sellPrice * amount}("");
require(success, "Unable to send funds");
}
(bool success1,) = protocolFeeDestination.call{value: protocolFee * sellCount}("");
(bool success2,) = sharesSubject.call{value: subjectFee * sellCount}("");
require(success1 && success2, "Unable to send funds");
accumulated[sharesSubject] += subjectFee * sellCount;
if (sharesSupply[sharesSubject] == 0) {
delete finalizedSubjects[sharesSubject];
}
}
function increaseSharesBalance(address sharesSubject, address holder, uint256 amount) internal {
_holders[sharesSubject].add(holder);
sharesBalance[sharesSubject][holder] += amount;
}
function decreaseSharesBalance(address sharesSubject, address holder, uint256 amount) internal {
uint256 currentBalance = sharesBalance[sharesSubject][holder];
require(currentBalance >= amount, "Insufficient shares");
if (currentBalance == amount) {
_holders[sharesSubject].remove(holder);
}
sharesBalance[sharesSubject][holder] = currentBalance - amount;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.20;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position is the index of the value in the `values` array plus 1.
// Position 0 is used to mean a value is not in the set.
mapping(bytes32 value => uint256) _positions;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._positions[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We cache the value's position to prevent multiple reads from the same storage slot
uint256 position = set._positions[value];
if (position != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 valueIndex = position - 1;
uint256 lastIndex = set._values.length - 1;
if (valueIndex != lastIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the lastValue to the index where the value to delete is
set._values[valueIndex] = lastValue;
// Update the tracked position of the lastValue (that was just moved)
set._positions[lastValue] = position;
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the tracked position for the deleted slot
delete set._positions[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._positions[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract AuthorityVerifier {
mapping(address => mapping(uint256 => bool)) private nonce;
function getMessageHash(address _signer, uint256 _amount, uint256 _nonce) public pure returns (bytes32) {
return keccak256(abi.encodePacked(_signer, _amount, _nonce));
}
function verify(address _signer, uint256 _amount, uint256 _nonce, bytes memory _signature) public returns (bool) {
require(nonce[_signer][_nonce] == false, "Nonce already used");
nonce[_signer][_nonce] = true;
bytes32 messageHash = getMessageHash(_signer, _amount, _nonce);
return recoverSigner(messageHash, _signature) == _signer;
}
function recoverSigner(bytes32 _messageHash, bytes memory _signature) public pure returns (address) {
(bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
return ecrecover(_messageHash, v, r, s);
}
function splitSignature(bytes memory sig) public pure returns (bytes32 r, bytes32 s, uint8 v) {
require(sig.length == 65, "invalid signature length");
assembly {
// first 32 bytes
r := mload(add(sig, 32))
// second 32 bytes
s := mload(add(sig, 64))
// final byte (first byte of next 32 bytes)
v := byte(0, mload(add(sig, 96)))
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": false,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"address","name":"subject","type":"address"},{"indexed":true,"internalType":"bool","name":"isBuy","type":"bool"},{"indexed":false,"internalType":"uint256","name":"shareAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"protocolEthAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"subjectEthAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"Trade","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accumulated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sharesSubject","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyShares","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"finalizedSubjects","outputs":[{"internalType":"bool","name":"isClosed","type":"bool"},{"internalType":"uint256","name":"finalSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sharesSubject","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getBuyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sharesSubject","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getBuyPriceAfterFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"sharesSubject","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getSellPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sharesSubject","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getSellPriceAfterFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmountAtATime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_messageHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sharesSubject","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sellShares","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"sellSharesBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeDestination","type":"address"}],"name":"setFeeDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setMaxAmountAtATime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feePercent","type":"uint256"}],"name":"setProtocolFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feePercent","type":"uint256"}],"name":"setSubjectFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setTradableOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"sharesBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sharesSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"subjectFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260016005555f60065f6101000a81548160ff02191690831515021790555034801561002d575f5ffd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361009f575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009691906101b4565b60405180910390fd5b6100ae816100b460201b60201c565b506101cd565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61019e82610175565b9050919050565b6101ae81610194565b82525050565b5f6020820190506101c75f8301846101a5565b92915050565b613642806101da5f395ff3fe6080604052600436106101c1575f3560e01c806398907681116100f6578063cc2153d111610094578063f1e548fc11610063578063f1e548fc14610676578063f2fde38b1461068c578063f9931be0146106b4578063fbe53234146106f0576101c1565b8063cc2153d1146105b8578063d2b0737b146105f4578063d6e6eb9f14610630578063e8ec12ad1461065a576101c1565b8063a7bb5803116100d0578063a7bb58031461051a578063ab265bbd14610558578063b51d053414610574578063bbe2df9414610590576101c1565b8063989076811461048c5780639ae71781146104b6578063a4983421146104f2576101c1565b80634ce7957c116101635780635cf4ee911161013d5780635cf4ee91146103d4578063715018a6146104105780638da5cb5b1461042657806397aba7f914610450576101c1565b80634ce7957c1461035857806354840c6e146103825780635a8a764e146103ac576101c1565b80632267a89c1161019f5780632267a89c1461027957806324dc441d146102b5578063264a82f8146102df5780634635256e1461031c576101c1565b8063020235ff146101c55780630deea608146102015780630f026f6d1461023d575b5f5ffd5b3480156101d0575f5ffd5b506101eb60048036038101906101e691906127ee565b610718565b6040516101f89190612844565b60405180910390f35b34801561020c575f5ffd5b50610227600480360381019061022291906129c3565b610738565b6040516102349190612a5d565b60405180910390f35b348015610248575f5ffd5b50610263600480360381019061025e9190612a76565b61088b565b6040516102709190612844565b60405180910390f35b348015610284575f5ffd5b5061029f600480360381019061029a9190612a76565b610903565b6040516102ac9190612844565b60405180910390f35b3480156102c0575f5ffd5b506102c961097b565b6040516102d69190612844565b60405180910390f35b3480156102ea575f5ffd5b5061030560048036038101906103009190612ab4565b610981565b604051610313929190612adf565b60405180910390f35b348015610327575f5ffd5b50610342600480360381019061033d9190612a76565b6109ad565b60405161034f9190612844565b60405180910390f35b348015610363575f5ffd5b5061036c6109fd565b6040516103799190612b15565b60405180910390f35b34801561038d575f5ffd5b50610396610a22565b6040516103a39190612a5d565b60405180910390f35b3480156103b7575f5ffd5b506103d260048036038101906103cd9190612b2e565b610a34565b005b3480156103df575f5ffd5b506103fa60048036038101906103f59190612b59565b610a46565b6040516104079190612844565b60405180910390f35b34801561041b575f5ffd5b50610424610bb9565b005b348015610431575f5ffd5b5061043a610bcc565b6040516104479190612b15565b60405180910390f35b34801561045b575f5ffd5b5061047660048036038101906104719190612bca565b610bf3565b6040516104839190612b15565b60405180910390f35b348015610497575f5ffd5b506104a0610c5d565b6040516104ad9190612844565b60405180910390f35b3480156104c1575f5ffd5b506104dc60048036038101906104d79190612a76565b610c63565b6040516104e99190612844565b60405180910390f35b3480156104fd575f5ffd5b5061051860048036038101906105139190612b2e565b610cbe565b005b348015610525575f5ffd5b50610540600480360381019061053b9190612c24565b610cd0565b60405161054f93929190612c95565b60405180910390f35b610572600480360381019061056d9190612cca565b610d35565b005b61058e60048036038101906105899190612a76565b611239565b005b34801561059b575f5ffd5b506105b660048036038101906105b19190612b2e565b611716565b005b3480156105c3575f5ffd5b506105de60048036038101906105d99190612ab4565b611728565b6040516105eb9190612844565b60405180910390f35b3480156105ff575f5ffd5b5061061a60048036038101906106159190612d4a565b61173d565b6040516106279190612d9a565b60405180910390f35b34801561063b575f5ffd5b50610644611772565b6040516106519190612844565b60405180910390f35b610674600480360381019061066f9190612b2e565b611778565b005b348015610681575f5ffd5b5061068a612013565b005b348015610697575f5ffd5b506106b260048036038101906106ad9190612ab4565b61208b565b005b3480156106bf575f5ffd5b506106da60048036038101906106d59190612ab4565b61210f565b6040516106e79190612844565b60405180910390f35b3480156106fb575f5ffd5b5061071660048036038101906107119190612ab4565b612124565b005b6008602052815f5260405f20602052805f5260405f205f91509150505481565b5f5f151560015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f9054906101000a900460ff161515146107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90612e0d565b60405180910390fd5b6001805f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f6101000a81548160ff0219169083151502179055505f61084686868661173d565b90508573ffffffffffffffffffffffffffffffffffffffff166108698285610bf3565b73ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b5f5f61089784846109ad565b90505f670de0b6b3a7640000600354836108b19190612e58565b6108bb9190612ec6565b90505f670de0b6b3a7640000600454846108d59190612e58565b6108df9190612ec6565b90508082846108ee9190612ef6565b6108f89190612ef6565b935050505092915050565b5f5f61090f8484610c63565b90505f670de0b6b3a7640000600354836109299190612e58565b6109339190612ec6565b90505f670de0b6b3a76400006004548461094d9190612e58565b6109579190612ec6565b90508082846109669190612f29565b6109709190612f29565b935050505092915050565b60045481565b600b602052805f5260405f205f91509050805f015f9054906101000a900460ff16908060010154905082565b5f6109f560095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483610a46565b905092915050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065f9054906101000a900460ff1681565b610a3c61216f565b8060048190555050565b5f60018214610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190612fa6565b60405180910390fd5b5f5f8414610ae957600660018086610aa29190612f29565b6002610aae9190612e58565b610ab89190612ef6565b85600187610ac69190612f29565b610ad09190612e58565b610ada9190612e58565b610ae49190612ec6565b610aeb565b5f5b90505f5f85148015610afd5750600184145b610b7a576006600185600188610b139190612f29565b610b1d9190612ef6565b6002610b299190612e58565b610b339190612ef6565b8587610b3f9190612ef6565b86600189610b4d9190612f29565b610b579190612ef6565b610b619190612e58565b610b6b9190612e58565b610b759190612ec6565b610b7c565b5f5b90505f8282610b8b9190612f29565b9050611388670de0b6b3a764000082610ba49190612e58565b610bae9190612ec6565b935050505092915050565b610bc161216f565b610bca5f6121f6565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f5f5f5f610c0085610cd0565b9250925092506001868285856040515f8152602001604052604051610c289493929190612fc4565b6020604051602081039080840390855afa158015610c48573d5f5f3e3d5ffd5b50505060206040510351935050505092915050565b60055481565b5f610cb68260095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610cb09190612f29565b83610a46565b905092915050565b610cc661216f565b8060038190555050565b5f5f5f6041845114610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90613051565b60405180910390fd5b602084015192506040840151915060608401515f1a90509193909250565b600554811115610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906130b9565b60405180910390fd5b600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff1615610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613121565b60405180910390fd5b610e1284828585610738565b610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890613189565b60405180910390fd5b5f60095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506001151560065f9054906101000a900460ff16151514610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede906131f1565b60405180910390fd5b5f610ef28284610a46565b90505f670de0b6b3a764000060035483610f0c9190612e58565b610f169190612ec6565b90505f670de0b6b3a764000060045484610f309190612e58565b610f3a9190612ec6565b9050808284610f499190612ef6565b610f539190612ef6565b341015610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c90613259565b60405180910390fd5b610fa08833876122b7565b8484610fac9190612ef6565b60095f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600115158873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2c76e7a47fd53e2854856ac3f0a5f3ee40d15cfaa82266357ea9779c486ab9c3888787878c8c6110509190612ef6565b604051611061959493929190613277565b60405180910390a45f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516110af906132f5565b5f6040518083038185875af1925050503d805f81146110e9576040519150601f19603f3d011682016040523d82523d5f602084013e6110ee565b606091505b505090505f8973ffffffffffffffffffffffffffffffffffffffff1683604051611117906132f5565b5f6040518083038185875af1925050503d805f8114611151576040519150601f19603f3d011682016040523d82523d5f602084013e611156565b606091505b505090508180156111645750805b6111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90613353565b60405180910390fd5b82600a5f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111ec9190612ef6565b600a5f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050505050505050505050565b60055481111561127e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611275906130b9565b60405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff161561130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190613121565b60405180910390fd5b5f60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811161138d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611384906133bb565b60405180910390fd5b5f6113a3838361139d9190612f29565b84610a46565b90505f670de0b6b3a7640000600354836113bd9190612e58565b6113c79190612ec6565b90505f670de0b6b3a7640000600454846113e19190612e58565b6113eb9190612ec6565b90506113f886338761239a565b84846114049190612f29565b60095f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f15158673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2c76e7a47fd53e2854856ac3f0a5f3ee40d15cfaa82266357ea9779c486ab9c3888787878c8c6114a79190612f29565b6040516114b8959493929190613277565b60405180910390a45f3373ffffffffffffffffffffffffffffffffffffffff168284866114e59190612f29565b6114ef9190612f29565b6040516114fb906132f5565b5f6040518083038185875af1925050503d805f8114611535576040519150601f19603f3d011682016040523d82523d5f602084013e61153a565b606091505b505090505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684604051611584906132f5565b5f6040518083038185875af1925050503d805f81146115be576040519150601f19603f3d011682016040523d82523d5f602084013e6115c3565b606091505b505090505f8873ffffffffffffffffffffffffffffffffffffffff16846040516115ec906132f5565b5f6040518083038185875af1925050503d805f8114611626576040519150601f19603f3d011682016040523d82523d5f602084013e61162b565b606091505b505090508280156116395750815b80156116425750805b611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890613353565b60405180910390fd5b83600a5f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546116ca9190612ef6565b600a5f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050505050505050565b61171e61216f565b8060058190555050565b600a602052805f5260405f205f915090505481565b5f8383836040516020016117539392919061343e565b6040516020818303038152906040528051906020012090509392505050565b60035481565b5f3390505f6117c260075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061253f565b90508281106117d157826117d3565b805b90505f8111611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e906134c4565b60405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff1661192457604051806040016040528060011515815260200160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054815250600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff021916908315150217905550602082015181600101559050505b5f600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101549050600181116119ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a2906133bb565b60405180910390fd5b5f600182611388670de0b6b3a76400006006600180886119cb9190612f29565b60026119d79190612e58565b6119e19190612ef6565b876001896119ef9190612f29565b6119f99190612e58565b611a039190612e58565b611a0d9190612ec6565b611a179190612e58565b611a219190612ec6565b611a2b9190612ec6565b611a359190612f29565b90505f670de0b6b3a764000060035483611a4f9190612e58565b611a599190612ec6565b90505f670de0b6b3a764000060045484611a739190612e58565b611a7d9190612ec6565b90505f818385611a8d9190612f29565b611a979190612f29565b90505f5f90505f5f90505b87811015611db9575f611afa5f60075f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061255290919063ffffffff16565b90505f60085f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508084611b849190612ef6565b9350611bd58260075f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061256990919063ffffffff16565b505f8160095f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611c209190612f29565b90508060095f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f15158c73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2c76e7a47fd53e2854856ac3f0a5f3ee40d15cfaa82266357ea9779c486ab9c385868b611cc39190612e58565b878e611ccf9190612e58565b888e611cdb9190612e58565b88604051611ced959493929190613277565b60405180910390a45f8373ffffffffffffffffffffffffffffffffffffffff168388611d199190612e58565b604051611d25906132f5565b5f6040518083038185875af1925050503d805f8114611d5f576040519150601f19603f3d011682016040523d82523d5f602084013e611d64565b606091505b5050905080611da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f90613353565b60405180910390fd5b505050508080600101915050611aa2565b505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168286611dff9190612e58565b604051611e0b906132f5565b5f6040518083038185875af1925050503d805f8114611e45576040519150601f19603f3d011682016040523d82523d5f602084013e611e4a565b606091505b505090505f8973ffffffffffffffffffffffffffffffffffffffff168386611e729190612e58565b604051611e7e906132f5565b5f6040518083038185875af1925050503d805f8114611eb8576040519150601f19603f3d011682016040523d82523d5f602084013e611ebd565b606091505b50509050818015611ecb5750805b611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0190613353565b60405180910390fd5b8285611f169190612e58565b600a5f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f619190612ef6565b925050819055505f60095f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20540361200657600b5f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f5f82015f6101000a81549060ff0219169055600182015f905550505b5050505050505050505050565b61201b61216f565b5f151560065f9054906101000a900460ff1615151461206f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120669061352c565b60405180910390fd5b600160065f6101000a81548160ff021916908315150217905550565b61209361216f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612103575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016120fa9190612b15565b60405180910390fd5b61210c816121f6565b50565b6009602052805f5260405f205f915090505481565b61212c61216f565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612177612596565b73ffffffffffffffffffffffffffffffffffffffff16612195610bcc565b73ffffffffffffffffffffffffffffffffffffffff16146121f4576121b8612596565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016121eb9190612b15565b60405180910390fd5b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123068260075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061259d90919063ffffffff16565b508060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461238e9190612ef6565b92505081905550505050565b5f60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245090613594565b60405180910390fd5b8181036124b1576124af8360075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061256990919063ffffffff16565b505b81816124bd9190612f29565b60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050505050565b5f61254b825f016125ca565b9050919050565b5f61255f835f01836125d9565b5f1c905092915050565b5f61258e835f018373ffffffffffffffffffffffffffffffffffffffff165f1b612600565b905092915050565b5f33905090565b5f6125c2835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6126fc565b905092915050565b5f815f01805490509050919050565b5f825f0182815481106125ef576125ee6135b2565b5b905f5260205f200154905092915050565b5f5f836001015f8481526020019081526020015f205490505f81146126f1575f60018261262d9190612f29565b90505f6001865f01805490506126439190612f29565b90508082146126a9575f865f018281548110612662576126616135b2565b5b905f5260205f200154905080875f018481548110612683576126826135b2565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f018054806126bc576126bb6135df565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506126f6565b5f9150505b92915050565b5f6127078383612763565b61275957825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f20819055506001905061275d565b5f90505b92915050565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127bd82612794565b9050919050565b6127cd816127b3565b81146127d7575f5ffd5b50565b5f813590506127e8816127c4565b92915050565b5f5f604083850312156128045761280361278c565b5b5f612811858286016127da565b9250506020612822858286016127da565b9150509250929050565b5f819050919050565b61283e8161282c565b82525050565b5f6020820190506128575f830184612835565b92915050565b6128668161282c565b8114612870575f5ffd5b50565b5f813590506128818161285d565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6128d58261288f565b810181811067ffffffffffffffff821117156128f4576128f361289f565b5b80604052505050565b5f612906612783565b905061291282826128cc565b919050565b5f67ffffffffffffffff8211156129315761293061289f565b5b61293a8261288f565b9050602081019050919050565b828183375f83830152505050565b5f61296761296284612917565b6128fd565b9050828152602081018484840111156129835761298261288b565b5b61298e848285612947565b509392505050565b5f82601f8301126129aa576129a9612887565b5b81356129ba848260208601612955565b91505092915050565b5f5f5f5f608085870312156129db576129da61278c565b5b5f6129e8878288016127da565b94505060206129f987828801612873565b9350506040612a0a87828801612873565b925050606085013567ffffffffffffffff811115612a2b57612a2a612790565b5b612a3787828801612996565b91505092959194509250565b5f8115159050919050565b612a5781612a43565b82525050565b5f602082019050612a705f830184612a4e565b92915050565b5f5f60408385031215612a8c57612a8b61278c565b5b5f612a99858286016127da565b9250506020612aaa85828601612873565b9150509250929050565b5f60208284031215612ac957612ac861278c565b5b5f612ad6848285016127da565b91505092915050565b5f604082019050612af25f830185612a4e565b612aff6020830184612835565b9392505050565b612b0f816127b3565b82525050565b5f602082019050612b285f830184612b06565b92915050565b5f60208284031215612b4357612b4261278c565b5b5f612b5084828501612873565b91505092915050565b5f5f60408385031215612b6f57612b6e61278c565b5b5f612b7c85828601612873565b9250506020612b8d85828601612873565b9150509250929050565b5f819050919050565b612ba981612b97565b8114612bb3575f5ffd5b50565b5f81359050612bc481612ba0565b92915050565b5f5f60408385031215612be057612bdf61278c565b5b5f612bed85828601612bb6565b925050602083013567ffffffffffffffff811115612c0e57612c0d612790565b5b612c1a85828601612996565b9150509250929050565b5f60208284031215612c3957612c3861278c565b5b5f82013567ffffffffffffffff811115612c5657612c55612790565b5b612c6284828501612996565b91505092915050565b612c7481612b97565b82525050565b5f60ff82169050919050565b612c8f81612c7a565b82525050565b5f606082019050612ca85f830186612c6b565b612cb56020830185612c6b565b612cc26040830184612c86565b949350505050565b5f5f5f5f60808587031215612ce257612ce161278c565b5b5f612cef878288016127da565b9450506020612d0087828801612873565b935050604085013567ffffffffffffffff811115612d2157612d20612790565b5b612d2d87828801612996565b9250506060612d3e87828801612873565b91505092959194509250565b5f5f5f60608486031215612d6157612d6061278c565b5b5f612d6e868287016127da565b9350506020612d7f86828701612873565b9250506040612d9086828701612873565b9150509250925092565b5f602082019050612dad5f830184612c6b565b92915050565b5f82825260208201905092915050565b7f4e6f6e636520616c7265616479207573656400000000000000000000000000005f82015250565b5f612df7601283612db3565b9150612e0282612dc3565b602082019050919050565b5f6020820190508181035f830152612e2481612deb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612e628261282c565b9150612e6d8361282c565b9250828202612e7b8161282c565b91508282048414831517612e9257612e91612e2b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612ed08261282c565b9150612edb8361282c565b925082612eeb57612eea612e99565b5b828204905092915050565b5f612f008261282c565b9150612f0b8361282c565b9250828201905080821115612f2357612f22612e2b565b5b92915050565b5f612f338261282c565b9150612f3e8361282c565b9250828203905081811115612f5657612f55612e2b565b5b92915050565b7f6f6e6c79206f6e6520617420612074696d6500000000000000000000000000005f82015250565b5f612f90601283612db3565b9150612f9b82612f5c565b602082019050919050565b5f6020820190508181035f830152612fbd81612f84565b9050919050565b5f608082019050612fd75f830187612c6b565b612fe46020830186612c86565b612ff16040830185612c6b565b612ffe6060830184612c6b565b95945050505050565b7f696e76616c6964207369676e6174757265206c656e67746800000000000000005f82015250565b5f61303b601883612db3565b915061304682613007565b602082019050919050565b5f6020820190508181035f8301526130688161302f565b9050919050565b7f6d617820616d6f756e7420617420612074696d652065786365656465640000005f82015250565b5f6130a3601d83612db3565b91506130ae8261306f565b602082019050919050565b5f6020820190508181035f8301526130d081613097565b9050919050565b7f416c72656164792066696e616c697a65640000000000000000000000000000005f82015250565b5f61310b601183612db3565b9150613116826130d7565b602082019050919050565b5f6020820190508181035f830152613138816130ff565b9050919050565b7f696e76616c6964207369676e61747572650000000000000000000000000000005f82015250565b5f613173601183612db3565b915061317e8261313f565b602082019050919050565b5f6020820190508181035f8301526131a081613167565b9050919050565b7f4e6f74207472616461626c6520796574000000000000000000000000000000005f82015250565b5f6131db601083612db3565b91506131e6826131a7565b602082019050919050565b5f6020820190508181035f830152613208816131cf565b9050919050565b7f496e73756666696369656e74207061796d656e740000000000000000000000005f82015250565b5f613243601483612db3565b915061324e8261320f565b602082019050919050565b5f6020820190508181035f83015261327081613237565b9050919050565b5f60a08201905061328a5f830188612835565b6132976020830187612835565b6132a46040830186612835565b6132b16060830185612835565b6132be6080830184612835565b9695505050505050565b5f81905092915050565b50565b5f6132e05f836132c8565b91506132eb826132d2565b5f82019050919050565b5f6132ff826132d5565b9150819050919050565b7f556e61626c6520746f2073656e642066756e64730000000000000000000000005f82015250565b5f61333d601483612db3565b915061334882613309565b602082019050919050565b5f6020820190508181035f83015261336a81613331565b9050919050565b7f43616e6e6f742073656c6c20746865206c6173742073686172650000000000005f82015250565b5f6133a5601a83612db3565b91506133b082613371565b602082019050919050565b5f6020820190508181035f8301526133d281613399565b9050919050565b5f8160601b9050919050565b5f6133ef826133d9565b9050919050565b5f613400826133e5565b9050919050565b613418613413826127b3565b6133f6565b82525050565b5f819050919050565b6134386134338261282c565b61341e565b82525050565b5f6134498286613407565b6014820191506134598285613427565b6020820191506134698284613427565b602082019150819050949350505050565b7f43616e6e6f742073656c6c206e6f20686f6c64657273000000000000000000005f82015250565b5f6134ae601683612db3565b91506134b98261347a565b602082019050919050565b5f6020820190508181035f8301526134db816134a2565b9050919050565b7f416c7265616479207472616461626c65000000000000000000000000000000005f82015250565b5f613516601083612db3565b9150613521826134e2565b602082019050919050565b5f6020820190508181035f8301526135438161350a565b9050919050565b7f496e73756666696369656e7420736861726573000000000000000000000000005f82015250565b5f61357e601383612db3565b91506135898261354a565b602082019050919050565b5f6020820190508181035f8301526135ab81613572565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220d2ac0f7b90d93e69d0a1d9759c32def686337030fa3f0d06572dc311be9a136c64736f6c634300081b0033
Deployed Bytecode
0x6080604052600436106101c1575f3560e01c806398907681116100f6578063cc2153d111610094578063f1e548fc11610063578063f1e548fc14610676578063f2fde38b1461068c578063f9931be0146106b4578063fbe53234146106f0576101c1565b8063cc2153d1146105b8578063d2b0737b146105f4578063d6e6eb9f14610630578063e8ec12ad1461065a576101c1565b8063a7bb5803116100d0578063a7bb58031461051a578063ab265bbd14610558578063b51d053414610574578063bbe2df9414610590576101c1565b8063989076811461048c5780639ae71781146104b6578063a4983421146104f2576101c1565b80634ce7957c116101635780635cf4ee911161013d5780635cf4ee91146103d4578063715018a6146104105780638da5cb5b1461042657806397aba7f914610450576101c1565b80634ce7957c1461035857806354840c6e146103825780635a8a764e146103ac576101c1565b80632267a89c1161019f5780632267a89c1461027957806324dc441d146102b5578063264a82f8146102df5780634635256e1461031c576101c1565b8063020235ff146101c55780630deea608146102015780630f026f6d1461023d575b5f5ffd5b3480156101d0575f5ffd5b506101eb60048036038101906101e691906127ee565b610718565b6040516101f89190612844565b60405180910390f35b34801561020c575f5ffd5b50610227600480360381019061022291906129c3565b610738565b6040516102349190612a5d565b60405180910390f35b348015610248575f5ffd5b50610263600480360381019061025e9190612a76565b61088b565b6040516102709190612844565b60405180910390f35b348015610284575f5ffd5b5061029f600480360381019061029a9190612a76565b610903565b6040516102ac9190612844565b60405180910390f35b3480156102c0575f5ffd5b506102c961097b565b6040516102d69190612844565b60405180910390f35b3480156102ea575f5ffd5b5061030560048036038101906103009190612ab4565b610981565b604051610313929190612adf565b60405180910390f35b348015610327575f5ffd5b50610342600480360381019061033d9190612a76565b6109ad565b60405161034f9190612844565b60405180910390f35b348015610363575f5ffd5b5061036c6109fd565b6040516103799190612b15565b60405180910390f35b34801561038d575f5ffd5b50610396610a22565b6040516103a39190612a5d565b60405180910390f35b3480156103b7575f5ffd5b506103d260048036038101906103cd9190612b2e565b610a34565b005b3480156103df575f5ffd5b506103fa60048036038101906103f59190612b59565b610a46565b6040516104079190612844565b60405180910390f35b34801561041b575f5ffd5b50610424610bb9565b005b348015610431575f5ffd5b5061043a610bcc565b6040516104479190612b15565b60405180910390f35b34801561045b575f5ffd5b5061047660048036038101906104719190612bca565b610bf3565b6040516104839190612b15565b60405180910390f35b348015610497575f5ffd5b506104a0610c5d565b6040516104ad9190612844565b60405180910390f35b3480156104c1575f5ffd5b506104dc60048036038101906104d79190612a76565b610c63565b6040516104e99190612844565b60405180910390f35b3480156104fd575f5ffd5b5061051860048036038101906105139190612b2e565b610cbe565b005b348015610525575f5ffd5b50610540600480360381019061053b9190612c24565b610cd0565b60405161054f93929190612c95565b60405180910390f35b610572600480360381019061056d9190612cca565b610d35565b005b61058e60048036038101906105899190612a76565b611239565b005b34801561059b575f5ffd5b506105b660048036038101906105b19190612b2e565b611716565b005b3480156105c3575f5ffd5b506105de60048036038101906105d99190612ab4565b611728565b6040516105eb9190612844565b60405180910390f35b3480156105ff575f5ffd5b5061061a60048036038101906106159190612d4a565b61173d565b6040516106279190612d9a565b60405180910390f35b34801561063b575f5ffd5b50610644611772565b6040516106519190612844565b60405180910390f35b610674600480360381019061066f9190612b2e565b611778565b005b348015610681575f5ffd5b5061068a612013565b005b348015610697575f5ffd5b506106b260048036038101906106ad9190612ab4565b61208b565b005b3480156106bf575f5ffd5b506106da60048036038101906106d59190612ab4565b61210f565b6040516106e79190612844565b60405180910390f35b3480156106fb575f5ffd5b5061071660048036038101906107119190612ab4565b612124565b005b6008602052815f5260405f20602052805f5260405f205f91509150505481565b5f5f151560015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f9054906101000a900460ff161515146107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90612e0d565b60405180910390fd5b6001805f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f6101000a81548160ff0219169083151502179055505f61084686868661173d565b90508573ffffffffffffffffffffffffffffffffffffffff166108698285610bf3565b73ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b5f5f61089784846109ad565b90505f670de0b6b3a7640000600354836108b19190612e58565b6108bb9190612ec6565b90505f670de0b6b3a7640000600454846108d59190612e58565b6108df9190612ec6565b90508082846108ee9190612ef6565b6108f89190612ef6565b935050505092915050565b5f5f61090f8484610c63565b90505f670de0b6b3a7640000600354836109299190612e58565b6109339190612ec6565b90505f670de0b6b3a76400006004548461094d9190612e58565b6109579190612ec6565b90508082846109669190612f29565b6109709190612f29565b935050505092915050565b60045481565b600b602052805f5260405f205f91509050805f015f9054906101000a900460ff16908060010154905082565b5f6109f560095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483610a46565b905092915050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065f9054906101000a900460ff1681565b610a3c61216f565b8060048190555050565b5f60018214610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190612fa6565b60405180910390fd5b5f5f8414610ae957600660018086610aa29190612f29565b6002610aae9190612e58565b610ab89190612ef6565b85600187610ac69190612f29565b610ad09190612e58565b610ada9190612e58565b610ae49190612ec6565b610aeb565b5f5b90505f5f85148015610afd5750600184145b610b7a576006600185600188610b139190612f29565b610b1d9190612ef6565b6002610b299190612e58565b610b339190612ef6565b8587610b3f9190612ef6565b86600189610b4d9190612f29565b610b579190612ef6565b610b619190612e58565b610b6b9190612e58565b610b759190612ec6565b610b7c565b5f5b90505f8282610b8b9190612f29565b9050611388670de0b6b3a764000082610ba49190612e58565b610bae9190612ec6565b935050505092915050565b610bc161216f565b610bca5f6121f6565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f5f5f5f610c0085610cd0565b9250925092506001868285856040515f8152602001604052604051610c289493929190612fc4565b6020604051602081039080840390855afa158015610c48573d5f5f3e3d5ffd5b50505060206040510351935050505092915050565b60055481565b5f610cb68260095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610cb09190612f29565b83610a46565b905092915050565b610cc661216f565b8060038190555050565b5f5f5f6041845114610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90613051565b60405180910390fd5b602084015192506040840151915060608401515f1a90509193909250565b600554811115610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906130b9565b60405180910390fd5b600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff1615610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613121565b60405180910390fd5b610e1284828585610738565b610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890613189565b60405180910390fd5b5f60095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506001151560065f9054906101000a900460ff16151514610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede906131f1565b60405180910390fd5b5f610ef28284610a46565b90505f670de0b6b3a764000060035483610f0c9190612e58565b610f169190612ec6565b90505f670de0b6b3a764000060045484610f309190612e58565b610f3a9190612ec6565b9050808284610f499190612ef6565b610f539190612ef6565b341015610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c90613259565b60405180910390fd5b610fa08833876122b7565b8484610fac9190612ef6565b60095f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600115158873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2c76e7a47fd53e2854856ac3f0a5f3ee40d15cfaa82266357ea9779c486ab9c3888787878c8c6110509190612ef6565b604051611061959493929190613277565b60405180910390a45f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516110af906132f5565b5f6040518083038185875af1925050503d805f81146110e9576040519150601f19603f3d011682016040523d82523d5f602084013e6110ee565b606091505b505090505f8973ffffffffffffffffffffffffffffffffffffffff1683604051611117906132f5565b5f6040518083038185875af1925050503d805f8114611151576040519150601f19603f3d011682016040523d82523d5f602084013e611156565b606091505b505090508180156111645750805b6111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90613353565b60405180910390fd5b82600a5f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111ec9190612ef6565b600a5f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050505050505050505050565b60055481111561127e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611275906130b9565b60405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff161561130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190613121565b60405180910390fd5b5f60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811161138d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611384906133bb565b60405180910390fd5b5f6113a3838361139d9190612f29565b84610a46565b90505f670de0b6b3a7640000600354836113bd9190612e58565b6113c79190612ec6565b90505f670de0b6b3a7640000600454846113e19190612e58565b6113eb9190612ec6565b90506113f886338761239a565b84846114049190612f29565b60095f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f15158673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2c76e7a47fd53e2854856ac3f0a5f3ee40d15cfaa82266357ea9779c486ab9c3888787878c8c6114a79190612f29565b6040516114b8959493929190613277565b60405180910390a45f3373ffffffffffffffffffffffffffffffffffffffff168284866114e59190612f29565b6114ef9190612f29565b6040516114fb906132f5565b5f6040518083038185875af1925050503d805f8114611535576040519150601f19603f3d011682016040523d82523d5f602084013e61153a565b606091505b505090505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684604051611584906132f5565b5f6040518083038185875af1925050503d805f81146115be576040519150601f19603f3d011682016040523d82523d5f602084013e6115c3565b606091505b505090505f8873ffffffffffffffffffffffffffffffffffffffff16846040516115ec906132f5565b5f6040518083038185875af1925050503d805f8114611626576040519150601f19603f3d011682016040523d82523d5f602084013e61162b565b606091505b505090508280156116395750815b80156116425750805b611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890613353565b60405180910390fd5b83600a5f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546116ca9190612ef6565b600a5f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050505050505050565b61171e61216f565b8060058190555050565b600a602052805f5260405f205f915090505481565b5f8383836040516020016117539392919061343e565b6040516020818303038152906040528051906020012090509392505050565b60035481565b5f3390505f6117c260075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061253f565b90508281106117d157826117d3565b805b90505f8111611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e906134c4565b60405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff1661192457604051806040016040528060011515815260200160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054815250600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff021916908315150217905550602082015181600101559050505b5f600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101549050600181116119ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a2906133bb565b60405180910390fd5b5f600182611388670de0b6b3a76400006006600180886119cb9190612f29565b60026119d79190612e58565b6119e19190612ef6565b876001896119ef9190612f29565b6119f99190612e58565b611a039190612e58565b611a0d9190612ec6565b611a179190612e58565b611a219190612ec6565b611a2b9190612ec6565b611a359190612f29565b90505f670de0b6b3a764000060035483611a4f9190612e58565b611a599190612ec6565b90505f670de0b6b3a764000060045484611a739190612e58565b611a7d9190612ec6565b90505f818385611a8d9190612f29565b611a979190612f29565b90505f5f90505f5f90505b87811015611db9575f611afa5f60075f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061255290919063ffffffff16565b90505f60085f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508084611b849190612ef6565b9350611bd58260075f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061256990919063ffffffff16565b505f8160095f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611c209190612f29565b90508060095f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f15158c73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2c76e7a47fd53e2854856ac3f0a5f3ee40d15cfaa82266357ea9779c486ab9c385868b611cc39190612e58565b878e611ccf9190612e58565b888e611cdb9190612e58565b88604051611ced959493929190613277565b60405180910390a45f8373ffffffffffffffffffffffffffffffffffffffff168388611d199190612e58565b604051611d25906132f5565b5f6040518083038185875af1925050503d805f8114611d5f576040519150601f19603f3d011682016040523d82523d5f602084013e611d64565b606091505b5050905080611da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f90613353565b60405180910390fd5b505050508080600101915050611aa2565b505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168286611dff9190612e58565b604051611e0b906132f5565b5f6040518083038185875af1925050503d805f8114611e45576040519150601f19603f3d011682016040523d82523d5f602084013e611e4a565b606091505b505090505f8973ffffffffffffffffffffffffffffffffffffffff168386611e729190612e58565b604051611e7e906132f5565b5f6040518083038185875af1925050503d805f8114611eb8576040519150601f19603f3d011682016040523d82523d5f602084013e611ebd565b606091505b50509050818015611ecb5750805b611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0190613353565b60405180910390fd5b8285611f169190612e58565b600a5f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f619190612ef6565b925050819055505f60095f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20540361200657600b5f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f5f82015f6101000a81549060ff0219169055600182015f905550505b5050505050505050505050565b61201b61216f565b5f151560065f9054906101000a900460ff1615151461206f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120669061352c565b60405180910390fd5b600160065f6101000a81548160ff021916908315150217905550565b61209361216f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612103575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016120fa9190612b15565b60405180910390fd5b61210c816121f6565b50565b6009602052805f5260405f205f915090505481565b61212c61216f565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612177612596565b73ffffffffffffffffffffffffffffffffffffffff16612195610bcc565b73ffffffffffffffffffffffffffffffffffffffff16146121f4576121b8612596565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016121eb9190612b15565b60405180910390fd5b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123068260075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061259d90919063ffffffff16565b508060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461238e9190612ef6565b92505081905550505050565b5f60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245090613594565b60405180910390fd5b8181036124b1576124af8360075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061256990919063ffffffff16565b505b81816124bd9190612f29565b60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050505050565b5f61254b825f016125ca565b9050919050565b5f61255f835f01836125d9565b5f1c905092915050565b5f61258e835f018373ffffffffffffffffffffffffffffffffffffffff165f1b612600565b905092915050565b5f33905090565b5f6125c2835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6126fc565b905092915050565b5f815f01805490509050919050565b5f825f0182815481106125ef576125ee6135b2565b5b905f5260205f200154905092915050565b5f5f836001015f8481526020019081526020015f205490505f81146126f1575f60018261262d9190612f29565b90505f6001865f01805490506126439190612f29565b90508082146126a9575f865f018281548110612662576126616135b2565b5b905f5260205f200154905080875f018481548110612683576126826135b2565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f018054806126bc576126bb6135df565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506126f6565b5f9150505b92915050565b5f6127078383612763565b61275957825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f20819055506001905061275d565b5f90505b92915050565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127bd82612794565b9050919050565b6127cd816127b3565b81146127d7575f5ffd5b50565b5f813590506127e8816127c4565b92915050565b5f5f604083850312156128045761280361278c565b5b5f612811858286016127da565b9250506020612822858286016127da565b9150509250929050565b5f819050919050565b61283e8161282c565b82525050565b5f6020820190506128575f830184612835565b92915050565b6128668161282c565b8114612870575f5ffd5b50565b5f813590506128818161285d565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6128d58261288f565b810181811067ffffffffffffffff821117156128f4576128f361289f565b5b80604052505050565b5f612906612783565b905061291282826128cc565b919050565b5f67ffffffffffffffff8211156129315761293061289f565b5b61293a8261288f565b9050602081019050919050565b828183375f83830152505050565b5f61296761296284612917565b6128fd565b9050828152602081018484840111156129835761298261288b565b5b61298e848285612947565b509392505050565b5f82601f8301126129aa576129a9612887565b5b81356129ba848260208601612955565b91505092915050565b5f5f5f5f608085870312156129db576129da61278c565b5b5f6129e8878288016127da565b94505060206129f987828801612873565b9350506040612a0a87828801612873565b925050606085013567ffffffffffffffff811115612a2b57612a2a612790565b5b612a3787828801612996565b91505092959194509250565b5f8115159050919050565b612a5781612a43565b82525050565b5f602082019050612a705f830184612a4e565b92915050565b5f5f60408385031215612a8c57612a8b61278c565b5b5f612a99858286016127da565b9250506020612aaa85828601612873565b9150509250929050565b5f60208284031215612ac957612ac861278c565b5b5f612ad6848285016127da565b91505092915050565b5f604082019050612af25f830185612a4e565b612aff6020830184612835565b9392505050565b612b0f816127b3565b82525050565b5f602082019050612b285f830184612b06565b92915050565b5f60208284031215612b4357612b4261278c565b5b5f612b5084828501612873565b91505092915050565b5f5f60408385031215612b6f57612b6e61278c565b5b5f612b7c85828601612873565b9250506020612b8d85828601612873565b9150509250929050565b5f819050919050565b612ba981612b97565b8114612bb3575f5ffd5b50565b5f81359050612bc481612ba0565b92915050565b5f5f60408385031215612be057612bdf61278c565b5b5f612bed85828601612bb6565b925050602083013567ffffffffffffffff811115612c0e57612c0d612790565b5b612c1a85828601612996565b9150509250929050565b5f60208284031215612c3957612c3861278c565b5b5f82013567ffffffffffffffff811115612c5657612c55612790565b5b612c6284828501612996565b91505092915050565b612c7481612b97565b82525050565b5f60ff82169050919050565b612c8f81612c7a565b82525050565b5f606082019050612ca85f830186612c6b565b612cb56020830185612c6b565b612cc26040830184612c86565b949350505050565b5f5f5f5f60808587031215612ce257612ce161278c565b5b5f612cef878288016127da565b9450506020612d0087828801612873565b935050604085013567ffffffffffffffff811115612d2157612d20612790565b5b612d2d87828801612996565b9250506060612d3e87828801612873565b91505092959194509250565b5f5f5f60608486031215612d6157612d6061278c565b5b5f612d6e868287016127da565b9350506020612d7f86828701612873565b9250506040612d9086828701612873565b9150509250925092565b5f602082019050612dad5f830184612c6b565b92915050565b5f82825260208201905092915050565b7f4e6f6e636520616c7265616479207573656400000000000000000000000000005f82015250565b5f612df7601283612db3565b9150612e0282612dc3565b602082019050919050565b5f6020820190508181035f830152612e2481612deb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612e628261282c565b9150612e6d8361282c565b9250828202612e7b8161282c565b91508282048414831517612e9257612e91612e2b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612ed08261282c565b9150612edb8361282c565b925082612eeb57612eea612e99565b5b828204905092915050565b5f612f008261282c565b9150612f0b8361282c565b9250828201905080821115612f2357612f22612e2b565b5b92915050565b5f612f338261282c565b9150612f3e8361282c565b9250828203905081811115612f5657612f55612e2b565b5b92915050565b7f6f6e6c79206f6e6520617420612074696d6500000000000000000000000000005f82015250565b5f612f90601283612db3565b9150612f9b82612f5c565b602082019050919050565b5f6020820190508181035f830152612fbd81612f84565b9050919050565b5f608082019050612fd75f830187612c6b565b612fe46020830186612c86565b612ff16040830185612c6b565b612ffe6060830184612c6b565b95945050505050565b7f696e76616c6964207369676e6174757265206c656e67746800000000000000005f82015250565b5f61303b601883612db3565b915061304682613007565b602082019050919050565b5f6020820190508181035f8301526130688161302f565b9050919050565b7f6d617820616d6f756e7420617420612074696d652065786365656465640000005f82015250565b5f6130a3601d83612db3565b91506130ae8261306f565b602082019050919050565b5f6020820190508181035f8301526130d081613097565b9050919050565b7f416c72656164792066696e616c697a65640000000000000000000000000000005f82015250565b5f61310b601183612db3565b9150613116826130d7565b602082019050919050565b5f6020820190508181035f830152613138816130ff565b9050919050565b7f696e76616c6964207369676e61747572650000000000000000000000000000005f82015250565b5f613173601183612db3565b915061317e8261313f565b602082019050919050565b5f6020820190508181035f8301526131a081613167565b9050919050565b7f4e6f74207472616461626c6520796574000000000000000000000000000000005f82015250565b5f6131db601083612db3565b91506131e6826131a7565b602082019050919050565b5f6020820190508181035f830152613208816131cf565b9050919050565b7f496e73756666696369656e74207061796d656e740000000000000000000000005f82015250565b5f613243601483612db3565b915061324e8261320f565b602082019050919050565b5f6020820190508181035f83015261327081613237565b9050919050565b5f60a08201905061328a5f830188612835565b6132976020830187612835565b6132a46040830186612835565b6132b16060830185612835565b6132be6080830184612835565b9695505050505050565b5f81905092915050565b50565b5f6132e05f836132c8565b91506132eb826132d2565b5f82019050919050565b5f6132ff826132d5565b9150819050919050565b7f556e61626c6520746f2073656e642066756e64730000000000000000000000005f82015250565b5f61333d601483612db3565b915061334882613309565b602082019050919050565b5f6020820190508181035f83015261336a81613331565b9050919050565b7f43616e6e6f742073656c6c20746865206c6173742073686172650000000000005f82015250565b5f6133a5601a83612db3565b91506133b082613371565b602082019050919050565b5f6020820190508181035f8301526133d281613399565b9050919050565b5f8160601b9050919050565b5f6133ef826133d9565b9050919050565b5f613400826133e5565b9050919050565b613418613413826127b3565b6133f6565b82525050565b5f819050919050565b6134386134338261282c565b61341e565b82525050565b5f6134498286613407565b6014820191506134598285613427565b6020820191506134698284613427565b602082019150819050949350505050565b7f43616e6e6f742073656c6c206e6f20686f6c64657273000000000000000000005f82015250565b5f6134ae601683612db3565b91506134b98261347a565b602082019050919050565b5f6020820190508181035f8301526134db816134a2565b9050919050565b7f416c7265616479207472616461626c65000000000000000000000000000000005f82015250565b5f613516601083612db3565b9150613521826134e2565b602082019050919050565b5f6020820190508181035f8301526135438161350a565b9050919050565b7f496e73756666696369656e7420736861726573000000000000000000000000005f82015250565b5f61357e601383612db3565b91506135898261354a565b602082019050919050565b5f6020820190508181035f8301526135ab81613572565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220d2ac0f7b90d93e69d0a1d9759c32def686337030fa3f0d06572dc311be9a136c64736f6c634300081b0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$5.46
Net Worth in S
Token Allocations
S
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| SONIC | 100.00% | $0.067392 | 81.0926 | $5.46 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.