{"_id":"@alljoint-next/erc721aj","_rev":"2-bf2c127f0c72fa0a2cf1e912cb445a79","name":"@alljoint-next/erc721aj","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@alljoint-next/erc721aj","version":"0.1.0","description":"ERC721AJ contract for Solidity","repository":{"type":"git","url":"git@github.com:AllJointTW/ERC721AJ.git"},"author":{"name":"TZU-YEN, CHANG","email":"try_love_tom@alljoint.tw"},"license":"BUSL-1.1","scripts":{"dev":"vite dev","test":"yarn test:sol","gas":"cross-env REPORT_GAS=true hardhat test contracts/GasUsage.test.js","test:sol":"hardhat coverage --testfiles 'contracts/**/*.spec.js'","format":"prettier '**/*.{js,json,ts,vue,md,yml,yaml,sol}' !**/node_modules/** !**/dist/** !**/coverage/** !**/artifacts/** !**/cache/** !gasReporterOutput.json --write --no-semi --single-quote --trailing-comma none && yarn lint:js --fix && yarn lint:sol --fix","lint":"yarn lint:js && yarn lint:sol","lint:js":"eslint '**/*.js'","lint:sol":"solhint '**/*.sol'","clean":"hardhat clean && rimraf artifacts cache coverage coverage.json","postinstall":"husky install"},"dependencies":{"@metamask/detect-provider":"^1.2.0","@walletconnect/ethereum-provider":"^1.7.8","ethers":"^5.6.6","merkletreejs":"^0.2.31"},"devDependencies":{"@alljoint-next/eslint-config-lite":"^0.1.1","@nomiclabs/hardhat-ethers":"^2.0.5","@nomiclabs/hardhat-etherscan":"^3.0.1","@nomiclabs/hardhat-waffle":"^2.0.2","@openzeppelin/contracts":"^4.6.0","@vitejs/plugin-vue":"^2.3.3","chai":"^4.3.6","cross-env":"^7.0.3","dotenv":"^16.0.0","erc721a":"^3.2.0","eslint":"^8.9.0","eslint-plugin-mocha":"^10.0.3","eslint-plugin-node":"^11.1.0","ethereum-waffle":"^3.4.0","form-data":"^4.0.0","gifsicle":"5.2.1","hardhat":"^2.8.4","hardhat-gas-reporter":"^1.0.8","husky":"^7.0.4","node-fetch":"^3.2.3","prettier":"^2.5.1","prettier-plugin-solidity":"^1.0.0-beta.19","progress":"^2.0.3","rimraf":"^3.0.2","seedrandom":"^3.0.5","semver":"^7.3.7","sharp":"^0.30.3","solhint":"^3.3.7","solhint-plugin-prettier":"^0.0.5","solidity-coverage":"^0.7.20","vite":"^2.9.9","vue":"^3.2.35"},"_id":"@alljoint-next/erc721aj@0.1.0","dist":{"shasum":"9d574d2a09494b6c16fef186b2d0e29a43ef1b71","integrity":"sha512-NUCY/sn9e00NwgkUCEBTgZJmAzxXNiiX+pY7aba3NOsGJuPazZFsck/pMRUvmb8KN1sCmcA+HLZBgvPKl7bXPQ==","tarball":"https://registry.npmjs.org/@alljoint-next/erc721aj/-/erc721aj-0.1.0.tgz","fileCount":21,"unpackedSize":41549,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCIY1GhpwNcq15Ij2fBo6TAc3NQpwhXlog3H93RIxdkkwIhAPp/1nsKujS+3gaQ2oFgzBm3bdDo3zQcpk/OF4X80WHW"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJii0iAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqa0Q/+NH4VJ/q3oFJn6GrCHh/Fcu6vXYAO4jrk2xfEBpWiRCyCSF4q\r\n0yUTMZlBHwP2OgG+GvKA9vVpCdlCSMn7O7yVTDZc0lpdFFmRXMCQVxtUfDdT\r\n1UKjypZL3bhOpBzhnss+N6zfxAjgzhzL850ExmuX0aTuuN0ejathu0oEpF6Y\r\ngn9y43/FxxA5TLTjANrOaDjyeukEJTFdowYzZTgq6wG4OphfehK7kRynk5kB\r\nBApkGqpoADjmWUvimqzlSDnZjzRwM/YBtJckGGHR0MKDyw5TARQ4pCjbiydS\r\nneuMEn1z0H53A9YYqI7HEbYIrF+7qI51dmq2GXDBhlO/Hxr1Vchvt3cU7tfE\r\ngwcAUtZDcxeKhdKwApVwCnwiJ7eT6XhbL8CWaqfFARTvYfFv+lUbPLEfG2pa\r\nTSMfDdbm8naI02x3/EgeGrnvuT2shdYOksZklujrhX9hfvWBMOHFFN8jZ676\r\nhrPqJTn+6Nh+gWq0QHhObE5OvqGx+DcsnreFgsYczyJZ7hkdnoqaqirpQXyo\r\n7bv4+5F2kRCsrpZoOlDIQIAmvaXdv3E9E6ViJO0j1EWU40FnH0h4dDVzPVwG\r\nTcWsmuNjHolmpWFyYfSfBHIdKSI/o1HWb8mvfi8PsQrW+/WtEYcFUm7xZ76Y\r\nw5eF/KczpQHwFb0tCE9Ky1pM5yqlo74YHL0=\r\n=hS/M\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"trylovetom","email":"try_love_tom@alljoint.tw"},"directories":{},"maintainers":[{"name":"trylovetom","email":"try_love_tom@alljoint.tw"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/erc721aj_0.1.0_1653295232363_0.6960887686557966"},"_hasShrinkwrap":false},"0.1.1":{"name":"@alljoint-next/erc721aj","version":"0.1.1","description":"ERC721AJ contract for Solidity","repository":{"type":"git","url":"git@github.com:AllJointTW/ERC721AJ.git"},"author":{"name":"TZU-YEN, CHANG","email":"try_love_tom@alljoint.tw"},"license":"BUSL-1.1","scripts":{"dev":"vite dev","test":"yarn test:sol","gas":"cross-env REPORT_GAS=true hardhat test contracts/GasUsage.test.js","test:sol":"hardhat coverage --testfiles 'contracts/**/*.spec.js'","format":"prettier '**/*.{js,json,ts,vue,md,yml,yaml,sol}' !**/node_modules/** !**/dist/** !**/coverage/** !**/artifacts/** !**/cache/** !gasReporterOutput.json --write --no-semi --single-quote --trailing-comma none && yarn lint:js --fix && yarn lint:sol --fix","lint":"yarn lint:js && yarn lint:sol","lint:js":"eslint '**/*.js'","lint:sol":"solhint '**/*.sol'","clean":"hardhat clean && rimraf artifacts cache coverage coverage.json","release":"yarn hardhat compile && yarn publish --access public"},"dependencies":{"@metamask/detect-provider":"^1.2.0","@walletconnect/ethereum-provider":"^1.7.8","ethers":"^5.6.6","merkletreejs":"^0.2.31"},"devDependencies":{"@alljoint-next/eslint-config-lite":"^0.1.1","@nomiclabs/hardhat-ethers":"^2.0.5","@nomiclabs/hardhat-etherscan":"^3.0.1","@nomiclabs/hardhat-waffle":"^2.0.2","@openzeppelin/contracts":"^4.6.0","@vitejs/plugin-vue":"^2.3.3","chai":"^4.3.6","cross-env":"^7.0.3","dotenv":"^16.0.0","erc721a":"^3.2.0","eslint":"^8.9.0","eslint-plugin-mocha":"^10.0.3","eslint-plugin-node":"^11.1.0","ethereum-waffle":"^3.4.0","form-data":"^4.0.0","gifsicle":"5.2.1","hardhat":"^2.8.4","hardhat-gas-reporter":"^1.0.8","node-fetch":"^3.2.3","prettier":"^2.5.1","prettier-plugin-solidity":"^1.0.0-beta.19","progress":"^2.0.3","rimraf":"^3.0.2","seedrandom":"^3.0.5","semver":"^7.3.7","sharp":"^0.30.3","solhint":"^3.3.7","solhint-plugin-prettier":"^0.0.5","solidity-coverage":"^0.7.20","vite":"^2.9.9","vue":"^3.2.35"},"_id":"@alljoint-next/erc721aj@0.1.1","dist":{"shasum":"fda3d67db147e4b7e0bcc61da3f4e29461f8af0c","integrity":"sha512-0icRahLy1QpFnlcbATbflxXQwLeRi6sFQFfkKE1tNdqal91UKnCvQIA+lUW8270A7OLSNlf7xwUnt/o4KDXoNA==","tarball":"https://registry.npmjs.org/@alljoint-next/erc721aj/-/erc721aj-0.1.1.tgz","fileCount":21,"unpackedSize":41561,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAq40yYxgloqCGojOw2KPq0NjLdp6E4tTBhmq5L5KTmJAiEA8fiaWIH6QNqAS5AQU2cp/SOJCY1kMKs2Vc8MOf1GD6I="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJii0nyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpaYQ/9EGIqsGTi/K+dy56ONYFtwkPRa2asnSBs/SwxaxqBdqkr9Bjp\r\nuS56AvognRpD3Lw4uiy5Wpc3SW04YX6j32gD4VY+UPgXWNm6ZPWhqO6aJUF6\r\nMT0nGtcij9Qo2xwHMFxIVRuAhOCGrAl8b+I/1cIdUeiP8/Vg9M8X1j19fL+4\r\n8vZZfTxR9ih/03llGN/6cvw1zl8bk1uEpr+wag+TDr+jhztesifhxAT3pohK\r\nwK3R5gbHwhrczQ0CKITIvvPkbP6GtuZ6SyzVMMymK77TJ6BXQqyFiAXs/CUp\r\n0qYBT1urhUiOymPvVCKUa153o1S+x585BawwI3WPwpM3dL6tA2ptOZiFQDU2\r\nhrzO3hCQAV+Kg2KRMnt5Ewt3ssVdZqz5zYk8cYLCMTtJB3UrXogzzc1f3Vt5\r\nbXJc2zFfmwx0jihabChMXTcjQZzYmwvmnLukDEDTjOr0qGABw0+L5qYh+Bxe\r\nqDQBBbq/wVy8r0xiUliXW10osc8JThrU/sEs1hdyWOJFingmjO+kSdbQGBJL\r\nffv6NAoRvdSLR9/pu0U31i0L8cJ5W766t5OxHyFz2NnRlTIzfr3yz9eEDBwi\r\nYQfXhwA9aBxcxIjeJVCwoGp4IqbOIWjUyufZyHNOnJ3lO1IXjXfba0wdYCwq\r\nwwcUJChSnMh7QBzibgodSaeAWwZt/+UhSa8=\r\n=m33K\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"trylovetom","email":"try_love_tom@alljoint.tw"},"directories":{},"maintainers":[{"name":"trylovetom","email":"try_love_tom@alljoint.tw"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/erc721aj_0.1.1_1653295602441_0.43512752662620424"},"_hasShrinkwrap":false},"0.1.2":{"name":"@alljoint-next/erc721aj","version":"0.1.2","description":"ERC721AJ contract for Solidity","repository":{"type":"git","url":"git@github.com:AllJointTW/ERC721AJ.git"},"author":{"name":"TZU-YEN, CHANG","email":"try_love_tom@alljoint.tw"},"license":"BUSL-1.1","scripts":{"dev":"vite dev","test":"yarn test:sol","gas":"cross-env REPORT_GAS=true hardhat test contracts/GasUsage.test.js","test:sol":"hardhat coverage --testfiles 'contracts/**/*.spec.js'","format":"prettier '**/*.{js,json,ts,vue,md,yml,yaml,sol}' !**/node_modules/** !**/dist/** !**/coverage/** !**/artifacts/** !**/cache/** !gasReporterOutput.json --write --no-semi --single-quote --trailing-comma none && yarn lint:js --fix && yarn lint:sol --fix","lint":"yarn lint:js && yarn lint:sol","lint:js":"eslint '**/*.js'","lint:sol":"solhint '**/*.sol'","clean":"hardhat clean && rimraf artifacts cache coverage coverage.json","release":"yarn hardhat compile && yarn publish --access public"},"dependencies":{"@metamask/detect-provider":"^1.2.0","@walletconnect/ethereum-provider":"^1.7.8","ethers":"^5.6.6","merkletreejs":"^0.2.31"},"devDependencies":{"@alljoint-next/eslint-config-lite":"^0.1.1","@nomiclabs/hardhat-ethers":"^2.0.5","@nomiclabs/hardhat-etherscan":"^3.0.1","@nomiclabs/hardhat-waffle":"^2.0.2","@openzeppelin/contracts":"^4.6.0","@vitejs/plugin-vue":"^2.3.3","chai":"^4.3.6","cross-env":"^7.0.3","dotenv":"^16.0.0","erc721a":"^3.2.0","eslint":"^8.9.0","eslint-plugin-mocha":"^10.0.3","eslint-plugin-node":"^11.1.0","ethereum-waffle":"^3.4.0","form-data":"^4.0.0","gifsicle":"5.2.1","hardhat":"^2.8.4","hardhat-gas-reporter":"^1.0.8","node-fetch":"^3.2.3","prettier":"^2.5.1","prettier-plugin-solidity":"^1.0.0-beta.19","progress":"^2.0.3","rimraf":"^3.0.2","seedrandom":"^3.0.5","semver":"^7.3.7","sharp":"^0.30.3","solhint":"^3.3.7","solhint-plugin-prettier":"^0.0.5","solidity-coverage":"^0.7.20","vite":"^2.9.9","vue":"^3.2.35"},"_id":"@alljoint-next/erc721aj@0.1.2","dist":{"shasum":"c613d5ebc4a1f35075bfc80ff1065d6b51598172","integrity":"sha512-ofqd9X4tDFCDBK0oO1VdwoHct4Eu39fuPGctSnZML182ufh3oEQId1XfQ3OrSNvLg2nsIKcb6NM08meY2vUEpQ==","tarball":"https://registry.npmjs.org/@alljoint-next/erc721aj/-/erc721aj-0.1.2.tgz","fileCount":37,"unpackedSize":296719,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJI3BlA6h/UtbSTOTu12EM5wdyX6o04W6bw/Ue33KdSQIhALPzOR/Q/F8CW9p27jlexKg07D7d4Ouq9O3wTHEoyslB"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJii0pXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqNEQ//TADPtS/na7efxt4qCJ+ZewL4dfZnZKUWkVhczVOYwKEb8HVG\r\nP8OoeI6Lt50lXgOU6HYzbfNU4r5oshoOQlqfyBRNKWmMzVD1Hs5NbbGMfPfa\r\nVl+BWNP4CLy90RVwqyV5lN8+qUdg5WxDJsjAU/MUXMtWP5E2Wm7Eagd9fSFY\r\nWKDm0Du4OYcgkdIAdvsDozjuQrJqTDZeUxfMU9wpy+9gGfIhQoCcnovhdNuJ\r\n/SqPTez6a4A3qg4BbEJLglOf1gV6J0u7JDc2pga5amnCDXadIpdS3WaCM5zv\r\n5yWiLQ6Bi8z/5YWF6C5qyF17nHy0b06DKkbYePe/A5RNMpqCoBjtlDdJrxYy\r\n3xdC9Wqjm+H/uRbxPKdjk08gs35ibG0AZr2tsnDiiprDpuIGWa9tKwHjgzuP\r\nIpTuZu/f6njTz4cwzTZyPFuXyP5IShDREh5TyFdqSec8v0nzZxqDgkBVhZrf\r\nmBm7l41JLZE37yJIrOZf8XIiWObG+YaI9znCxej86vgnCuqYXOLn4XKdy5+C\r\n3hCHRmIzTzU8hMiAbVN3g6SaeDWXCYHat4Qxo8B/525QUjJ4J6lxCEfRfsWc\r\nO8JBBZ31BIHv5d8+/wMWTNLJ+mwx64oZM/mvui0TTMvNWCLCWgUCxkvmLvh8\r\n/V8K1HZQEOdH6Ss0eEZXYE8pgWodU9/tO38=\r\n=SAod\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"trylovetom","email":"try_love_tom@alljoint.tw"},"directories":{},"maintainers":[{"name":"trylovetom","email":"try_love_tom@alljoint.tw"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/erc721aj_0.1.2_1653295702785_0.6445795369922185"},"_hasShrinkwrap":false}},"time":{"created":"2022-05-23T08:40:32.306Z","0.1.0":"2022-05-23T08:40:32.506Z","modified":"2022-05-23T08:48:23.217Z","0.1.1":"2022-05-23T08:46:42.611Z","0.1.2":"2022-05-23T08:48:22.983Z"},"maintainers":[{"name":"trylovetom","email":"try_love_tom@alljoint.tw"}],"description":"ERC721AJ contract for Solidity","repository":{"type":"git","url":"git@github.com:AllJointTW/ERC721AJ.git"},"author":{"name":"TZU-YEN, CHANG","email":"try_love_tom@alljoint.tw"},"license":"BUSL-1.1","readme":"# ERC721AJ\n\n> ERC721AJ is a tool set of the ERC721 Non-Fungible Token Standard that bases on [ERC721A](https://www.erc721a.org/).\n\n## Overview\n\nTool List\n\n- contracts\n  - ERC721AJ.sol\n  - ERC721AJSaleable.sol\n- tasks\n  - `hardhat accounts`\n  - `hardhat balance`\n  - `hardhat generate`\n  - `hardhat shuffle`\n  - `hardhat compress`\n  - `hardhat upload`\n\n## Contracts\n\n### Installation\n\n```shell\n$ yarn add @hash-it/erc721aj --dev # or npm install --save-dev @hash-it/erc721aj\n```\n\n### Usage\n\nOnce installed, you can use the contracts in the library by importing them:\n\n**ERC721AJ**\n\n```solidity\npragma solidity ^0.8.4;\n\nimport '@hash-it/erc721aj/contracts/ERC721AJ.sol';\n\ncontract HashIt is ERC721AJ {\n  constructor() ERC721A('HashIt', 'HI') {}\n\n  function mint(uint256 quantity) external payable {\n    // _safeMint's second argument now takes in a quantity, not a tokenId.\n    _safeMint(msg.sender, quantity);\n  }\n}\n\n```\n\n**ERC721AJSaleable**\n\n```solidity\npragma solidity ^0.8.4;\n\nimport '@hash-it/erc721aj/contracts/extensions/ERC721AJSaleable.sol';\n\ncontract HashIt is ERC721AJSaleable {\n  constructor() ERC721A('HashIt', 'HI') {}\n}\n\n```\n\n## API\n\n### ERC721AJ\n\nImplementation of ERC721 Non-Fungible Token Standard, including the Metadata extension. And it inherits all the methods and properties from [Ownable](https://docs.openzeppelin.com/contracts/4.x/api/access#Ownable), [Pausable](https://docs.openzeppelin.com/contracts/4.x/api/security#Pausable), [ERC721A](https://chiru-labs.github.io/ERC721A/#/erc721a), [ERC721ABurnable](https://chiru-labs.github.io/ERC721A/#/erc721a-burnable), [ERC721AOwnersExplicit](https://chiru-labs.github.io/ERC721A/#/erc721a-owners-explicit), [ERC721AQueryable](https://chiru-labs.github.io/ERC721A/#/erc721a-queryable).\n\n#### Variables\n\n##### version\n\n```solidity\nstring public version = 'v0.1.0';\n```\n\n##### \\_baseOrigin\n\n```solidity\nstring private _baseOrigin = '';\n```\n\n##### \\_baseExtension\n\n```solidity\nstring private _baseExtension = '.json';\n```\n\n#### Methods\n\n##### constructor\n\n```solidity\nconstructor(string memory name_, string memory symbol_);\n\n```\n\n##### currentIndex\n\n```solidity\nfunction currentIndex() public view virtual returns (uint256);\n\n```\n\nThe next token ID to be minted.\n\n##### totalBurned\n\n```solidity\nfunction totalBurned() public view virtual returns (uint256);\n\n```\n\nThe number of tokens burned.\n\n##### totalMinted\n\n```solidity\nfunction totalMinted() public view virtual returns (uint256);\n\n```\n\nReturns the total amount of tokens minted in the contract.\n\n##### numberMintedBy\n\n```solidity\nfunction numberMintedBy(address owner) public view virtual returns (uint256);\n\n```\n\nReturns the number of tokens minted by `owner`.\n\n##### numberBurnedBy\n\n```solidity\nfunction numberBurnedBy(address owner) public view virtual returns (uint256);\n\n```\n\nReturns the number of tokens burned by or on behalf of `owner`.\n\n##### tokenURI\n\n```solidity\nfunction tokenURI(uint256 tokenId)\n  public\n  view\n  virtual\n  override\n  returns (string memory);\n\n```\n\nSee IERC721Metadata-tokenURI. Returns the Uniform Resource Identifier (URI) for tokenId token. `tokenURI = _baseURI + '/' + tokenId + _baseExtension`\n\n##### \\_baseURI\n\n```solidity\nfunction _baseURI() internal view virtual override returns (string memory);\n\n```\n\nBase URI for computing tokenURI. `_baseURI = _baseOrigin + '/'`\n\n##### setBaseURI\n\n```solidity\nfunction setBaseURI(string memory origin, string memory extension)\n  public\n  virtual\n  onlyOwner;\n\n```\n\nSet the origin and extension of the base uri.\n\n##### pause\n\n```solidity\nfunction pause() public virtual onlyOwner whenNotPaused;\n\n```\n\nTriggers paused state.\n\n##### unpause\n\n```solidity\nfunction unpause() public virtual onlyOwner whenPaused;\n\n```\n\nReturns to normal state.\n\n### ERC721AJSaleable\n\n#### Enums\n\n##### LaunchStage\n\n```solidity\nenum LaunchStage {\n  Auction,\n  Whitelist,\n  Public\n}\n\n```\n\nWe split the stage into 3 stage.\n\n- Auction: \"Dutch Auction\", It means an auction in which begins with a high asking price in the case of selling, and lowers it until some participant accepts the price, or it reaches a reserve price.\n- Whitelist: It means that the user can mints the token who is in the whitelist.\n- Public: Anyone can mints the token.\n\n#### Structs\n\n##### SaleConfig\n\n```solidity\nstruct SaleConfig {\n  LaunchStage stage;\n  bool isActive;\n  bool isLimited;\n  uint64 maxBalance;\n  uint256 totalMinted;\n  uint256 tierMinted;\n}\n\n```\n\n- LaunchStage: Current stage.\n- isActive: It's on sale or not.\n- isLimited: It's limited the max minted size.\n- maxBalance: The max number of balance of owner.\n- totalMinted: The max number of minted size.\n- tierMinted: The tier number of minted size.\n\n##### SaleConfig\n\n```solidity\nstruct SaleConfig {\n  LaunchStage stage;\n  bool isActive;\n  bool isLimited;\n  uint64 maxBalance;\n  uint256 totalMinted;\n  uint256 tierMinted;\n}\n\n```\n\n- LaunchStage: Current stage.\n- isActive: It's on sale or not.\n- isLimited: It's limited the max minted size.\n- maxBalance: The max number of balance of owner.\n- totalMinted: The max number of minted size.\n- tierMinted: The tier number of minted size.\n\n##### StageConfig\n\n```solidity\nstruct StageConfig {\n  uint64 startAt;\n  uint64 maxMint;\n  uint64 price;\n}\n\n```\n\n- startAt: The stage starts at \"unix timestamp\".\n- maxMint: The max number of caller mint in one times.\n- price: The price of token.\n\n##### AuctionStageConfig\n\n```solidity\nstruct AuctionStageConfig {\n  uint64 startAt;\n  uint64 maxMint;\n  uint64 startPrice;\n  uint64 endAt;\n  uint64 endPrice;\n  uint64 step;\n}\n\n```\n\nKind of StageConfig.\n\n- startAt: The auction starts at \"unix timestamp\".\n- maxMint: The max number of caller mint in one times.\n- startPrice: The higher price of auction.\n- endAt: The stage sale ends at \"unix timestamp\".\n- endPrice: The lower price of auction.\n- step: The step of auction.\n\nexample:\n\n- startAt: 11:00\n- endAt: 12:00\n- startPrice: 1 eth\n- endPrice: 0.5 eth\n- step: 6\n\n| Step |        Time         | Price   |\n| ---- | :-----------------: | ------- |\n| 0    | 11:00:00 - 11:09:59 | 1.0 eth |\n| 1    | 11:10:00 - 11:19:59 | 0.9 eth |\n| 2    | 11:20:00 - 11:29:59 | 0.8 eth |\n| 3    | 11:30:00 - 11:39:59 | 0.7 eth |\n| 4    | 11:40:00 - 11:49:59 | 0.6 eth |\n| 5    | 11:50:00 - 11:59:59 | 0.5 eth |\n\n##### SaleableConfigs\n\n```solidity\nstruct AuctionStageConfig {\n  SaleConfig currentSaleConfig;\n  AuctionStageConfig currentAuctionStageConfig;\n  StageConfig currentWhitelistSaleConfig;\n  StageConfig currentPublicSaleConfig;\n}\n\n```\n\n#### Variables\n\n##### saleConfig\n\n```solidity\nSaleConfig public saleConfig;\n\n```\n\nThe config fo sale.\n\n##### auctionStageConfig\n\n```solidity\nAuctionStageConfig public auctionStageConfig;\n\n```\n\nthe config of auction stage.\n\n##### whitelistStageConfig\n\n```solidity\nStageConfig public whitelistStageConfig;\n\n```\n\nThe config of whitelist stage.\n\n##### publicStageConfig\n\n```solidity\nStageConfig public publicStageConfig;\n\n```\n\nThe config of public stage.\n\n##### whitelistMerkleRoot\n\n```solidity\nbytes32 public whitelistMerkleRoot;\n\n```\n\nThe merkle root of whitelist. See [Merkle Tree](https://medium.com/@ItsCuzzo/using-merkle-trees-for-nft-whitelists-523b58ada3f9).\n\n##### \\_feePart\n\n```solidity\nuint256 private _feePart;\n\n```\n\nThe part of fee. `Fee = balance * _feePart / 1000`\n\n##### \\_feeAddress\n\n```solidity\naddress private _feeAddress;\n\n```\n\nThe address of fee.\n\n#### Methods\n\n##### \\_checkStageSaleable\n\n```solidity\nfunction _checkStageSaleable(\n  SaleConfig memory _saleConfig,\n  StageConfig memory _stageConfig,\n  LaunchStage stage,\n  uint64 qty\n) internal view virtual;\n\n```\n\nCheck if it can be sold according to configs.\n\nError Messages:\n\n- Saleable: not on sale\n- Saleable: sold out\n- Saleable: exceed max balance\n- Saleable: exceed max mint\n- Saleable: insufficient funds\n\n##### preserve\n\n```solidity\nfunction preserve(uint64 qty, address to) public onlyOwner;\n\n```\n\nOwner can preserves token anytime.\n\nError Messages:\n\n- Saleable: sold out\n\n##### \\_refundIfOver\n\n```solidity\nfunction _refundIfOver(uint64 totalPrice) internal;\n\n```\n\nRefunds if the funding over the total price.\n\n##### mintPublic\n\n```solidity\nfunction mintPublic(uint64 qty) external payable virtual nonReentrant;\n\n```\n\nMints in the public stage.\n\n##### mintWhitelist\n\n```solidity\nfunction mintWhitelist(uint64 qty, bytes32[] calldata merkleProof)\n  external\n  payable\n  virtual\n  nonReentrant;\n\n```\n\nMints in the whitelist stage, if caller can provides the proof.\n\n##### getAuctionPrice\n\n```solidity\nfunction getAuctionPrice(uint64 qty) public view virtual returns (uint64 price);\n\n```\n\nGets current the auction price.\n\n##### mintAuction\n\n```solidity\nfunction mintAuction(uint64 qty) external payable virtual nonReentrant;\n\n```\n\nMints in the auction stage.\n\n##### setSaleConfig\n\n```solidity\nfunction setSaleConfig(SaleConfig memory config) public onlyOwner;\n\n```\n\nSets the config of sale.\n\n##### setAuctionStageConfig\n\n```solidity\nfunction setAuctionStageConfig(AuctionStageConfig memory config)\n  public\n  onlyOwner;\n\n```\n\nSets the config of auction stage.\n\n##### setWhitelistStageConfig\n\n```solidity\nfunction setWhitelistStageConfig(StageConfig memory config) public onlyOwner;\n\n```\n\nSets the config of whitelist stage.\n\n##### setPublicStageConfig\n\n```solidity\nfunction setPublicStageConfig(StageConfig memory config) public onlyOwner;\n\n```\n\nSets the config of public stage.\n\n##### setWhitelist\n\n```solidity\nfunction setWhitelist(bytes32 _whitelistMerkleRoot) public onlyOwner;\n\n```\n\nSets the merkle root of whitelist.\n\n##### setFee\n\n```solidity\nfunction setFee(address target, uint64 num) public onlyOwner;\n\n```\n\nSets config of the fee.\n\n##### withdraw\n\n```solidity\nfunction withdraw(address to) external onlyOwner nonReentrant;\n\n```\n\nOwner can withdraw the all balance to address and fee address.\n\n##### getWhitelistSeats\n\n```solidity\nfunction getWhitelistSeats(address to) public view returns (uint64);\n\n```\n\nGets whitelist seats which you can mint.\n\n##### getSaleableConfigs\n\n```solidity\nfunction getSaleableConfigs()\n  public\n  view\n  returns (SaleableConfigs memory currentConfigs);\n\n```\n\nGets all config.\n\n## Tasks\n\n### accounts\n\n```shell\n$ yarn hardhat [GLOBAL OPTIONS] accounts # For global options help run: yarn hardhat help, for command options help run: yarn hardhat accounts --help\n```\n\nPrints the list of accounts of current nemonic or private key.\n\n### balance\n\n```shell\n$ yarn hardhat [GLOBAL OPTIONS] balance --account <ADDRESS> # For global options help run: yarn hardhat help, for command options help run: yarn hardhat balance --help\n```\n\nPrints an account's balance of current mnemonic or private key. Or you can set a specific address of account.\n\n### generate\n\n```shell\n$ yarn hardhat [GLOBAL OPTIONS] generate --description <STRING> [--dry] [--duplicate] [--extension <STRING>] --input <STRING> --name <STRING> --output <STRING> --seed <STRING> --skip <INT> --start <INT> --total <STRING> # For global options help run: yarn hardhat help, for command options help run: yarn hardhat generate --help\n```\n\nGenerate media and metadata of NFT. It can set the layer, ratios of traits, traits randomness pick, metadata.\n\n#### Usage\n\n1. Prepares the trait.\n\n   We supports `.png`, `.gif` file.\n\n2. Setups the folder of layer.\n\n   folder name: `<z-index>.<trait-type>`\n\n   ```txt\n   Type of trait: Background, Actor, Hat\n   Z index of trait: Hat > Actor > Background, Actor 在 Background 之上\n   .\n   ├── 1.Background\n   ├── 2.Actor\n   └── 3.Hat\n   ```\n\n3. Setups the rarity of trait.\n\n   file name: `<trait-value>__<ratio>.<file-extension>`\n\n   ```txt\n   Name of trait: Blue (AUD).png, Red (AUD).png, Yellow (AUD).png\n   Ratio of trait: 60%, 20%, 20%\n   .\n   ├── 1.Background\n   │   ├── Blue (AUD)__60%.png # 60%\n   │   ├── Red (AUD)__20%.png # 20%\n   │   └── Yellow (AUD)__20%.png # 20%\n   ├── 2.Actor\n   │   ├── Boy White__60%.png # 60%\n   │   └── Girl White__40%.png # 40%\n   └── 3.Hat\n       ├── Bandana Paisley (AUD).png # 33%\n       ├── Bandana Super Star (AUD).png # 33%\n       └── Camp Cap (AUD).png # 34%\n   ```\n\n4. Executes the command.\n\n   ```shell\n   $ yarn hardhat generate --description \"PFP of MeMe\" --input \"MeMe\" --name \"MeMe\" --output \"MeMe Output\" --total 1000\n   ```\n\n5. Checks the output folder.\n\n   **Output:**\n\n   ```txt\n   .\n   ├── Media\n   │   └── 0.png\n   └── Metadata\n       └── 0.json\n   ```\n\n   **Metadata:**\n\n   ```json\n   {\n     \"name\": \"Meme #0\",\n     \"description\": \"PFP of MeMe\",\n     \"attributes\": [\n       {\n         \"trait_type\": \"Background\",\n         \"value\": \"Yellow\"\n       },\n       {\n         \"trait_type\": \"Hat\",\n         \"value\": \"Bandana Paisley (AUD)\"\n       }\n     ],\n     \"image\": \"../Media/0.png\"\n   }\n   ```\n\n### shuffle\n\n```shell\n$ yarn hardhat [GLOBAL OPTIONS] shuffle --input <STRING> --seed <STRING> # For global options help run: yarn hardhat help, for command options help run: yarn hardhat shuffle --help\n```\n\nShuffle files inside both 'Media' and 'Metadata' folder under input parameter.\n\n#### Usage\n\n1. After execute generate command and get your output folder.\n\n2. Executes the command.\n\n```shell\n$ yarn hardhat shuffle --input \"Project Output Path\" --seed \"Hash it\"\n```\n\n3. The shuffle is Complete!!\n\nP.S. Using identical seed get the same suffle.\n\n### compress\n\n```shell\n$ yarn hardhat [GLOBAL OPTIONS] compress [--extension <STRING>] --fit <STRING> --height <INT> --input <STRING> --level <STRING> --output <STRING> --quality <INT> --range <STRING> --width <INT> # For global options help run: yarn hardhat help, for command options help run: yarn hardhat compress --help\n```\n\nCompress all media inside 'Media' folder under input parameter.\nThe extension is default to .png, change as your input media extension.\n\n#### Usage\n\n1. After execute generate command and get your output folder.\n\n2. Executes the command.\n\n```shell\n$ yarn hardhat compress --input \"Project Output Path\"\n```\n\n3. The compress is Complete!!\n\n### upload\n\n```shell\n$ yarn hardhat [GLOBAL OPTIONS] upload --auth <STRING> [--extension <STRING>] --input <STRING> --name <STRING> # For global options help run: yarn hardhat help, for command options help run: yarn hardhat upload --help\n```\n\nUpload files inside both 'Media' and 'Metadata' folder under input parameter to [Pinata](https://www.pinata.cloud/).\n\nUpload project name is default to dirName. Set name if want to change.\n\n#### Usage\n\n1. After execute generate command and get your output folder.\n\n2. Executes the command.\n\n```shell\n$ yarn hardhat upload --input \"Project Output Path\" --auth \"YOUR Pinata JWT Token\"\n```\n\n3. The upload is Complete!!\n\n## Contact\n\n- AllJoint (owner) - [alljoint.tw](https://alljoint.tw)\n- Tom (maintainer) - [try_love_tom@alljoint.tw](try_love_tom@alljoint.tw), [@zhangzi39443364](https://twitter.com/zhangzi39443364)\n","readmeFilename":"README.md"}