A Solidity library for creating expirable tokens with time or block-based expiration.
Install via npm
npm install --dev @kiwarilabs/contracts@stable
Install via yarn
yarn add --dev @kiwarilabs/contracts@stable
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;
import {ERC20EXPBase} from "@kiwarilabs/contracts/tokens/ERC20/ERC20EXPBase.sol";
import {ERC20BLSW} from "@kiwarilabs/contracts/tokens/ERC20/ERC20BLSW.sol";
contract ExpirableERC20 is ERC20BLSW {
constructor(
string memory _name,
string memory _symbol,
uint40 blocksPerEpoch_,
uint8 windowSize_
) ERC20BLSW(_name, _symbol, block.number, blocksPerEpoch_, windowSize_, false) {}
function _epochType() internal pure virtual override(ERC20EXPBase, ERC20BLSW) returns (EPOCH_TYPE) {
return super._epochType();
}
function _getEpoch(uint256 pointer) internal view virtual override(ERC20EXPBase, ERC20BLSW) returns (uint256) {
return super._getEpoch(pointer);
}
function _getWindowRage(
uint256 pointer
) internal view virtual override(ERC20EXPBase, ERC20BLSW) returns (uint256 fromEpoch, uint256 toEpoch) {
return super._getWindowRage(pointer);
}
function _getWindowSize() internal view virtual override(ERC20EXPBase, ERC20BLSW) returns (uint8) {
return super._getWindowSize();
}
function _getPointersInEpoch() internal view virtual override(ERC20EXPBase, ERC20BLSW) returns (uint40) {
return super._getPointersInEpoch();
}
function _getPointersInWindow() internal view virtual override(ERC20EXPBase, ERC20BLSW) returns (uint40) {
return super._getPointersInWindow();
}
/// @notice In some Layer 2 (L2) use pre-compiled/system-contract to get block height instead of block.number.
/// @dev Retrieve block.number as pointer in block-based lazy sliding window.
/// @return uint256 return the current block height.
function _pointerProvider() internal view virtual override(ERC20EXPBase, ERC20BLSW) returns (uint256) {
return super._pointerProvider();
}
}
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;
import {ERC7858BLSW} from "@kiwarilabs/contracts/tokens/ERC721/ERC7858BLSW.sol";
import {ERC7858EXPBase} from "@kiwarilabs/contracts/tokens/ERC721/ERC7858EXPBase.sol";
// Expirable ERC721 with individual expiration
contract ExpirableERC721 is ERC7858BLSW {
constructor (string memory name_, string memory symbol_) ERC7858BLSW(name_, symbol) {}
}
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;
import {ERC7858EpochBLSW} from "@kiwarilabs/contracts/tokens/ERC721/extensions/ERC7858EpochBLSW.sol";
import {ERC7858EXPEpochBase} from "@kiwarilabs/contracts/tokens/ERC721/extensions/ERC7858EXPEpochBase.sol";
// Expirable ERC721 with epoch expiration
contract ExpirableERC7858 is ERC7858EpochBLSW {
constructor (
string memory name_,
string memory symbol_,
uint256 initialBlockNumber_,
uint40 blocksPerEpoch_,
uint8 windowSize_,
bool development_)
ERC7858EpochBLSW(
name_,
symbol_,
initialBlockNumber_,
blocksPerEpoch_,
windowSize_,
development) {}
}
Check out the contribution guide
For support or any inquiries, feel free to reach out to us at github-issue or kiwarilabs@protonmail.com
If you value our work and would like to support Kiwari Labs, please visit our Open Collective page to make a donation. Thank you!
This repository is released under the Apache-2.0.
Copyright (C) Kiwari Labs.