Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 309 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| New Waitlist Roo... | 19129557 | 785 days ago | IN | 0 ETH | 0.00086062 | ||||
| New Waitlist Roo... | 16993249 | 1085 days ago | IN | 0 ETH | 0.0014431 | ||||
| _Join Waitlist | 16821960 | 1109 days ago | IN | 0 ETH | 0.0008298 | ||||
| _Join Waitlist | 16581819 | 1142 days ago | IN | 0 ETH | 0.00088369 | ||||
| New Waitlist Roo... | 15763820 | 1257 days ago | IN | 0 ETH | 0.00037111 | ||||
| _Join Waitlist | 15750198 | 1258 days ago | IN | 0 ETH | 0.0014542 | ||||
| _Join Waitlist | 15750192 | 1258 days ago | IN | 0 ETH | 0.00138729 | ||||
| _Join Waitlist | 15750189 | 1258 days ago | IN | 0 ETH | 0.00151442 | ||||
| _Join Waitlist | 15750178 | 1258 days ago | IN | 0 ETH | 0.00140165 | ||||
| _Join Waitlist | 15749130 | 1259 days ago | IN | 0 ETH | 0.001523 | ||||
| _Join Waitlist | 15746624 | 1259 days ago | IN | 0 ETH | 0.00171219 | ||||
| _Join Waitlist | 15743420 | 1259 days ago | IN | 0 ETH | 0.00111545 | ||||
| _Join Waitlist | 15743414 | 1259 days ago | IN | 0 ETH | 0.00113491 | ||||
| _Join Waitlist | 15739197 | 1260 days ago | IN | 0 ETH | 0.00141541 | ||||
| _Join Waitlist | 15737729 | 1260 days ago | IN | 0 ETH | 0.00117523 | ||||
| _Join Waitlist | 15737006 | 1260 days ago | IN | 0 ETH | 0.00152869 | ||||
| _Join Waitlist | 15736217 | 1260 days ago | IN | 0 ETH | 0.0018968 | ||||
| _Join Waitlist | 15733957 | 1261 days ago | IN | 0 ETH | 0.00176157 | ||||
| _Join Waitlist | 15732685 | 1261 days ago | IN | 0 ETH | 0.00209991 | ||||
| _Join Waitlist | 15730849 | 1261 days ago | IN | 0 ETH | 0.0013516 | ||||
| _Join Waitlist | 15730615 | 1261 days ago | IN | 0 ETH | 0.00143712 | ||||
| _Join Waitlist | 15730341 | 1261 days ago | IN | 0 ETH | 0.00172494 | ||||
| _Join Waitlist | 15730320 | 1261 days ago | IN | 0 ETH | 0.00172548 | ||||
| _Join Waitlist | 15729461 | 1261 days ago | IN | 0 ETH | 0.00181457 | ||||
| _Join Waitlist | 15728178 | 1262 days ago | IN | 0 ETH | 0.0015336 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Waitlist
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT-BROUGKR
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
/**
* @dev: @brougkr
*/
pragma solidity 0.8.17;
import {IERC721} from "@openzeppelin/contracts/interfaces/IERC721.sol";
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import {ReentrancyGuard} from '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import {MerkleProof} from '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol';
contract Waitlist is ReentrancyGuard
{
struct CitizenCity
{
string _Name;
address _ContractAddress;
uint _StartingTokenID;
uint _EndingTokenID;
bool _Active;
}
struct User
{
uint[] _City1;
uint[] _City2;
uint[] _City3;
uint[] _City4;
uint[] _City5;
uint[] _City6;
uint[] _City7;
uint[] _City8;
uint[] _City9;
uint[] _City10;
}
CitizenCity[] CitizenCities;
mapping(uint => address[]) public Waitlists;
mapping(uint => bytes32) public Roots;
mapping(uint => uint[]) public CitizenAmounts;
mapping(uint => mapping(address => bool)) public _WaitlistJoined;
mapping(address=>bool) Roles;
event NewCity(string Name, address ContractAddress, uint StartingTokenID, uint EndingTokenID, bool Active);
event ModifiedCity(CitizenCity);
event WaitlistJoined(uint WaitlistIndex, uint CitizenHoldings, string Data);
constructor()
{
Roots[0] = 0x017553e3a6f5bed53e01882966cebfae785485c013ba2bc16b64aa9e33e2c221;
Roles[msg.sender] = true; // deployer.brightmoments.eth
Roles[0x18B7511938FBe2EE08ADf3d4A24edB00A5C9B783] = true; // phil.brightmoments.eth
Roles[0xB96E81f80b3AEEf65CB6d0E280b15FD5DBE71937] = true; // brightmoments.eth
CitizenCities.push(CitizenCity('CryptoGalacticans', 0xbDdE08BD57e5C9fD563eE7aC61618CB2ECdc0ce0, 0, 999, true));
CitizenCities.push(CitizenCity('CryptoVenetians', 0xa7d8d9ef8D8Ce8992Df33D8b8CF4Aebabd5bD270, 95000000, 95000999, true));
CitizenCities.push(CitizenCity('CryptoNewYorkers', 0xa7d8d9ef8D8Ce8992Df33D8b8CF4Aebabd5bD270, 189000000, 189000999, true));
CitizenCities.push(CitizenCity('CryptoBerliners', 0xbDdE08BD57e5C9fD563eE7aC61618CB2ECdc0ce0, 3000000, 3000999, true));
CitizenCities.push(CitizenCity('CryptoLondoners', 0xbDdE08BD57e5C9fD563eE7aC61618CB2ECdc0ce0, 4000000, 4000999, true));
CitizenCities.push(CitizenCity('CryptoMexas', 0xbDdE08BD57e5C9fD563eE7aC61618CB2ECdc0ce0, 5000000, 5000999, false));
CitizenCities.push(CitizenCity('City #7', 0xbDdE08BD57e5C9fD563eE7aC61618CB2ECdc0ce0, 6000000, 6000999, false));
CitizenCities.push(CitizenCity('City #8', 0xbDdE08BD57e5C9fD563eE7aC61618CB2ECdc0ce0, 7000000, 7000999, false));
CitizenCities.push(CitizenCity('City #9', 0xbDdE08BD57e5C9fD563eE7aC61618CB2ECdc0ce0, 8000000, 8000999, false));
CitizenCities.push(CitizenCity('City #10', 0xbDdE08BD57e5C9fD563eE7aC61618CB2ECdc0ce0, 9000000, 9000999, false));
}
/**
* @dev Joins Waitlist
*/
function JoinWaitlist(uint WaitlistIndex, string calldata NewData, bytes32[] calldata Proof) external nonReentrant
{
require(VerifyBrightList(WaitlistIndex, msg.sender, Proof), "Waitlist: User Is Not On BrightList");
require(!_WaitlistJoined[WaitlistIndex][msg.sender], "Waitlist: Already User Already Joined");
_WaitlistJoined[WaitlistIndex][msg.sender] = true;
Waitlists[WaitlistIndex].push(msg.sender);
uint Amount = readWalletNumCitizens(msg.sender);
CitizenAmounts[WaitlistIndex].push(Amount);
emit WaitlistJoined(WaitlistIndex, Amount, NewData);
}
/**
* @dev Joins Waitlist Without Reading Citizen Holdings
*/
function _JoinWaitlist(uint WaitlistIndex, string calldata NewData, bytes32[] calldata Proof) external nonReentrant
{
require(VerifyBrightList(WaitlistIndex, msg.sender, Proof), "Waitlist: User Is Not On BrightList");
require(!_WaitlistJoined[WaitlistIndex][msg.sender], "Waitlist: Already User Already Joined");
_WaitlistJoined[WaitlistIndex][msg.sender] = true;
Waitlists[WaitlistIndex].push(msg.sender);
CitizenAmounts[WaitlistIndex].push(0);
emit WaitlistJoined(WaitlistIndex, 0, NewData);
}
/*******************
* ADMIN FUNCTIONS *
******************/
/**
* @dev Instantiates A New Waitlist Root
*/
function NewWaitlistRoots(uint WaitlistIndex, bytes32 Root) external onlyBRTAdmin { Roots[WaitlistIndex] = Root; }
/**
* @dev Clears A Whitelist
*/
function ClearWaitlist(uint WaitlistIndex) external onlyBRTAdmin
{
delete Waitlists[WaitlistIndex];
delete CitizenAmounts[WaitlistIndex];
}
/**
* @dev Adds Citizen City
*/
function CitizenCityAdd(
string calldata Name,
address ContractAddress,
uint StartingTokenID,
uint EndingTokenID,
bool Active
) external onlyBRTAdmin {
CitizenCities.push(CitizenCity(Name, ContractAddress, StartingTokenID, EndingTokenID, Active));
emit NewCity(Name, ContractAddress, StartingTokenID, EndingTokenID, Active);
}
/**
* @dev Modifies Citizen City
*/
function CitizenCityModify(
uint CityNumber,
string calldata Name,
address ContractAddress,
uint StartingTokenID,
uint EndingTokenID,
bool Active
) external onlyBRTAdmin {
CitizenCities[CityNumber]._Name = Name;
CitizenCities[CityNumber]._ContractAddress = ContractAddress;
CitizenCities[CityNumber]._StartingTokenID = StartingTokenID;
CitizenCities[CityNumber]._EndingTokenID = EndingTokenID;
CitizenCities[CityNumber]._Active = Active;
emit ModifiedCity(CitizenCities[CityNumber]);
}
/**
* @dev Flips Citizen City Active State
*/
function CitizenCityFlipActiveState(uint CityNumber) external onlyBRTAdmin
{
CitizenCities[CityNumber]._Active = !CitizenCities[CityNumber]._Active;
}
/******************
* VIEW FUNCTIONS *
*****************/
/**
* @dev Returns If User Is On BrightList
*/
function VerifyBrightList(uint WaitlistIndex, address Recipient, bytes32[] calldata Proof) public view returns (bool)
{
bytes32 Leaf = keccak256(abi.encodePacked(Recipient));
return MerkleProof.verify(Proof, Roots[WaitlistIndex], Leaf);
}
/**
* @dev Returns Citizens Owned By Wallet
*/
function readWalletNumCitizens(address Wallet) public view returns(uint)
{
uint NumCitizens;
for(uint x; x < CitizenCities.length; x++)
{
if(CitizenCities[x]._Active)
{
IERC721 NFT = IERC721(CitizenCities[x]._ContractAddress);
for(uint TokenID = CitizenCities[x]._StartingTokenID; TokenID <= CitizenCities[x]._EndingTokenID; TokenID++)
{
try NFT.ownerOf(TokenID) { if(NFT.ownerOf(TokenID) == Wallet) { NumCitizens++; } } catch { }
}
}
}
return NumCitizens;
}
/**
* @dev Returns If A Wallet Is In Waitlist
*/
function readWaitlistWallet(uint WaitlistIndex, address Wallet) public view returns (bool)
{
for(uint x; x < Waitlists[WaitlistIndex].length; x++)
{
if(Waitlists[WaitlistIndex][x] == Wallet) { return true; }
}
return false;
}
/**
* @dev Reads An Entire Waitlist
*/
function readWaitlist(uint WaitlistIndex) public view returns(address[] memory Wallets, uint[] memory Amounts)
{
address[] memory _Wallets = new address[](Waitlists[WaitlistIndex].length);
uint[] memory _CitizenAmounts = new uint[](Waitlists[WaitlistIndex].length);
for(uint x; x < Waitlists[WaitlistIndex].length; x++)
{
_Wallets[x] = Waitlists[WaitlistIndex][x];
_CitizenAmounts[x] = CitizenAmounts[WaitlistIndex][x];
}
return (_Wallets, _CitizenAmounts);
}
/**
* @dev BRT Admin Modifier
*/
modifier onlyBRTAdmin
{
require(Roles[msg.sender]);
_;
}
}// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The proofs can be generated using the JavaScript library
* https://github.com/miguelmota/merkletreejs[merkletreejs].
* Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
*
* See `test/utils/cryptography/MerkleProof.test.js` for some examples.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* _Available since v4.7._
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
* consuming from one or the other at each step according to the instructions given by
* `proofFlags`.
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}{
"optimizer": {
"enabled": true,
"runs": 10000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"address","name":"_ContractAddress","type":"address"},{"internalType":"uint256","name":"_StartingTokenID","type":"uint256"},{"internalType":"uint256","name":"_EndingTokenID","type":"uint256"},{"internalType":"bool","name":"_Active","type":"bool"}],"indexed":false,"internalType":"struct Waitlist.CitizenCity","name":"","type":"tuple"}],"name":"ModifiedCity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"Name","type":"string"},{"indexed":false,"internalType":"address","name":"ContractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"StartingTokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"EndingTokenID","type":"uint256"},{"indexed":false,"internalType":"bool","name":"Active","type":"bool"}],"name":"NewCity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"WaitlistIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"CitizenHoldings","type":"uint256"},{"indexed":false,"internalType":"string","name":"Data","type":"string"}],"name":"WaitlistJoined","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"CitizenAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"Name","type":"string"},{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint256","name":"StartingTokenID","type":"uint256"},{"internalType":"uint256","name":"EndingTokenID","type":"uint256"},{"internalType":"bool","name":"Active","type":"bool"}],"name":"CitizenCityAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityNumber","type":"uint256"}],"name":"CitizenCityFlipActiveState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityNumber","type":"uint256"},{"internalType":"string","name":"Name","type":"string"},{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint256","name":"StartingTokenID","type":"uint256"},{"internalType":"uint256","name":"EndingTokenID","type":"uint256"},{"internalType":"bool","name":"Active","type":"bool"}],"name":"CitizenCityModify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"WaitlistIndex","type":"uint256"}],"name":"ClearWaitlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"WaitlistIndex","type":"uint256"},{"internalType":"string","name":"NewData","type":"string"},{"internalType":"bytes32[]","name":"Proof","type":"bytes32[]"}],"name":"JoinWaitlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"WaitlistIndex","type":"uint256"},{"internalType":"bytes32","name":"Root","type":"bytes32"}],"name":"NewWaitlistRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Roots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"WaitlistIndex","type":"uint256"},{"internalType":"address","name":"Recipient","type":"address"},{"internalType":"bytes32[]","name":"Proof","type":"bytes32[]"}],"name":"VerifyBrightList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"Waitlists","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"WaitlistIndex","type":"uint256"},{"internalType":"string","name":"NewData","type":"string"},{"internalType":"bytes32[]","name":"Proof","type":"bytes32[]"}],"name":"_JoinWaitlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_WaitlistJoined","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"WaitlistIndex","type":"uint256"}],"name":"readWaitlist","outputs":[{"internalType":"address[]","name":"Wallets","type":"address[]"},{"internalType":"uint256[]","name":"Amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"WaitlistIndex","type":"uint256"},{"internalType":"address","name":"Wallet","type":"address"}],"name":"readWaitlistWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"Wallet","type":"address"}],"name":"readWalletNumCitizens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50600160008181557f017553e3a6f5bed53e01882966cebfae785485c013ba2bc16b64aa9e33e2c2217f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff55338152600660209081526040808320805460ff1990811686179091557faa530a1a49323299215cad2bed639006deb5ade68437ff9e88f6bdf90fa14d8880548216861790557fa67385b9f8edcf822cfcaf2274be0107a18061cbdbbcf2482334897aed4c1f37805490911685179055805160e081018252601160a082019081527043727970746f47616c6163746963616e7360781b60c083015281526000805160206200279d8339815191529281019290925281018290526103e7606082015260808101839052825480840184559290915280519091600502600080516020620027bd8339815191520190819062000155908262000a96565b50602082810151600183810180546001600160a01b0319166001600160a01b0390931692909217909155604080850151600285015560608086015160038601556080958601516004909501805460ff191695151595909517909455805160e081018252600f60a082019081526e43727970746f56656e657469616e7360881b60c0830152815273a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270938101939093526305a995c0908301526305a999a792820192909252918201819052805480820182556000919091528151600080516020620027bd83398151915260059092029190910190819062000249908262000a96565b50602082810151600183810180546001600160a01b0319166001600160a01b0390931692909217909155604080850151600285015560608086015160038601556080958601516004909501805460ff191695151595909517909455805160e081018252601060a082019081526f43727970746f4e6577596f726b65727360801b60c0830152815273a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd27093810193909352630b43e94090830152630b43ed2792820192909252918201819052805480820182556000919091528151600080516020620027bd8339815191526005909202919091019081906200033e908262000a96565b50602082810151600183810180546001600160a01b0319166001600160a01b0390931692909217909155604080850151600285015560608086015160038601556080958601516004909501805460ff191695151595909517909455805160e081018252600f60a082019081526e43727970746f4265726c696e65727360881b60c083015281526000805160206200279d83398151915293810193909352622dc6c090830152622dcaa792820192909252918201819052805480820182556000919091528151600080516020620027bd8339815191526005909202919091019081906200042b908262000a96565b50602082810151600183810180546001600160a01b0319166001600160a01b0390931692909217909155604080850151600285015560608086015160038601556080958601516004909501805460ff191695151595909517909455805160e081018252600f60a082019081526e43727970746f4c6f6e646f6e65727360881b60c083015281526000805160206200279d83398151915293810193909352623d090090830152623d0ce792820192909252918201819052805480820182556000919091528151600080516020620027bd83398151915260059092029190910190819062000518908262000a96565b50602082810151600183810180546001600160a01b0319166001600160a01b0390931692909217909155604080850151600285015560608086015160038601556080958601516004909501805460ff191695151595909517909455805160e081018252600b60a082019081526a43727970746f4d6578617360a81b60c083015281526000805160206200279d83398151915293810193909352624c4b4090830152624c4f2792820192909252600092810183905281548083018355919092528151600080516020620027bd83398151915260059092029190910190819062000601908262000a96565b50602082810151600183810180546001600160a01b0319166001600160a01b0390931692909217909155604080850151600285015560608086015160038601556080958601516004909501805460ff191695151595909517909455805160e081018252600760a08201908152664369747920233760c81b60c083015281526000805160206200279d83398151915293810193909352625b8d8090830152625b916792820192909252600092810183905281548083018355919092528151600080516020620027bd833981519152600590920291909101908190620006e6908262000a96565b50602082810151600183810180546001600160a01b0319166001600160a01b0390931692909217909155604080850151600285015560608086015160038601556080958601516004909501805460ff191695151595909517909455805160e081018252600760a0820190815266086d2e8f24046760cb1b60c083015281526000805160206200279d83398151915293810193909352626acfc090830152626ad3a792820192909252600092810183905281548083018355919092528151600080516020620027bd833981519152600590920291909101908190620007cb908262000a96565b50602082810151600183810180546001600160a01b0319166001600160a01b0390931692909217909155604080850151600285015560608086015160038601556080958601516004909501805460ff191695151595909517909455805160e081018252600760a08201908152664369747920233960c81b60c083015281526000805160206200279d83398151915293810193909352627a120090830152627a15e792820192909252600092810183905281548083018355919092528151600080516020620027bd833981519152600590920291909101908190620008b0908262000a96565b50602082810151600183810180546001600160a01b0319166001600160a01b0390931692909217909155604080850151600285015560608086015160038601556080958601516004909501805460ff191695151595909517909455805160e081018252600860a0820190815267043697479202331360c41b60c083015281526000805160206200279d8339815191529381019390935262895440908301526289582792820192909252600092810183905281548083018355919092528151600080516020620027bd83398151915260059092029190910190819062000996908262000a96565b5060208201516001820180546001600160a01b0319166001600160a01b0390921691909117905560408201516002820155606082015160038201556080909101516004909101805460ff191691151591909117905562000b62565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a1c57607f821691505b60208210810362000a3d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a9157600081815260208120601f850160051c8101602086101562000a6c5750805b601f850160051c820191505b8181101562000a8d5782815560010162000a78565b5050505b505050565b81516001600160401b0381111562000ab25762000ab2620009f1565b62000aca8162000ac3845462000a07565b8462000a43565b602080601f83116001811462000b02576000841562000ae95750858301515b600019600386901b1c1916600185901b17855562000a8d565b600085815260208120601f198616915b8281101562000b335788860151825594840194600190910190840162000b12565b508582101562000b525787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611c2b8062000b726000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063a92e7c6e11610097578063d540212011610066578063d54021201461024b578063e82bbde41461025e578063eefa765014610271578063eefda7321461028457600080fd5b8063a92e7c6e146101ff578063ab530c7814610212578063c1d6eaa814610225578063ccc82fc91461023857600080fd5b80634866862b116100d35780634866862b1461016f57806372e8995b1461019d578063804e79e5146101b057806397beb196146101d157600080fd5b806309d06951146100fa5780630a35897d1461010f57806311182c3b1461014c575b600080fd5b61010d6101083660046112df565b610297565b005b61012261011d3660046112f8565b6102e4565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61015f61015a366004611388565b610329565b6040519015158152602001610143565b61018f61017d3660046112df565b60036020526000908152604090205481565b604051908152602001610143565b61015f6101ab3660046113e4565b6103cd565b6101c36101be3660046112df565b61046f565b604051610143929190611414565b61015f6101df3660046113e4565b600560209081526000928352604080842090915290825290205460ff1681565b61018f61020d3660046114a5565b61061b565b61010d6102203660046112df565b610885565b61010d610233366004611504565b61092a565b61010d610246366004611593565b610be1565b61010d610259366004611504565b610d82565b61010d61026c366004611616565b611021565b61018f61027f3660046112f8565b6111b9565b61010d6102923660046112f8565b6111ea565b3360009081526006602052604090205460ff166102b357600080fd5b60008181526002602052604081206102ca916112ad565b60008181526004602052604081206102e1916112ad565b50565b6002602052816000526040600020818154811061030057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602082015260009081906034016040516020818303038152906040528051906020012090506103c384848080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508b81526003602052604090205492508591506112189050565b9695505050505050565b6000805b600084815260026020526040902054811015610463576000848152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff85169190839081106104205761042061168e565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1603610451576001915050610469565b8061045b816116bd565b9150506103d1565b50600090505b92915050565b600081815260026020526040812054606091829167ffffffffffffffff81111561049b5761049b61171c565b6040519080825280602002602001820160405280156104c4578160200160208202803683370190505b506000858152600260205260408120549192509067ffffffffffffffff8111156104f0576104f061171c565b604051908082528060200260200182016040528015610519578160200160208202803683370190505b50905060005b6000868152600260205260409020548110156106105760008681526002602052604090208054829081106105555761055561168e565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382815181106105925761059261168e565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910182015260008781526004909152604090208054829081106105d6576105d661168e565b90600052602060002001548282815181106105f3576105f361168e565b602090810291909101015280610608816116bd565b91505061051f565b509094909350915050565b60008060005b60015481101561087e576001818154811061063e5761063e61168e565b600091825260209091206004600590920201015460ff161561086c5760006001828154811061066f5761066f61168e565b6000918252602082206001600590920201810154815473ffffffffffffffffffffffffffffffffffffffff9091169350849081106106af576106af61168e565b90600052602060002090600502016002015490505b600183815481106106d7576106d761168e565b9060005260206000209060050201600301548111610869576040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff831690636352211e90602401602060405180830381865afa925050508015610794575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526107919181019061174b565b60015b1561085757506040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8088169190841690636352211e90602401602060405180830381865afa15801561080a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082e919061174b565b73ffffffffffffffffffffffffffffffffffffffff16036108575783610853816116bd565b9450505b80610861816116bd565b9150506106c4565b50505b80610876816116bd565b915050610621565b5092915050565b3360009081526006602052604090205460ff166108a157600080fd5b600181815481106108b4576108b461168e565b906000526020600020906005020160040160009054906101000a900460ff1615600182815481106108e7576108e761168e565b6000918252602090912060059091020160040180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60026000540361099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000556109ac85338484610329565b610a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f576169746c6973743a2055736572204973204e6f74204f6e204272696768744c60448201527f69737400000000000000000000000000000000000000000000000000000000006064820152608401610992565b600085815260056020908152604080832033845290915290205460ff1615610ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f576169746c6973743a20416c7265616479205573657220416c7265616479204a60448201527f6f696e65640000000000000000000000000000000000000000000000000000006064820152608401610992565b60008581526005602090815260408083203380855290835281842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155898552600284529184208054928301815584529183200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001682179055610b719061061b565b600087815260046020908152604080832080546001810182559084529190922001829055519091507f9aa72834e20f85d9e8cb16578a8e606e71030f37b0c1c9f31e6184c1d4d4e8dd90610bcc9088908490899089906117b1565b60405180910390a15050600160005550505050565b3360009081526006602052604090205460ff16610bfd57600080fd5b858560018981548110610c1257610c1261168e565b90600052602060002090600502016000019182610c30929190611873565b508360018881548110610c4557610c4561168e565b906000526020600020906005020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260018881548110610ca857610ca861168e565b9060005260206000209060050201600201819055508160018881548110610cd157610cd161168e565b9060005260206000209060050201600301819055508060018881548110610cfa57610cfa61168e565b906000526020600020906005020160040160006101000a81548160ff0219169083151502179055507f12c76ee43f1a8e4a0b3bd70bbf60ca1ba8672c7f8061e15018a32a6ebe49e4b260018881548110610d5657610d5661168e565b9060005260206000209060050201604051610d71919061198e565b60405180910390a150505050505050565b600260005403610dee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610992565b6002600055610dff85338484610329565b610e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f576169746c6973743a2055736572204973204e6f74204f6e204272696768744c60448201527f69737400000000000000000000000000000000000000000000000000000000006064820152608401610992565b600085815260056020908152604080832033845290915290205460ff1615610f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f576169746c6973743a20416c7265616479205573657220416c7265616479204a60448201527f6f696e65640000000000000000000000000000000000000000000000000000006064820152608401610992565b60008581526005602090815260408083203380855290835281842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915589855260028452828520805480830182559086528486200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915588845260048352818420805491820181558452918320909101829055517f9aa72834e20f85d9e8cb16578a8e606e71030f37b0c1c9f31e6184c1d4d4e8dd9161100d91889190889088906117b1565b60405180910390a150506001600055505050565b3360009081526006602052604090205460ff1661103d57600080fd5b6040805160c06020601f8901819004028201810190925260a081018781526001928291908a908a9081908501838280828437600092018290525093855250505073ffffffffffffffffffffffffffffffffffffffff8816602080840191909152604083018890526060830187905285151560809093019290925283546001810185559381522081519192600502019081906110d89082611a8a565b5060208201516001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055604080830151600283015560608301516003830155608090920151600490910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055517fa4c6380e9d64befdca8fa4153b9684e4fa2b01c9e046ce80072e863e8be8e053906111a990889088908890889088908890611ba4565b60405180910390a1505050505050565b600460205281600052604060002081815481106111d557600080fd5b90600052602060002001600091509150505481565b3360009081526006602052604090205460ff1661120657600080fd5b60009182526003602052604090912055565b600082611225858461122e565b14949350505050565b600081815b84518110156112735761125f828683815181106112525761125261168e565b602002602001015161127b565b91508061126b816116bd565b915050611233565b509392505050565b60008183106112975760008281526020849052604090206112a6565b60008381526020839052604090205b9392505050565b50805460008255906000526020600020908101906102e191905b808211156112db57600081556001016112c7565b5090565b6000602082840312156112f157600080fd5b5035919050565b6000806040838503121561130b57600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff811681146102e157600080fd5b60008083601f84011261134e57600080fd5b50813567ffffffffffffffff81111561136657600080fd5b6020830191508360208260051b850101111561138157600080fd5b9250929050565b6000806000806060858703121561139e57600080fd5b8435935060208501356113b08161131a565b9250604085013567ffffffffffffffff8111156113cc57600080fd5b6113d88782880161133c565b95989497509550505050565b600080604083850312156113f757600080fd5b8235915060208301356114098161131a565b809150509250929050565b604080825283519082018190526000906020906060840190828701845b8281101561146357815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611431565b5050508381038285015284518082528583019183019060005b818110156114985783518352928401929184019160010161147c565b5090979650505050505050565b6000602082840312156114b757600080fd5b81356112a68161131a565b60008083601f8401126114d457600080fd5b50813567ffffffffffffffff8111156114ec57600080fd5b60208301915083602082850101111561138157600080fd5b60008060008060006060868803121561151c57600080fd5b85359450602086013567ffffffffffffffff8082111561153b57600080fd5b61154789838a016114c2565b9096509450604088013591508082111561156057600080fd5b5061156d8882890161133c565b969995985093965092949392505050565b8035801515811461158e57600080fd5b919050565b600080600080600080600060c0888a0312156115ae57600080fd5b87359650602088013567ffffffffffffffff8111156115cc57600080fd5b6115d88a828b016114c2565b90975095505060408801356115ec8161131a565b9350606088013592506080880135915061160860a0890161157e565b905092959891949750929550565b60008060008060008060a0878903121561162f57600080fd5b863567ffffffffffffffff81111561164657600080fd5b61165289828a016114c2565b90975095505060208701356116668161131a565b935060408701359250606087013591506116826080880161157e565b90509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611715577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561175d57600080fd5b81516112a68161131a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8481528360208201526060604082015260006103c3606083018486611768565b600181811c908216806117e557607f821691505b60208210810361181e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561186e57600081815260208120601f850160051c8101602086101561184b5750805b601f850160051c820191505b8181101561186a57828155600101611857565b5050505b505050565b67ffffffffffffffff83111561188b5761188b61171c565b61189f8361189983546117d1565b83611824565b6000601f8411600181146118f157600085156118bb5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611987565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156119405786850135825560209485019460019092019101611920565b508682101561197b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6000602080835260a081840152600084546119a8816117d1565b8060c087015260e06001808416600081146119ca5760018114611a0257611a30565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550611a30565b896000528660002060005b85811015611a285781548b8201860152908301908801611a0d565b8a0184019650505b5088015473ffffffffffffffffffffffffffffffffffffffff16604088018190529450611a5c92505050565b6002850154606085015260038501546080850152600485015460ff1680151560a08601529150949350505050565b815167ffffffffffffffff811115611aa457611aa461171c565b611ab881611ab284546117d1565b84611824565b602080601f831160018114611b0b5760008415611ad55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561186a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611b5857888601518255948401946001909101908401611b39565b5085821015611b9457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60a081526000611bb860a08301888a611768565b905073ffffffffffffffffffffffffffffffffffffffff86166020830152846040830152836060830152821515608083015297965050505050505056fea2646970667358221220796b731496510621f6a4bc30b8bdb452b364d72771e0b369626b761639cc0c1f64736f6c63430008110033000000000000000000000000bdde08bd57e5c9fd563ee7ac61618cb2ecdc0ce0b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063a92e7c6e11610097578063d540212011610066578063d54021201461024b578063e82bbde41461025e578063eefa765014610271578063eefda7321461028457600080fd5b8063a92e7c6e146101ff578063ab530c7814610212578063c1d6eaa814610225578063ccc82fc91461023857600080fd5b80634866862b116100d35780634866862b1461016f57806372e8995b1461019d578063804e79e5146101b057806397beb196146101d157600080fd5b806309d06951146100fa5780630a35897d1461010f57806311182c3b1461014c575b600080fd5b61010d6101083660046112df565b610297565b005b61012261011d3660046112f8565b6102e4565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61015f61015a366004611388565b610329565b6040519015158152602001610143565b61018f61017d3660046112df565b60036020526000908152604090205481565b604051908152602001610143565b61015f6101ab3660046113e4565b6103cd565b6101c36101be3660046112df565b61046f565b604051610143929190611414565b61015f6101df3660046113e4565b600560209081526000928352604080842090915290825290205460ff1681565b61018f61020d3660046114a5565b61061b565b61010d6102203660046112df565b610885565b61010d610233366004611504565b61092a565b61010d610246366004611593565b610be1565b61010d610259366004611504565b610d82565b61010d61026c366004611616565b611021565b61018f61027f3660046112f8565b6111b9565b61010d6102923660046112f8565b6111ea565b3360009081526006602052604090205460ff166102b357600080fd5b60008181526002602052604081206102ca916112ad565b60008181526004602052604081206102e1916112ad565b50565b6002602052816000526040600020818154811061030057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602082015260009081906034016040516020818303038152906040528051906020012090506103c384848080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508b81526003602052604090205492508591506112189050565b9695505050505050565b6000805b600084815260026020526040902054811015610463576000848152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff85169190839081106104205761042061168e565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1603610451576001915050610469565b8061045b816116bd565b9150506103d1565b50600090505b92915050565b600081815260026020526040812054606091829167ffffffffffffffff81111561049b5761049b61171c565b6040519080825280602002602001820160405280156104c4578160200160208202803683370190505b506000858152600260205260408120549192509067ffffffffffffffff8111156104f0576104f061171c565b604051908082528060200260200182016040528015610519578160200160208202803683370190505b50905060005b6000868152600260205260409020548110156106105760008681526002602052604090208054829081106105555761055561168e565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382815181106105925761059261168e565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910182015260008781526004909152604090208054829081106105d6576105d661168e565b90600052602060002001548282815181106105f3576105f361168e565b602090810291909101015280610608816116bd565b91505061051f565b509094909350915050565b60008060005b60015481101561087e576001818154811061063e5761063e61168e565b600091825260209091206004600590920201015460ff161561086c5760006001828154811061066f5761066f61168e565b6000918252602082206001600590920201810154815473ffffffffffffffffffffffffffffffffffffffff9091169350849081106106af576106af61168e565b90600052602060002090600502016002015490505b600183815481106106d7576106d761168e565b9060005260206000209060050201600301548111610869576040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff831690636352211e90602401602060405180830381865afa925050508015610794575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526107919181019061174b565b60015b1561085757506040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8088169190841690636352211e90602401602060405180830381865afa15801561080a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082e919061174b565b73ffffffffffffffffffffffffffffffffffffffff16036108575783610853816116bd565b9450505b80610861816116bd565b9150506106c4565b50505b80610876816116bd565b915050610621565b5092915050565b3360009081526006602052604090205460ff166108a157600080fd5b600181815481106108b4576108b461168e565b906000526020600020906005020160040160009054906101000a900460ff1615600182815481106108e7576108e761168e565b6000918252602090912060059091020160040180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60026000540361099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000556109ac85338484610329565b610a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f576169746c6973743a2055736572204973204e6f74204f6e204272696768744c60448201527f69737400000000000000000000000000000000000000000000000000000000006064820152608401610992565b600085815260056020908152604080832033845290915290205460ff1615610ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f576169746c6973743a20416c7265616479205573657220416c7265616479204a60448201527f6f696e65640000000000000000000000000000000000000000000000000000006064820152608401610992565b60008581526005602090815260408083203380855290835281842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155898552600284529184208054928301815584529183200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001682179055610b719061061b565b600087815260046020908152604080832080546001810182559084529190922001829055519091507f9aa72834e20f85d9e8cb16578a8e606e71030f37b0c1c9f31e6184c1d4d4e8dd90610bcc9088908490899089906117b1565b60405180910390a15050600160005550505050565b3360009081526006602052604090205460ff16610bfd57600080fd5b858560018981548110610c1257610c1261168e565b90600052602060002090600502016000019182610c30929190611873565b508360018881548110610c4557610c4561168e565b906000526020600020906005020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260018881548110610ca857610ca861168e565b9060005260206000209060050201600201819055508160018881548110610cd157610cd161168e565b9060005260206000209060050201600301819055508060018881548110610cfa57610cfa61168e565b906000526020600020906005020160040160006101000a81548160ff0219169083151502179055507f12c76ee43f1a8e4a0b3bd70bbf60ca1ba8672c7f8061e15018a32a6ebe49e4b260018881548110610d5657610d5661168e565b9060005260206000209060050201604051610d71919061198e565b60405180910390a150505050505050565b600260005403610dee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610992565b6002600055610dff85338484610329565b610e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f576169746c6973743a2055736572204973204e6f74204f6e204272696768744c60448201527f69737400000000000000000000000000000000000000000000000000000000006064820152608401610992565b600085815260056020908152604080832033845290915290205460ff1615610f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f576169746c6973743a20416c7265616479205573657220416c7265616479204a60448201527f6f696e65640000000000000000000000000000000000000000000000000000006064820152608401610992565b60008581526005602090815260408083203380855290835281842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915589855260028452828520805480830182559086528486200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915588845260048352818420805491820181558452918320909101829055517f9aa72834e20f85d9e8cb16578a8e606e71030f37b0c1c9f31e6184c1d4d4e8dd9161100d91889190889088906117b1565b60405180910390a150506001600055505050565b3360009081526006602052604090205460ff1661103d57600080fd5b6040805160c06020601f8901819004028201810190925260a081018781526001928291908a908a9081908501838280828437600092018290525093855250505073ffffffffffffffffffffffffffffffffffffffff8816602080840191909152604083018890526060830187905285151560809093019290925283546001810185559381522081519192600502019081906110d89082611a8a565b5060208201516001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055604080830151600283015560608301516003830155608090920151600490910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055517fa4c6380e9d64befdca8fa4153b9684e4fa2b01c9e046ce80072e863e8be8e053906111a990889088908890889088908890611ba4565b60405180910390a1505050505050565b600460205281600052604060002081815481106111d557600080fd5b90600052602060002001600091509150505481565b3360009081526006602052604090205460ff1661120657600080fd5b60009182526003602052604090912055565b600082611225858461122e565b14949350505050565b600081815b84518110156112735761125f828683815181106112525761125261168e565b602002602001015161127b565b91508061126b816116bd565b915050611233565b509392505050565b60008183106112975760008281526020849052604090206112a6565b60008381526020839052604090205b9392505050565b50805460008255906000526020600020908101906102e191905b808211156112db57600081556001016112c7565b5090565b6000602082840312156112f157600080fd5b5035919050565b6000806040838503121561130b57600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff811681146102e157600080fd5b60008083601f84011261134e57600080fd5b50813567ffffffffffffffff81111561136657600080fd5b6020830191508360208260051b850101111561138157600080fd5b9250929050565b6000806000806060858703121561139e57600080fd5b8435935060208501356113b08161131a565b9250604085013567ffffffffffffffff8111156113cc57600080fd5b6113d88782880161133c565b95989497509550505050565b600080604083850312156113f757600080fd5b8235915060208301356114098161131a565b809150509250929050565b604080825283519082018190526000906020906060840190828701845b8281101561146357815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611431565b5050508381038285015284518082528583019183019060005b818110156114985783518352928401929184019160010161147c565b5090979650505050505050565b6000602082840312156114b757600080fd5b81356112a68161131a565b60008083601f8401126114d457600080fd5b50813567ffffffffffffffff8111156114ec57600080fd5b60208301915083602082850101111561138157600080fd5b60008060008060006060868803121561151c57600080fd5b85359450602086013567ffffffffffffffff8082111561153b57600080fd5b61154789838a016114c2565b9096509450604088013591508082111561156057600080fd5b5061156d8882890161133c565b969995985093965092949392505050565b8035801515811461158e57600080fd5b919050565b600080600080600080600060c0888a0312156115ae57600080fd5b87359650602088013567ffffffffffffffff8111156115cc57600080fd5b6115d88a828b016114c2565b90975095505060408801356115ec8161131a565b9350606088013592506080880135915061160860a0890161157e565b905092959891949750929550565b60008060008060008060a0878903121561162f57600080fd5b863567ffffffffffffffff81111561164657600080fd5b61165289828a016114c2565b90975095505060208701356116668161131a565b935060408701359250606087013591506116826080880161157e565b90509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611715577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561175d57600080fd5b81516112a68161131a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8481528360208201526060604082015260006103c3606083018486611768565b600181811c908216806117e557607f821691505b60208210810361181e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561186e57600081815260208120601f850160051c8101602086101561184b5750805b601f850160051c820191505b8181101561186a57828155600101611857565b5050505b505050565b67ffffffffffffffff83111561188b5761188b61171c565b61189f8361189983546117d1565b83611824565b6000601f8411600181146118f157600085156118bb5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611987565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156119405786850135825560209485019460019092019101611920565b508682101561197b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6000602080835260a081840152600084546119a8816117d1565b8060c087015260e06001808416600081146119ca5760018114611a0257611a30565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550611a30565b896000528660002060005b85811015611a285781548b8201860152908301908801611a0d565b8a0184019650505b5088015473ffffffffffffffffffffffffffffffffffffffff16604088018190529450611a5c92505050565b6002850154606085015260038501546080850152600485015460ff1680151560a08601529150949350505050565b815167ffffffffffffffff811115611aa457611aa461171c565b611ab881611ab284546117d1565b84611824565b602080601f831160018114611b0b5760008415611ad55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561186a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611b5857888601518255948401946001909101908401611b39565b5085821015611b9457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60a081526000611bb860a08301888a611768565b905073ffffffffffffffffffffffffffffffffffffffff86166020830152846040830152836060830152821515608083015297965050505050505056fea2646970667358221220796b731496510621f6a4bc30b8bdb452b364d72771e0b369626b761639cc0c1f64736f6c63430008110033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.