ETH Price: $2,434.16 (-8.65%)

Token

aeUpFrontDeal-Lords Deal Token (aeUD-LORDS)
 

Overview

Max Total Supply

3,138,753.016917680310952815 aeUD-LORDS

Holders

89

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
9,255.822421943151869851 aeUD-LORDS

Value
$0.00
0x247b7e245002e6b525782366dec32446f645320d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Minimal Proxy Contract for 0xc3b9d873a71bceaae796e7dc9585db8b4fec6f60

Contract Name:
AelinUpFrontDeal

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 25 : AelinUpFrontDeal.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import "./AelinERC20.sol";
import "./MinimalProxyFactory.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import {AelinDeal} from "./AelinDeal.sol";
import {AelinPool} from "./AelinPool.sol";
import {AelinFeeEscrow} from "./AelinFeeEscrow.sol";
import {IAelinUpFrontDeal} from "./interfaces/IAelinUpFrontDeal.sol";
import "./libraries/AelinNftGating.sol";
import "./libraries/AelinAllowList.sol";
import "./libraries/MerkleTree.sol";
contract AelinUpFrontDeal is AelinERC20, MinimalProxyFactory, IAelinUpFrontDeal {
using SafeERC20 for IERC20;
uint256 constant BASE = 100 * 10**18;
uint256 constant MAX_SPONSOR_FEE = 15 * 10**18;
uint256 constant AELIN_FEE = 2 * 10**18;
UpFrontDealData public dealData;
UpFrontDealConfig public dealConfig;
address public aelinTreasuryAddress;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 25 : AelinERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import {ERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
interface IERC20Decimals {
function decimals() external view returns (uint8);
}
/**
* @dev a standard ERC20 contract that is extended with a few methods
* described in detail below
*/
contract AelinERC20 is ERC20 {
bool setInfo;
/**
* @dev Due to the constructor being empty for the MinimalProxy architecture we need
* to set the name and symbol in the initializer which requires these custom variables
*/
string private _custom_name;
string private _custom_symbol;
uint8 private _custom_decimals;
bool private locked;
uint8 constant DEAL_TOKEN_DECIMALS = 18;
constructor() ERC20("", "") {}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 3 of 25 : MinimalProxyFactory.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.7;
// https://docs.synthetix.io/contracts/source/contracts/minimalproxyfactory
// https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/
contract MinimalProxyFactory {
function _cloneAsMinimalProxy(address _base, string memory _revertMsg) internal returns (address clone) {
bytes memory createData = _generateMinimalProxyCreateData(_base);
assembly {
clone := create(
0, // no value
add(createData, 0x20), // data
55 // data is always 55 bytes (10 constructor + 45 code)
)
}
// If CREATE fails for some reason, address(0) is returned
require(clone != address(0), _revertMsg);
}
function _generateMinimalProxyCreateData(address _base) internal pure returns (bytes memory) {
return
abi.encodePacked(
//---- constructor -----
bytes10(0x3d602d80600a3d3981f3),
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 25 : SafeERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 25 : MerkleProof.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 6 of 25 : AelinDeal.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import "./AelinERC20.sol";
import "./interfaces/IAelinDeal.sol";
import "./MinimalProxyFactory.sol";
import "./AelinFeeEscrow.sol";
contract AelinDeal is AelinERC20, MinimalProxyFactory, IAelinDeal {
using SafeERC20 for IERC20;
uint256 public maxTotalSupply;
address public underlyingDealToken;
uint256 public underlyingDealTokenTotal;
uint256 public totalUnderlyingClaimed;
address public holder;
address public futureHolder;
address public aelinTreasuryAddress;
uint256 public underlyingPerDealExchangeRate;
address public aelinPool;
uint256 public vestingCliffExpiry;
uint256 public vestingCliffPeriod;
uint256 public vestingPeriod;
uint256 public vestingExpiry;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 7 of 25 : AelinPool.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import "./AelinDeal.sol";
import "./interfaces/IAelinPool.sol";
import "./interfaces/ICryptoPunks.sol";
import "./libraries/NftCheck.sol";
contract AelinPool is AelinERC20, MinimalProxyFactory, IAelinPool {
using SafeERC20 for IERC20;
address constant CRYPTO_PUNKS = address(0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB);
uint256 constant BASE = 100 * 10**18;
uint256 constant MAX_SPONSOR_FEE = 15 * 10**18;
uint256 constant AELIN_FEE = 2 * 10**18;
uint8 constant MAX_DEALS = 5;
uint8 public numberOfDeals;
uint8 public purchaseTokenDecimals;
address public purchaseToken;
uint256 public purchaseTokenCap;
uint256 public proRataConversion;
uint256 public sponsorFee;
address public sponsor;
address public futureSponsor;
address public poolFactory;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 8 of 25 : AelinFeeEscrow.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
contract AelinFeeEscrow {
using SafeERC20 for IERC20;
uint256 public vestingExpiry;
address public treasury;
address public futureTreasury;
address public escrowedToken;
bool private calledInitialize;
/**
* @dev the constructor will always be blank due to the MinimalProxyFactory pattern
* this allows the underlying logic of this contract to only be deployed once
* and each new escrow created is simply a storage wrapper
*/
constructor() {}
/**
* @dev the treasury may change their address
*/
function setTreasury(address _treasury) external onlyTreasury {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 9 of 25 : IAelinUpFrontDeal.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import {IAelinPool} from "./IAelinPool.sol";
interface IAelinUpFrontDeal {
struct UpFrontDealData {
string name;
string symbol;
address purchaseToken;
address underlyingDealToken;
address holder;
address sponsor;
uint256 sponsorFee;
bytes32 merkleRoot;
string ipfsHash;
}
struct UpFrontDealConfig {
uint256 underlyingDealTokenTotal;
uint256 purchaseTokenPerDealToken;
uint256 purchaseRaiseMinimum;
uint256 purchaseDuration;
uint256 vestingPeriod;
uint256 vestingCliffPeriod;
bool allowDeallocation;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 25 : AelinNftGating.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import "./NftCheck.sol";
import "../interfaces/ICryptoPunks.sol";
library AelinNftGating {
address constant CRYPTO_PUNKS = address(0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB);
// collectionAddress should be unique, otherwise will override
struct NftCollectionRules {
// if 0, then unlimited purchase
uint256 purchaseAmount;
address collectionAddress;
// if true, then `purchaseAmount` is per token
// else `purchaseAmount` is per account regardless of the NFTs held
bool purchaseAmountPerToken;
// both variables below are only applicable for 1155
uint256[] tokenIds;
// min number of tokens required for participating
uint256[] minTokensEligible;
}
struct NftGatingData {
mapping(address => NftCollectionRules) nftCollectionDetails;
mapping(address => mapping(address => bool)) nftWalletUsedForPurchase;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 25 : AelinAllowList.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
library AelinAllowList {
struct InitData {
address[] allowListAddresses;
uint256[] allowListAmounts;
}
struct AllowList {
address[] allowListAddresses;
uint256[] allowListAmounts;
mapping(address => uint256) amountPerAddress;
bool hasAllowList;
}
function initialize(InitData calldata _init, AllowList storage _self) external {
if (_init.allowListAddresses.length > 0 || _init.allowListAmounts.length > 0) {
require(
_init.allowListAddresses.length == _init.allowListAmounts.length,
"allowListAddresses and allowListAmounts arrays should have the same length"
);
_self.allowListAddresses = _init.allowListAddresses;
_self.allowListAmounts = _init.allowListAmounts;
for (uint256 i; i < _init.allowListAddresses.length; ++i) {
_self.amountPerAddress[_init.allowListAddresses[i]] = _init.allowListAmounts[i];
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 12 of 25 : MerkleTree.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
library MerkleTree {
struct UpFrontMerkleData {
uint256 index;
address account;
uint256 amount;
bytes32[] merkleProof;
}
struct TrackClaimed {
mapping(uint256 => uint256) claimedBitMap;
}
/**
* @dev a function that checks if the index leaf node is valid and if the user has purchased.
* will set the index node to purchased if approved
*/
function purchaseMerkleAmount(
UpFrontMerkleData calldata merkleData,
TrackClaimed storage self,
uint256 _purchaseTokenAmount,
bytes32 merkleRoot
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 13 of 25 : ERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 25 : IERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 15 of 25 : IERC20Metadata.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 16 of 25 : Context.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 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;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 17 of 25 : draft-IERC20Permit.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 18 of 25 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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
* ====
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 19 of 25 : IAelinDeal.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
interface IAelinDeal {
struct DealData {
address underlyingDealToken;
uint256 underlyingDealTokenTotal;
uint256 vestingPeriod;
uint256 vestingCliffPeriod;
uint256 proRataRedemptionPeriod;
uint256 openRedemptionPeriod;
address holder;
uint256 maxDealTotalSupply;
uint256 holderFundingDuration;
}
struct Timeline {
uint256 period;
uint256 start;
uint256 expiry;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 20 of 25 : IAelinPool.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
interface IAelinPool {
struct PoolData {
string name;
string symbol;
uint256 purchaseTokenCap;
address purchaseToken;
uint256 duration;
uint256 sponsorFee;
uint256 purchaseDuration;
address[] allowListAddresses;
uint256[] allowListAmounts;
NftCollectionRules[] nftCollectionRules;
}
// collectionAddress should be unique, otherwise will override
struct NftCollectionRules {
// if 0, then unlimited purchase
uint256 purchaseAmount;
address collectionAddress;
// if true, then `purchaseAmount` is per token
// else `purchaseAmount` is per account regardless of the NFTs held
bool purchaseAmountPerToken;
// both variables below are only applicable for 1155
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 21 of 25 : ICryptoPunks.sol
1
2
3
4
5
6
7
8
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.6;
interface ICryptoPunks {
function balanceOf(address) external view returns (uint256);
function punkIndexToAddress(uint256) external view returns (address);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 22 of 25 : NftCheck.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
library NftCheck {
bytes4 public constant IERC165_ID = type(IERC165).interfaceId;
bytes4 public constant IERC1155_ID = type(IERC1155).interfaceId;
bytes4 public constant IERC721_ID = type(IERC721).interfaceId;
function supports721(address collectionAddress) internal view returns (bool) {
return _supportsInterface(collectionAddress, IERC721_ID);
}
function supports1155(address collectionAddress) internal view returns (bool) {
return _supportsInterface(collectionAddress, IERC1155_ID);
}
function _supportsInterface(address account, bytes4 interfaceId) private view returns (bool) {
bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);
(bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);
if (result.length < 32) return false;
return success && abi.decode(result, (bool));
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 23 of 25 : IERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 24 of 25 : IERC1155.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 25 of 25 : IERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {
"contracts/libraries/AelinAllowList.sol": {
"AelinAllowList": "0x011829226a32e992a4def3efe225978136dd5cce"
},
"contracts/libraries/AelinNftGating.sol": {
"AelinNftGating": "0xe98dc0da44994f5546644e3384026bb2b5efb153"
},
"contracts/libraries/MerkleTree.sol": {
"MerkleTree": "0x15545f77783c8b47e7d9af53cd9a91ae612b3bac"
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPurchased","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalPurchased","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountDealTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDealTokens","type":"uint256"}],"name":"AcceptDeal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"AelinToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountMinted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountPurchasingReturned","type":"uint256"}],"name":"ClaimDealTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"underlyingToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountClaimed","type":"uint256"}],"name":"ClaimedUnderlyingDealToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dealAddress","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"address","name":"underlyingDealToken","type":"address"},{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":true,"internalType":"address","name":"sponsor","type":"address"},{"indexed":false,"internalType":"uint256","name":"sponsorFee","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"string","name":"ipfsHash","type":"string"}],"name":"CreateUpFrontDeal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dealAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"underlyingDealTokenTotal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"purchaseTokenPerDealToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"purchaseRaiseMinimum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"purchaseDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestingPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestingCliffPeriod","type":"uint256"},{"indexed":false,"internalType":"bool","name":"allowDeallocation","type":"bool"}],"name":"CreateUpFrontDealConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"upFrontDealAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"purchaseExpiryTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestingCliffExpiryTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestingExpiryTimestamp","type":"uint256"}],"name":"DealFullyFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"underlyingDealTokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"underlyingDealTokenAmount","type":"uint256"}],"name":"DepositDealToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voucher","type":"address"}],"name":"Disavow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"aelinFeeEscrow","type":"address"},{"indexed":true,"internalType":"address","name":"underlyingTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeEscrowClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountClaimed","type":"uint256"},{"indexed":false,"internalType":"address","name":"underlyingToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"underlyingRefund","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"HolderClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"purchaseAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"purchaseAmountPerToken","type":"bool"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"minTokensEligible","type":"uint256[]"}],"name":"PoolWith1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"purchaseAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"purchaseAmountPerToken","type":"bool"}],"name":"PoolWith721","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"}],"name":"SetHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sponsor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountMinted","type":"uint256"}],"name":"SponsorClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voucher","type":"address"}],"name":"Vouch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"UpFrontDealAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountWithdrawn","type":"uint256"}],"name":"WithdrewExcess","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"internalType":"struct AelinNftGating.NftPurchaseList[]","name":"_nftPurchaseList","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"internalType":"struct MerkleTree.UpFrontMerkleData","name":"_merkleData","type":"tuple"},{"internalType":"uint256","name":"_purchaseTokenAmount","type":"uint256"}],"name":"acceptDeal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"aelinEscrowLogicAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aelinFeeEscrow","outputs":[{"internalType":"contract AelinFeeEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aelinTreasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowList","outputs":[{"internalType":"bool","name":"hasAllowList","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountVested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimUnderlying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_purchaser","type":"address"}],"name":"claimableUnderlyingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dealConfig","outputs":[{"internalType":"uint256","name":"underlyingDealTokenTotal","type":"uint256"},{"internalType":"uint256","name":"purchaseTokenPerDealToken","type":"uint256"},{"internalType":"uint256","name":"purchaseRaiseMinimum","type":"uint256"},{"internalType":"uint256","name":"purchaseDuration","type":"uint256"},{"internalType":"uint256","name":"vestingPeriod","type":"uint256"},{"internalType":"uint256","name":"vestingCliffPeriod","type":"uint256"},{"internalType":"bool","name":"allowDeallocation","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dealData","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"purchaseToken","type":"address"},{"internalType":"address","name":"underlyingDealToken","type":"address"},{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"sponsor","type":"address"},{"internalType":"uint256","name":"sponsorFee","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"ipfsHash","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dealFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dealStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositUnderlyingAmount","type":"uint256"}],"name":"depositUnderlyingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disavow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeEscrowClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"futureHolder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"}],"name":"getAllowList","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAmountVested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"}],"name":"getNftCollectionDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"getNftGatingDetails","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getPoolSharesPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getPurchaseTokensPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"hasPurchasedMerkle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"purchaseToken","type":"address"},{"internalType":"address","name":"underlyingDealToken","type":"address"},{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"sponsor","type":"address"},{"internalType":"uint256","name":"sponsorFee","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"ipfsHash","type":"string"}],"internalType":"struct IAelinUpFrontDeal.UpFrontDealData","name":"_dealData","type":"tuple"},{"components":[{"internalType":"uint256","name":"underlyingDealTokenTotal","type":"uint256"},{"internalType":"uint256","name":"purchaseTokenPerDealToken","type":"uint256"},{"internalType":"uint256","name":"purchaseRaiseMinimum","type":"uint256"},{"internalType":"uint256","name":"purchaseDuration","type":"uint256"},{"internalType":"uint256","name":"vestingPeriod","type":"uint256"},{"internalType":"uint256","name":"vestingCliffPeriod","type":"uint256"},{"internalType":"bool","name":"allowDeallocation","type":"bool"}],"internalType":"struct IAelinUpFrontDeal.UpFrontDealConfig","name":"_dealConfig","type":"tuple"},{"components":[{"internalType":"uint256","name":"purchaseAmount","type":"uint256"},{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"bool","name":"purchaseAmountPerToken","type":"bool"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"minTokensEligible","type":"uint256[]"}],"internalType":"struct AelinNftGating.NftCollectionRules[]","name":"_nftCollectionRules","type":"tuple[]"},{"components":[{"internalType":"address[]","name":"allowListAddresses","type":"address[]"},{"internalType":"uint256[]","name":"allowListAmounts","type":"uint256[]"}],"internalType":"struct AelinAllowList.InitData","name":"_allowListInit","type":"tuple"},{"internalType":"address","name":"_aelinTreasuryAddress","type":"address"},{"internalType":"address","name":"_aelinEscrowLogicAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftGating","outputs":[{"internalType":"bool","name":"hasNftList","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolSharesPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purchaseExpiry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchaseTokensPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purchaserClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"setHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sponsorClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPoolShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPurchasingAccepted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUnderlyingClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dst","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_src","type":"address"},{"internalType":"address","name":"_dst","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingCliffExpiry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingExpiry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vouch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawExcess","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.