├── .env.example ├── public └── assets │ ├── test.png │ ├── deployed.png │ └── OpenHack_Vesting_Challenge.png ├── ignition ├── deployments │ └── chain-420420421 │ │ ├── artifacts │ │ ├── TokenVesting#mock_token.dbg.json │ │ ├── VestingModule#simple_token.dbg.json │ │ ├── VestingModule#simple_token.json │ │ └── TokenVesting#mock_token.json │ │ └── journal.jsonl └── modules │ └── token-vesting.ts ├── tsconfig.json ├── .gitignore ├── contracts ├── token.sol └── TokenVesting.sol ├── package.json ├── hardhat.config.ts ├── README.md └── test └── vesting.ts /.env.example: -------------------------------------------------------------------------------- 1 | PRIVATE_KEY=your_private_key_here -------------------------------------------------------------------------------- /public/assets/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openguild-labs/open-hack-vesting/HEAD/public/assets/test.png -------------------------------------------------------------------------------- /public/assets/deployed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openguild-labs/open-hack-vesting/HEAD/public/assets/deployed.png -------------------------------------------------------------------------------- /public/assets/OpenHack_Vesting_Challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openguild-labs/open-hack-vesting/HEAD/public/assets/OpenHack_Vesting_Challenge.png -------------------------------------------------------------------------------- /ignition/deployments/chain-420420421/artifacts/TokenVesting#mock_token.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../build-info/06550302e1057daf43893bd4ca520496.json" 4 | } -------------------------------------------------------------------------------- /ignition/deployments/chain-420420421/artifacts/VestingModule#simple_token.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../build-info/98f1554be46227c65584aeb4365f9bd8.json" 4 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2020", 4 | "module": "commonjs", 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "resolveJsonModule": true 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | 4 | # Hardhat files 5 | /cache 6 | /artifacts 7 | 8 | # TypeChain files 9 | /typechain 10 | /typechain-types 11 | 12 | # solidity-coverage files 13 | /coverage 14 | /coverage.json 15 | 16 | # Hardhat Ignition default folder for deployments against a local node 17 | ignition/deployments/chain-31337 18 | -------------------------------------------------------------------------------- /contracts/token.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.0; 3 | 4 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 5 | import "@openzeppelin/contracts/access/Ownable.sol"; 6 | 7 | contract MockERC20 is ERC20, Ownable(msg.sender) { 8 | constructor(string memory name, string memory symbol) ERC20(name, symbol) {} 9 | 10 | function mint(address to, uint256 amount) external onlyOwner { 11 | _mint(to, amount); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ignition/modules/token-vesting.ts: -------------------------------------------------------------------------------- 1 | import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; 2 | 3 | const VestingModule = buildModule("VestingModule", (m) => { 4 | // Deploy Token first 5 | const token = m.contract("SimpleToken", [], { 6 | id: "simple_token", 7 | }); 8 | 9 | // Deploy Vesting Contract with Token address 10 | const vesting = m.contract("SimpleVesting", [token], { 11 | id: "simple_vesting", 12 | }); 13 | 14 | return { token, vesting }; 15 | }); 16 | 17 | export default VestingModule; 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sandbox", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "keywords": [], 9 | "author": "", 10 | "license": "ISC", 11 | "description": "", 12 | "devDependencies": { 13 | "@nomicfoundation/hardhat-toolbox": "^5.0.0", 14 | "hardhat": "^2.22.17" 15 | }, 16 | "dependencies": { 17 | "@nomicfoundation/hardhat-ignition": "^0.15.8", 18 | "@openzeppelin/contracts": "^5.1.0", 19 | "dotenv": "^16.4.7" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /hardhat.config.ts: -------------------------------------------------------------------------------- 1 | import { HardhatUserConfig } from "hardhat/config"; 2 | import "@nomicfoundation/hardhat-toolbox"; 3 | import "@nomicfoundation/hardhat-ignition"; 4 | import "dotenv/config"; 5 | 6 | const config: HardhatUserConfig = { 7 | solidity: { 8 | version: "0.8.20", 9 | settings: { 10 | optimizer: { 11 | enabled: true, 12 | runs: 1, // Lower optimization runs for simpler bytecode 13 | }, 14 | evmVersion: "london", // Use an older EVM version for better compatibility 15 | viaIR: false, // Disable IR-based compilation 16 | }, 17 | }, 18 | networks: { 19 | "asset-hub-westend": { 20 | url: "https://westend-asset-hub-eth-rpc.polkadot.io", 21 | chainId: 420420421, 22 | accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [], 23 | gasPrice: "auto", 24 | timeout: 100000, 25 | }, 26 | }, 27 | }; 28 | 29 | export default config; 30 | -------------------------------------------------------------------------------- /contracts/TokenVesting.sol: -------------------------------------------------------------------------------- 1 | // Challenge: Token Vesting Contract 2 | /* 3 | Create a token vesting contract with the following requirements: 4 | 5 | 1. The contract should allow an admin to create vesting schedules for different beneficiaries 6 | 2. Each vesting schedule should have: 7 | - Total amount of tokens to be vested 8 | - Cliff period (time before any tokens can be claimed) 9 | - Vesting duration (total time for all tokens to vest) 10 | - Start time 11 | 3. After the cliff period, tokens should vest linearly over time 12 | 4. Beneficiaries should be able to claim their vested tokens at any time 13 | 5. Admin should be able to revoke unvested tokens from a beneficiary 14 | 15 | Bonus challenges: 16 | - Add support for multiple token types 17 | - Implement a whitelist for beneficiaries 18 | - Add emergency pause functionality 19 | 20 | Here's your starter code: 21 | */ 22 | 23 | // SPDX-License-Identifier: MIT 24 | pragma solidity ^0.8.0; 25 | 26 | import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; 27 | import "@openzeppelin/contracts/access/Ownable.sol"; 28 | import "@openzeppelin/contracts/utils/Pausable.sol"; 29 | import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; 30 | 31 | contract TokenVesting is Ownable(msg.sender), Pausable, ReentrancyGuard { 32 | struct VestingSchedule { 33 | // TODO: Define the vesting schedule struct 34 | } 35 | 36 | // Token being vested 37 | // TODO: Add state variables 38 | 39 | 40 | // Mapping from beneficiary to vesting schedule 41 | // TODO: Add state variables 42 | 43 | // Whitelist of beneficiaries 44 | // TODO: Add state variables 45 | 46 | // Events 47 | event VestingScheduleCreated(address indexed beneficiary, uint256 amount); 48 | event TokensClaimed(address indexed beneficiary, uint256 amount); 49 | event VestingRevoked(address indexed beneficiary); 50 | event BeneficiaryWhitelisted(address indexed beneficiary); 51 | event BeneficiaryRemovedFromWhitelist(address indexed beneficiary); 52 | 53 | constructor(address tokenAddress) { 54 | // TODO: Initialize the contract 55 | 56 | } 57 | 58 | // Modifier to check if beneficiary is whitelisted 59 | modifier onlyWhitelisted(address beneficiary) { 60 | require(whitelist[beneficiary], "Beneficiary not whitelisted"); 61 | _; 62 | } 63 | 64 | function addToWhitelist(address beneficiary) external onlyOwner { 65 | require(beneficiary != address(0), "Invalid address"); 66 | whitelist[beneficiary] = true; 67 | emit BeneficiaryWhitelisted(beneficiary); 68 | } 69 | 70 | function removeFromWhitelist(address beneficiary) external onlyOwner { 71 | whitelist[beneficiary] = false; 72 | emit BeneficiaryRemovedFromWhitelist(beneficiary); 73 | } 74 | 75 | function createVestingSchedule( 76 | address beneficiary, 77 | uint256 amount, 78 | uint256 cliffDuration, 79 | uint256 vestingDuration, 80 | uint256 startTime 81 | ) external onlyOwner onlyWhitelisted(beneficiary) whenNotPaused { 82 | // TODO: Implement vesting schedule creation 83 | } 84 | 85 | function calculateVestedAmount( 86 | address beneficiary 87 | ) public view returns (uint256) { 88 | // TODO: Implement vested amount calculation 89 | } 90 | 91 | function claimVestedTokens() external nonReentrant whenNotPaused { 92 | // TODO: Implement token claiming 93 | } 94 | 95 | function revokeVesting(address beneficiary) external onlyOwner { 96 | // TODO: Implement vesting revocation 97 | 98 | } 99 | 100 | function pause() external onlyOwner { 101 | _pause(); 102 | } 103 | 104 | function unpause() external onlyOwner { 105 | _unpause(); 106 | } 107 | } 108 | 109 | /* 110 | Solution template (key points to implement): 111 | 112 | 1. VestingSchedule struct should contain: 113 | - Total amount 114 | - Start time 115 | - Cliff duration 116 | - Vesting duration 117 | - Amount claimed 118 | - Revoked status 119 | 120 | 2. State variables needed: 121 | - Mapping of beneficiary address to VestingSchedule 122 | - ERC20 token reference 123 | - Owner/admin address 124 | 125 | 3. createVestingSchedule should: 126 | - Validate input parameters 127 | - Create new vesting schedule 128 | - Transfer tokens to contract 129 | - Emit event 130 | 131 | 4. calculateVestedAmount should: 132 | - Check if cliff period has passed 133 | - Calculate linear vesting based on time passed 134 | - Account for already claimed tokens 135 | - Handle revoked status 136 | 137 | 5. claimVestedTokens should: 138 | - Calculate claimable amount 139 | - Update claimed amount 140 | - Transfer tokens 141 | - Emit event 142 | 143 | 6. revokeVesting should: 144 | - Only allow admin 145 | - Calculate and transfer unvested tokens back 146 | - Mark schedule as revoked 147 | - Emit event 148 | */ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🔒 OpenHack Vesting Challenge 💰 2 | 3 | ![image](./public/assets/OpenHack_Vesting_Challenge.png) 4 | 5 | OpenGuild Labs makes the repository to introduce OpenHack workshop participants to Solidity and help them familiarize themselves with the language. This challenge involves creating a smart contract for token vesting with configurable schedules. You'll learn about time-based operations, token handling, and access control in Solidity. 6 | 7 | ## Participant Registration 8 | 9 | Add your information to the below list to officially participate in the workshop challenge (This is the first mission of the whole workshop) 10 | 11 | | Emoji | Name | Github Username | Occupations | 12 | | ----- | --------------- | ----------------------------------------------------- | ------------------------ | 13 | | 🎅 | Ippo | [NTP-996](https://github.com/NTP-996) | DevRel | 14 | 15 | ## 💻 Local development environment setup 16 | 17 | ### 1. Install Volta (Node.js Version Manager) 18 | 19 | #### Windows 20 | 1. Download the Windows installer from https://docs.volta.sh/guide/getting-started 21 | 2. Run the installer and follow the prompts 22 | 3. Open a new terminal to activate Volta 23 | 24 | #### macOS/Linux 25 | ```bash 26 | # Install Volta 27 | curl https://get.volta.sh | bash 28 | 29 | # Restart your terminal or run 30 | source ~/.bashrc # for bash 31 | source ~/.zshrc # for zsh 32 | ``` 33 | 34 | ### 2. Install Node.js and npm using Volta 35 | ```bash 36 | # Install Node.js LTS version 37 | volta install node 38 | 39 | # Verify installation 40 | node --version 41 | npm --version 42 | ``` 43 | 44 | ## 🚀 Getting Started 45 | 46 | 47 | ```bash 48 | git clone git@github.com:NTP-996/open-hack-vesting.git 49 | cd open-hack-vesting 50 | npm i 51 | ``` 52 | 53 | ### 👉 Start working on the `TODO` 54 | 55 | ## ✅ You finished the challenge when you passed all the tests 56 | 57 | ```bash 58 | npx hardhat compile 59 | npx hardhat test 60 | ``` 61 | 62 | ![image](./public/assets/test.png) 63 | 64 | ## 🚀 Installing MetaMask and Deploying Smart Contracts on Asset-Hub Westend 65 | 66 | At the time writing this challenge, Hardhat haven't support deployment on Westend network, we need to use [remix](https://remix.polkadot.io/) for smart contract deployment 67 | 68 | ### 🦊 Installing and Setting Up MetaMask 69 | 70 | 1. 💿 Install Metahttps://remix.polkadot.io/Mask 71 | - Visit the [MetaMask website](https://metamask.io) 72 | - Click "Download" and add the extension to your browser 73 | - Create a new wallet by following the setup wizard 74 | - 🔐 Save your seed phrase securely and never share it with anyone 75 | 76 | 2. ⚙️ Configure Asset-Hub Westend Network 77 | - Click the network dropdown at the top of MetaMask 78 | - Select "Add Network" > "Add Network Manually" 79 | - Enter the following details: 80 | - 🌐 Network Name: Asset-Hub Westend Testnet 81 | - 🔗 RPC URL: https://westend-asset-hub-eth-rpc.polkadot.io 82 | - 🔢 Chain ID: 420420421 83 | - 💰 Currency Symbol: WND 84 | - 🔍 Block Explorer URL: https://assethub-westend.subscan.io 85 | 86 | ### 🪙 Getting Test Tokens 87 | 88 | 1. 💧 You'll need some WND tokens to deploy contracts 89 | - Visit the [Westend faucet](https://faucet.polkadot.io/westend?parachain=1000) 90 | - Request test tokens for your MetaMask address 91 | - ⏳ Wait for the tokens to appear in your wallet 92 | 93 | ## 💻 Using Remix and Deploying a Contract 94 | 95 | 🎯 Access Remix 96 | 97 | - Go to https://remix.polkadot.io 98 | - Simply copy/paste your yeild.sol contract 99 | 100 | 🔨 Compile the Contract 101 | 102 | - Select the "Solidity Compiler" tab 103 | - Choose compiler version (e.g., 0.8.0) 104 | - Click "Compile" 105 | 106 | 📤 Deploy the Contract 107 | 108 | - Go to the "Deploy & Run Transactions" tab 109 | - Set the environment to "Injected Provider - MetaMask" 110 | - Ensure your MetaMask is connected to Asset-Hub Westend 111 | - Click "Deploy" 112 | - Confirm 113 | 114 | ![image](./public/assets/deployed.png) 115 | 116 | --- 117 | 118 | ### 🙋‍♂️ How to claim the bounty? 119 | Complete the challenge on your fork repository
120 | ⭐ Star Open Guild repository
121 | 👥 Follow OpenGuild Lab Github
122 | 💬 Join OpenGuild Discord
123 | 📝 Submit the proof-of-work (your challenge repository) to OpenGuild Discord
124 | 125 | --- 126 | # 🤝 How to contribute to the community? 127 | 128 | To submit a proposal, ideas, or any questions, please submit them here: [OpenGuild Discussion 💭](https://github.com/orgs/openguild-labs/discussions) 129 | View tickets and activities that you can contribute: [Community Activities 🎯](https://github.com/orgs/openguild-labs/discussions/categories/activities) 130 | 131 | - **🌱 Help to grow the community:** Community growth is a collective effort. By actively engaging with and inviting fellow enthusiasts to join our community, you play a crucial role in expanding our network. Encourage discussions, share valuable insights, and foster a welcoming environment for newcomers. 132 | 133 | - **🎓 Participate in workshops and events:** Be an active participant in our workshops and events. These sessions serve as valuable opportunities to learn, collaborate, and stay updated on the latest developments in the Polkadot ecosystem. Through participation, you not only enhance your knowledge but also contribute to the collaborative spirit of OpenGuild. Share your experiences, ask questions, and forge connections with like-minded individuals. 134 | 135 | - **💡 Propose project ideas:** Your creativity and innovation are welcomed at OpenGuild. Propose project ideas that align with the goals of our community. Whether it's a new application, a tool, or a solution addressing a specific challenge in the Polkadot ecosystem, your ideas can spark exciting collaborations. 136 | 137 | - **🛠️ Contribute to our developer tools:** Get involved in the ongoing development and improvement of tools that aid developers in their projects. Whether it's through code contributions, bug reports, or feature suggestions, your involvement in enhancing these tools strengthens the foundation for innovation within OpenGuild and the broader Polkadot community. **Contribute to our developer tools:** Get involved in the ongoing development and improvement of tools that aid developers in their projects. Whether it's through code contributions, bug reports, or feature suggestions, your involvement in enhancing these tools strengthens the foundation for innovation within OpenGuild and the broader Polkadot community. 138 | -------------------------------------------------------------------------------- /test/vesting.ts: -------------------------------------------------------------------------------- 1 | const { expect } = require("chai"); 2 | const { ethers } = require("hardhat"); 3 | const { time } = require("@nomicfoundation/hardhat-network-helpers"); 4 | 5 | describe("TokenVesting", function () { 6 | let Token; 7 | let token: any; 8 | let TokenVesting; 9 | let vesting: any; 10 | let owner: any; 11 | let beneficiary: any; 12 | let addr2: any; 13 | let startTime: any; 14 | const amount = ethers.parseEther("1000"); 15 | const cliffDuration = 365 * 24 * 60 * 60; // 1 year 16 | const vestingDuration = 730 * 24 * 60 * 60; // 2 years 17 | 18 | beforeEach(async function () { 19 | [owner, beneficiary, addr2] = await ethers.getSigners(); 20 | 21 | // Deploy Mock Token 22 | const MockERC20 = await ethers.getContractFactory("MockERC20"); 23 | token = await MockERC20.deploy("Mock Token", "MTK"); 24 | await token.waitForDeployment(); 25 | 26 | // Deploy Vesting Contract 27 | const TokenVesting = await ethers.getContractFactory("TokenVesting"); 28 | vesting = await TokenVesting.deploy(await token.getAddress()); 29 | await vesting.waitForDeployment(); 30 | 31 | // Mint tokens to owner 32 | await token.mint(owner.address, ethers.parseEther("10000")); 33 | 34 | // Approve vesting contract 35 | await token.approve(await vesting.getAddress(), ethers.parseEther("10000")); 36 | 37 | startTime = (await time.latest()) + 60; // Start 1 minute from now 38 | }); 39 | 40 | describe("Deployment", function () { 41 | it("Should set the right token", async function () { 42 | expect(await vesting.token()).to.equal(await token.getAddress()); 43 | }); 44 | 45 | it("Should set the right owner", async function () { 46 | expect(await vesting.owner()).to.equal(owner.address); 47 | }); 48 | }); 49 | 50 | describe("Whitelist", function () { 51 | it("Should allow owner to whitelist beneficiary", async function () { 52 | await vesting.addToWhitelist(beneficiary.address); 53 | expect(await vesting.whitelist(beneficiary.address)).to.be.true; 54 | }); 55 | 56 | it("Should not allow non-owner to whitelist", async function () { 57 | await expect( 58 | vesting.connect(beneficiary).addToWhitelist(beneficiary.address) 59 | ).to.be.revertedWithCustomError(vesting, "OwnableUnauthorizedAccount"); 60 | }); 61 | }); 62 | 63 | describe("Creating vesting schedule", function () { 64 | beforeEach(async function () { 65 | await vesting.addToWhitelist(beneficiary.address); 66 | }); 67 | 68 | it("Should create vesting schedule", async function () { 69 | await vesting.createVestingSchedule( 70 | beneficiary.address, 71 | amount, 72 | cliffDuration, 73 | vestingDuration, 74 | startTime 75 | ); 76 | 77 | const schedule = await vesting.vestingSchedules(beneficiary.address); 78 | expect(schedule.totalAmount).to.equal(amount); 79 | }); 80 | 81 | it("Should fail for non-whitelisted beneficiary", async function () { 82 | await expect( 83 | vesting.createVestingSchedule( 84 | addr2.address, 85 | amount, 86 | cliffDuration, 87 | vestingDuration, 88 | startTime 89 | ) 90 | ).to.be.revertedWith("Beneficiary not whitelisted"); 91 | }); 92 | }); 93 | 94 | describe("Claiming tokens", function () { 95 | beforeEach(async function () { 96 | await vesting.addToWhitelist(beneficiary.address); 97 | await vesting.createVestingSchedule( 98 | beneficiary.address, 99 | amount, 100 | cliffDuration, 101 | vestingDuration, 102 | startTime 103 | ); 104 | }); 105 | 106 | it("Should not allow claiming before cliff", async function () { 107 | // Ensure we're past the start time but before cliff 108 | await time.increase(60); // Move past start time 109 | await expect( 110 | vesting.connect(beneficiary).claimVestedTokens() 111 | ).to.be.revertedWith("No tokens to claim"); 112 | }); 113 | 114 | it("Should allow claiming after cliff", async function () { 115 | await time.increaseTo(startTime + cliffDuration + vestingDuration / 4); 116 | await vesting.connect(beneficiary).claimVestedTokens(); 117 | expect(await token.balanceOf(beneficiary.address)).to.be.above(0); 118 | }); 119 | 120 | it("Should vest full amount after vesting duration", async function () { 121 | await time.increaseTo(startTime + vestingDuration + 1); 122 | await vesting.connect(beneficiary).claimVestedTokens(); 123 | expect(await token.balanceOf(beneficiary.address)).to.equal(amount); 124 | }); 125 | }); 126 | 127 | describe("Revoking vesting", function () { 128 | beforeEach(async function () { 129 | await vesting.addToWhitelist(beneficiary.address); 130 | await vesting.createVestingSchedule( 131 | beneficiary.address, 132 | amount, 133 | cliffDuration, 134 | vestingDuration, 135 | startTime 136 | ); 137 | }); 138 | 139 | it("Should allow owner to revoke vesting", async function () { 140 | await vesting.revokeVesting(beneficiary.address); 141 | const schedule = await vesting.vestingSchedules(beneficiary.address); 142 | expect(schedule.revoked).to.be.true; 143 | }); 144 | 145 | it("Should not allow non-owner to revoke vesting", async function () { 146 | await expect( 147 | vesting.connect(beneficiary).revokeVesting(beneficiary.address) 148 | ).to.be.revertedWithCustomError(vesting, "OwnableUnauthorizedAccount"); 149 | }); 150 | 151 | it("Should return unvested tokens to owner when revoking", async function () { 152 | const initialOwnerBalance = await token.balanceOf(owner.address); 153 | await time.increaseTo(startTime + vestingDuration / 2); // 50% vested 154 | await vesting.revokeVesting(beneficiary.address); 155 | const finalOwnerBalance = await token.balanceOf(owner.address); 156 | expect(finalOwnerBalance - initialOwnerBalance).to.be.closeTo( 157 | amount / BigInt(2), // Approximately 50% of tokens should return to owner 158 | ethers.parseEther("1") // Allow for small rounding differences 159 | ); 160 | }); 161 | }); 162 | 163 | describe("Pausing", function () { 164 | beforeEach(async function () { 165 | await vesting.addToWhitelist(beneficiary.address); 166 | await vesting.createVestingSchedule( 167 | beneficiary.address, 168 | amount, 169 | cliffDuration, 170 | vestingDuration, 171 | startTime 172 | ); 173 | }); 174 | 175 | it("Should not allow operations when paused", async function () { 176 | await vesting.pause(); 177 | await expect( 178 | vesting.connect(beneficiary).claimVestedTokens() 179 | ).to.be.revertedWithCustomError(vesting, "EnforcedPause"); 180 | }); 181 | 182 | it("Should allow operations after unpause", async function () { 183 | await vesting.pause(); 184 | await vesting.unpause(); 185 | await time.increaseTo(startTime + vestingDuration); 186 | await expect(vesting.connect(beneficiary).claimVestedTokens()).to.not.be 187 | .reverted; 188 | }); 189 | }); 190 | }); 191 | -------------------------------------------------------------------------------- /ignition/deployments/chain-420420421/journal.jsonl: -------------------------------------------------------------------------------- 1 | 2 | {"chainId":420420421,"type":"DEPLOYMENT_INITIALIZE"} 3 | {"artifactId":"TokenVesting#mock_token","constructorArgs":["Test Token","TST"],"contractName":"MockERC20","dependencies":[],"from":"0x8e6d3ce082888ae69260a9654766d23d658372bf","futureId":"TokenVesting#mock_token","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} 4 | {"futureId":"TokenVesting#mock_token","networkInteraction":{"data":"0x60806040523480156200001157600080fd5b5060405162000c4a38038062000c4a8339810160408190526200003491620001b1565b3382826003620000458382620002aa565b506004620000548282620002aa565b5050506001600160a01b0381166200008657604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b62000091816200009a565b50505062000376565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200011457600080fd5b81516001600160401b0380821115620001315762000131620000ec565b604051601f8301601f19908116603f011681019082821181831017156200015c576200015c620000ec565b816040528381526020925086838588010111156200017957600080fd5b600091505b838210156200019d57858201830151818301840152908201906200017e565b600093810190920192909252949350505050565b60008060408385031215620001c557600080fd5b82516001600160401b0380821115620001dd57600080fd5b620001eb8683870162000102565b935060208501519150808211156200020257600080fd5b50620002118582860162000102565b9150509250929050565b600181811c908216806200023057607f821691505b6020821081036200025157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002a557600081815260208120601f850160051c81016020861015620002805750805b601f850160051c820191505b81811015620002a1578281556001016200028c565b5050505b505050565b81516001600160401b03811115620002c657620002c6620000ec565b620002de81620002d784546200021b565b8462000257565b602080601f831160018114620003165760008415620002fd5750858301515b600019600386901b1c1916600185901b178555620002a1565b600085815260208120601f198616915b82811015620003475788860151825594840194600190910190840162000326565b5085821015620003665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6108c480620003866000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c57806395d89b411161006657806395d89b41146101aa578063a9059cbb146101b2578063dd62ed3e146101c5578063f2fde38b146101fe57600080fd5b806370a082311461015e578063715018a6146101875780638da5cb5b1461018f57600080fd5b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461011557806323b872dd14610127578063313ce5671461013a57806340c10f1914610149575b600080fd5b6100dc610211565b6040516100e9919061070e565b60405180910390f35b610105610100366004610778565b6102a3565b60405190151581526020016100e9565b6002545b6040519081526020016100e9565b6101056101353660046107a2565b6102bd565b604051601281526020016100e9565b61015c610157366004610778565b6102e1565b005b61011961016c3660046107de565b6001600160a01b031660009081526020819052604090205490565b61015c6102f7565b6005546040516001600160a01b0390911681526020016100e9565b6100dc61030b565b6101056101c0366004610778565b61031a565b6101196101d3366004610800565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61015c61020c3660046107de565b610328565b60606003805461022090610833565b80601f016020809104026020016040519081016040528092919081815260200182805461024c90610833565b80156102995780601f1061026e57610100808354040283529160200191610299565b820191906000526020600020905b81548152906001019060200180831161027c57829003601f168201915b5050505050905090565b6000336102b181858561036b565b60019150505b92915050565b6000336102cb85828561037d565b6102d68585856103fb565b506001949350505050565b6102e961045a565b6102f38282610487565b5050565b6102ff61045a565b61030960006104bd565b565b60606004805461022090610833565b6000336102b18185856103fb565b61033061045a565b6001600160a01b03811661035f57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610368816104bd565b50565b610378838383600161050f565b505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146103f557818110156103e657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610356565b6103f58484848403600061050f565b50505050565b6001600160a01b03831661042557604051634b637e8f60e11b815260006004820152602401610356565b6001600160a01b03821661044f5760405163ec442f0560e01b815260006004820152602401610356565b6103788383836105e4565b6005546001600160a01b031633146103095760405163118cdaa760e01b8152336004820152602401610356565b6001600160a01b0382166104b15760405163ec442f0560e01b815260006004820152602401610356565b6102f3600083836105e4565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166105395760405163e602df0560e01b815260006004820152602401610356565b6001600160a01b03831661056357604051634a1406b160e11b815260006004820152602401610356565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156103f557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d691815260200190565b60405180910390a350505050565b6001600160a01b03831661060f578060026000828254610604919061086d565b909155506106819050565b6001600160a01b038316600090815260208190526040902054818110156106625760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610356565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661069d576002805482900390556106bc565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161070191815260200190565b60405180910390a3505050565b600060208083528351808285015260005b8181101561073b5785810183015185820160400152820161071f565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461077357600080fd5b919050565b6000806040838503121561078b57600080fd5b6107948361075c565b946020939093013593505050565b6000806000606084860312156107b757600080fd5b6107c08461075c565b92506107ce6020850161075c565b9150604084013590509250925092565b6000602082840312156107f057600080fd5b6107f98261075c565b9392505050565b6000806040838503121561081357600080fd5b61081c8361075c565b915061082a6020840161075c565b90509250929050565b600181811c9082168061084757607f821691505b60208210810361086757634e487b7160e01b600052602260045260246000fd5b50919050565b808201808211156102b757634e487b7160e01b600052601160045260246000fdfea2646970667358221220109b9a599f0badc23fa957fb1510c08b12fb54cd8baf3ac22829364fb2029e0564736f6c6343000814003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a5465737420546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035453540000000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} 5 | {"artifactId":"VestingModule#simple_token","constructorArgs":[],"contractName":"SimpleToken","dependencies":[],"from":"0x8e6d3ce082888ae69260a9654766d23d658372bf","futureId":"VestingModule#simple_token","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} 6 | {"futureId":"VestingModule#simple_token","networkInteraction":{"data":"0x60806040523480156200001157600080fd5b506040518060400160405280600c81526020016b29b4b6b83632902a37b5b2b760a11b8152506040518060400160405280600381526020016253544b60e81b8152508160039081620000649190620002d2565b506004620000738282620002d2565b505050620000ad336200008b620000b360201b60201c565b6200009890600a620004b3565b620000a790620f4240620004cb565b620000b8565b620004fb565b601290565b6001600160a01b038216620000e85760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000f660008383620000fa565b5050565b6001600160a01b038316620001295780600260008282546200011d9190620004e5565b909155506200019d9050565b6001600160a01b038316600090815260208190526040902054818110156200017e5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000df565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001bb57600280548290039055620001da565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200022091815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200025857607f821691505b6020821081036200027957634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002cd57600081815260208120601f850160051c81016020861015620002a85750805b601f850160051c820191505b81811015620002c957828155600101620002b4565b5050505b505050565b81516001600160401b03811115620002ee57620002ee6200022d565b6200030681620002ff845462000243565b846200027f565b602080601f8311600181146200033e5760008415620003255750858301515b600019600386901b1c1916600185901b178555620002c9565b600085815260208120601f198616915b828110156200036f578886015182559484019460019091019084016200034e565b50858210156200038e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620003f5578160001904821115620003d957620003d96200039e565b80851615620003e757918102915b93841c9390800290620003b9565b509250929050565b6000826200040e57506001620004ad565b816200041d57506000620004ad565b8160018114620004365760028114620004415762000461565b6001915050620004ad565b60ff8411156200045557620004556200039e565b50506001821b620004ad565b5060208310610133831016604e8410600b841016171562000486575081810a620004ad565b620004928383620003b4565b8060001904821115620004a957620004a96200039e565b0290505b92915050565b6000620004c460ff841683620003fd565b9392505050565b8082028115828204841417620004ad57620004ad6200039e565b80820180821115620004ad57620004ad6200039e565b610710806200050b6000396000f3fe608060405234801561001057600080fd5b50600436106100835760003560e01c806306fdde0314610088578063095ea7b3146100a657806318160ddd146100c957806323b872dd146100db578063313ce567146100ee57806370a08231146100fd57806395d89b4114610126578063a9059cbb1461012e578063dd62ed3e14610141575b600080fd5b610090610154565b60405161009d9190610525565b60405180910390f35b6100b96100b436600461058f565b6101e6565b604051901515815260200161009d565b6002545b60405190815260200161009d565b6100b96100e93660046105b9565b610200565b6040516012815260200161009d565b6100cd61010b3660046105f5565b6001600160a01b031660009081526020819052604090205490565b610090610224565b6100b961013c36600461058f565b610233565b6100cd61014f366004610617565b610241565b6060600380546101639061064a565b80601f016020809104026020016040519081016040528092919081815260200182805461018f9061064a565b80156101dc5780601f106101b1576101008083540402835291602001916101dc565b820191906000526020600020905b8154815290600101906020018083116101bf57829003601f168201915b5050505050905090565b6000336101f481858561026c565b60019150505b92915050565b60003361020e85828561027e565b6102198585856102da565b506001949350505050565b6060600480546101639061064a565b6000336101f48185856102da565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102798383836001610339565b505050565b600061028a8484610241565b905060001981146102d457818110156102c557828183604051637dc7a0d960e11b81526004016102bc93929190610684565b60405180910390fd5b6102d484848484036000610339565b50505050565b6001600160a01b038316610304576000604051634b637e8f60e11b81526004016102bc91906106a5565b6001600160a01b03821661032e57600060405163ec442f0560e01b81526004016102bc91906106a5565b61027983838361040e565b6001600160a01b03841661036357600060405163e602df0560e01b81526004016102bc91906106a5565b6001600160a01b03831661038d576000604051634a1406b160e11b81526004016102bc91906106a5565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156102d457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161040091815260200190565b60405180910390a350505050565b6001600160a01b03831661043957806002600082825461042e91906106b9565b909155506104989050565b6001600160a01b038316600090815260208190526040902054818110156104795783818360405163391434e360e21b81526004016102bc93929190610684565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b0382166104b4576002805482900390556104d3565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161051891815260200190565b60405180910390a3505050565b600060208083528351808285015260005b8181101561055257858101830151858201604001528201610536565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461058a57600080fd5b919050565b600080604083850312156105a257600080fd5b6105ab83610573565b946020939093013593505050565b6000806000606084860312156105ce57600080fd5b6105d784610573565b92506105e560208501610573565b9150604084013590509250925092565b60006020828403121561060757600080fd5b61061082610573565b9392505050565b6000806040838503121561062a57600080fd5b61063383610573565b915061064160208401610573565b90509250929050565b600181811c9082168061065e57607f821691505b60208210810361067e57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0391909116815260200190565b808201808211156101fa57634e487b7160e01b600052601160045260246000fdfea2646970667358221220971c0411aa52274b5b193f98b7e4a9e2e3b85d9474dd56b20a8924d5daa020dc64736f6c63430008140033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} -------------------------------------------------------------------------------- /ignition/deployments/chain-420420421/artifacts/VestingModule#simple_token.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "SimpleToken", 4 | "sourceName": "contracts/token.sol", 5 | "abi": [ 6 | { 7 | "inputs": [], 8 | "stateMutability": "nonpayable", 9 | "type": "constructor" 10 | }, 11 | { 12 | "inputs": [ 13 | { 14 | "internalType": "address", 15 | "name": "spender", 16 | "type": "address" 17 | }, 18 | { 19 | "internalType": "uint256", 20 | "name": "allowance", 21 | "type": "uint256" 22 | }, 23 | { 24 | "internalType": "uint256", 25 | "name": "needed", 26 | "type": "uint256" 27 | } 28 | ], 29 | "name": "ERC20InsufficientAllowance", 30 | "type": "error" 31 | }, 32 | { 33 | "inputs": [ 34 | { 35 | "internalType": "address", 36 | "name": "sender", 37 | "type": "address" 38 | }, 39 | { 40 | "internalType": "uint256", 41 | "name": "balance", 42 | "type": "uint256" 43 | }, 44 | { 45 | "internalType": "uint256", 46 | "name": "needed", 47 | "type": "uint256" 48 | } 49 | ], 50 | "name": "ERC20InsufficientBalance", 51 | "type": "error" 52 | }, 53 | { 54 | "inputs": [ 55 | { 56 | "internalType": "address", 57 | "name": "approver", 58 | "type": "address" 59 | } 60 | ], 61 | "name": "ERC20InvalidApprover", 62 | "type": "error" 63 | }, 64 | { 65 | "inputs": [ 66 | { 67 | "internalType": "address", 68 | "name": "receiver", 69 | "type": "address" 70 | } 71 | ], 72 | "name": "ERC20InvalidReceiver", 73 | "type": "error" 74 | }, 75 | { 76 | "inputs": [ 77 | { 78 | "internalType": "address", 79 | "name": "sender", 80 | "type": "address" 81 | } 82 | ], 83 | "name": "ERC20InvalidSender", 84 | "type": "error" 85 | }, 86 | { 87 | "inputs": [ 88 | { 89 | "internalType": "address", 90 | "name": "spender", 91 | "type": "address" 92 | } 93 | ], 94 | "name": "ERC20InvalidSpender", 95 | "type": "error" 96 | }, 97 | { 98 | "anonymous": false, 99 | "inputs": [ 100 | { 101 | "indexed": true, 102 | "internalType": "address", 103 | "name": "owner", 104 | "type": "address" 105 | }, 106 | { 107 | "indexed": true, 108 | "internalType": "address", 109 | "name": "spender", 110 | "type": "address" 111 | }, 112 | { 113 | "indexed": false, 114 | "internalType": "uint256", 115 | "name": "value", 116 | "type": "uint256" 117 | } 118 | ], 119 | "name": "Approval", 120 | "type": "event" 121 | }, 122 | { 123 | "anonymous": false, 124 | "inputs": [ 125 | { 126 | "indexed": true, 127 | "internalType": "address", 128 | "name": "from", 129 | "type": "address" 130 | }, 131 | { 132 | "indexed": true, 133 | "internalType": "address", 134 | "name": "to", 135 | "type": "address" 136 | }, 137 | { 138 | "indexed": false, 139 | "internalType": "uint256", 140 | "name": "value", 141 | "type": "uint256" 142 | } 143 | ], 144 | "name": "Transfer", 145 | "type": "event" 146 | }, 147 | { 148 | "inputs": [ 149 | { 150 | "internalType": "address", 151 | "name": "owner", 152 | "type": "address" 153 | }, 154 | { 155 | "internalType": "address", 156 | "name": "spender", 157 | "type": "address" 158 | } 159 | ], 160 | "name": "allowance", 161 | "outputs": [ 162 | { 163 | "internalType": "uint256", 164 | "name": "", 165 | "type": "uint256" 166 | } 167 | ], 168 | "stateMutability": "view", 169 | "type": "function" 170 | }, 171 | { 172 | "inputs": [ 173 | { 174 | "internalType": "address", 175 | "name": "spender", 176 | "type": "address" 177 | }, 178 | { 179 | "internalType": "uint256", 180 | "name": "value", 181 | "type": "uint256" 182 | } 183 | ], 184 | "name": "approve", 185 | "outputs": [ 186 | { 187 | "internalType": "bool", 188 | "name": "", 189 | "type": "bool" 190 | } 191 | ], 192 | "stateMutability": "nonpayable", 193 | "type": "function" 194 | }, 195 | { 196 | "inputs": [ 197 | { 198 | "internalType": "address", 199 | "name": "account", 200 | "type": "address" 201 | } 202 | ], 203 | "name": "balanceOf", 204 | "outputs": [ 205 | { 206 | "internalType": "uint256", 207 | "name": "", 208 | "type": "uint256" 209 | } 210 | ], 211 | "stateMutability": "view", 212 | "type": "function" 213 | }, 214 | { 215 | "inputs": [], 216 | "name": "decimals", 217 | "outputs": [ 218 | { 219 | "internalType": "uint8", 220 | "name": "", 221 | "type": "uint8" 222 | } 223 | ], 224 | "stateMutability": "view", 225 | "type": "function" 226 | }, 227 | { 228 | "inputs": [], 229 | "name": "name", 230 | "outputs": [ 231 | { 232 | "internalType": "string", 233 | "name": "", 234 | "type": "string" 235 | } 236 | ], 237 | "stateMutability": "view", 238 | "type": "function" 239 | }, 240 | { 241 | "inputs": [], 242 | "name": "symbol", 243 | "outputs": [ 244 | { 245 | "internalType": "string", 246 | "name": "", 247 | "type": "string" 248 | } 249 | ], 250 | "stateMutability": "view", 251 | "type": "function" 252 | }, 253 | { 254 | "inputs": [], 255 | "name": "totalSupply", 256 | "outputs": [ 257 | { 258 | "internalType": "uint256", 259 | "name": "", 260 | "type": "uint256" 261 | } 262 | ], 263 | "stateMutability": "view", 264 | "type": "function" 265 | }, 266 | { 267 | "inputs": [ 268 | { 269 | "internalType": "address", 270 | "name": "to", 271 | "type": "address" 272 | }, 273 | { 274 | "internalType": "uint256", 275 | "name": "value", 276 | "type": "uint256" 277 | } 278 | ], 279 | "name": "transfer", 280 | "outputs": [ 281 | { 282 | "internalType": "bool", 283 | "name": "", 284 | "type": "bool" 285 | } 286 | ], 287 | "stateMutability": "nonpayable", 288 | "type": "function" 289 | }, 290 | { 291 | "inputs": [ 292 | { 293 | "internalType": "address", 294 | "name": "from", 295 | "type": "address" 296 | }, 297 | { 298 | "internalType": "address", 299 | "name": "to", 300 | "type": "address" 301 | }, 302 | { 303 | "internalType": "uint256", 304 | "name": "value", 305 | "type": "uint256" 306 | } 307 | ], 308 | "name": "transferFrom", 309 | "outputs": [ 310 | { 311 | "internalType": "bool", 312 | "name": "", 313 | "type": "bool" 314 | } 315 | ], 316 | "stateMutability": "nonpayable", 317 | "type": "function" 318 | } 319 | ], 320 | "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600c81526020016b29b4b6b83632902a37b5b2b760a11b8152506040518060400160405280600381526020016253544b60e81b8152508160039081620000649190620002d2565b506004620000738282620002d2565b505050620000ad336200008b620000b360201b60201c565b6200009890600a620004b3565b620000a790620f4240620004cb565b620000b8565b620004fb565b601290565b6001600160a01b038216620000e85760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620000f660008383620000fa565b5050565b6001600160a01b038316620001295780600260008282546200011d9190620004e5565b909155506200019d9050565b6001600160a01b038316600090815260208190526040902054818110156200017e5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000df565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620001bb57600280548290039055620001da565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200022091815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200025857607f821691505b6020821081036200027957634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002cd57600081815260208120601f850160051c81016020861015620002a85750805b601f850160051c820191505b81811015620002c957828155600101620002b4565b5050505b505050565b81516001600160401b03811115620002ee57620002ee6200022d565b6200030681620002ff845462000243565b846200027f565b602080601f8311600181146200033e5760008415620003255750858301515b600019600386901b1c1916600185901b178555620002c9565b600085815260208120601f198616915b828110156200036f578886015182559484019460019091019084016200034e565b50858210156200038e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620003f5578160001904821115620003d957620003d96200039e565b80851615620003e757918102915b93841c9390800290620003b9565b509250929050565b6000826200040e57506001620004ad565b816200041d57506000620004ad565b8160018114620004365760028114620004415762000461565b6001915050620004ad565b60ff8411156200045557620004556200039e565b50506001821b620004ad565b5060208310610133831016604e8410600b841016171562000486575081810a620004ad565b620004928383620003b4565b8060001904821115620004a957620004a96200039e565b0290505b92915050565b6000620004c460ff841683620003fd565b9392505050565b8082028115828204841417620004ad57620004ad6200039e565b80820180821115620004ad57620004ad6200039e565b610710806200050b6000396000f3fe608060405234801561001057600080fd5b50600436106100835760003560e01c806306fdde0314610088578063095ea7b3146100a657806318160ddd146100c957806323b872dd146100db578063313ce567146100ee57806370a08231146100fd57806395d89b4114610126578063a9059cbb1461012e578063dd62ed3e14610141575b600080fd5b610090610154565b60405161009d9190610525565b60405180910390f35b6100b96100b436600461058f565b6101e6565b604051901515815260200161009d565b6002545b60405190815260200161009d565b6100b96100e93660046105b9565b610200565b6040516012815260200161009d565b6100cd61010b3660046105f5565b6001600160a01b031660009081526020819052604090205490565b610090610224565b6100b961013c36600461058f565b610233565b6100cd61014f366004610617565b610241565b6060600380546101639061064a565b80601f016020809104026020016040519081016040528092919081815260200182805461018f9061064a565b80156101dc5780601f106101b1576101008083540402835291602001916101dc565b820191906000526020600020905b8154815290600101906020018083116101bf57829003601f168201915b5050505050905090565b6000336101f481858561026c565b60019150505b92915050565b60003361020e85828561027e565b6102198585856102da565b506001949350505050565b6060600480546101639061064a565b6000336101f48185856102da565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102798383836001610339565b505050565b600061028a8484610241565b905060001981146102d457818110156102c557828183604051637dc7a0d960e11b81526004016102bc93929190610684565b60405180910390fd5b6102d484848484036000610339565b50505050565b6001600160a01b038316610304576000604051634b637e8f60e11b81526004016102bc91906106a5565b6001600160a01b03821661032e57600060405163ec442f0560e01b81526004016102bc91906106a5565b61027983838361040e565b6001600160a01b03841661036357600060405163e602df0560e01b81526004016102bc91906106a5565b6001600160a01b03831661038d576000604051634a1406b160e11b81526004016102bc91906106a5565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156102d457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161040091815260200190565b60405180910390a350505050565b6001600160a01b03831661043957806002600082825461042e91906106b9565b909155506104989050565b6001600160a01b038316600090815260208190526040902054818110156104795783818360405163391434e360e21b81526004016102bc93929190610684565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b0382166104b4576002805482900390556104d3565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161051891815260200190565b60405180910390a3505050565b600060208083528351808285015260005b8181101561055257858101830151858201604001528201610536565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461058a57600080fd5b919050565b600080604083850312156105a257600080fd5b6105ab83610573565b946020939093013593505050565b6000806000606084860312156105ce57600080fd5b6105d784610573565b92506105e560208501610573565b9150604084013590509250925092565b60006020828403121561060757600080fd5b61061082610573565b9392505050565b6000806040838503121561062a57600080fd5b61063383610573565b915061064160208401610573565b90509250929050565b600181811c9082168061065e57607f821691505b60208210810361067e57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0391909116815260200190565b808201808211156101fa57634e487b7160e01b600052601160045260246000fdfea2646970667358221220971c0411aa52274b5b193f98b7e4a9e2e3b85d9474dd56b20a8924d5daa020dc64736f6c63430008140033", 321 | "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100835760003560e01c806306fdde0314610088578063095ea7b3146100a657806318160ddd146100c957806323b872dd146100db578063313ce567146100ee57806370a08231146100fd57806395d89b4114610126578063a9059cbb1461012e578063dd62ed3e14610141575b600080fd5b610090610154565b60405161009d9190610525565b60405180910390f35b6100b96100b436600461058f565b6101e6565b604051901515815260200161009d565b6002545b60405190815260200161009d565b6100b96100e93660046105b9565b610200565b6040516012815260200161009d565b6100cd61010b3660046105f5565b6001600160a01b031660009081526020819052604090205490565b610090610224565b6100b961013c36600461058f565b610233565b6100cd61014f366004610617565b610241565b6060600380546101639061064a565b80601f016020809104026020016040519081016040528092919081815260200182805461018f9061064a565b80156101dc5780601f106101b1576101008083540402835291602001916101dc565b820191906000526020600020905b8154815290600101906020018083116101bf57829003601f168201915b5050505050905090565b6000336101f481858561026c565b60019150505b92915050565b60003361020e85828561027e565b6102198585856102da565b506001949350505050565b6060600480546101639061064a565b6000336101f48185856102da565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102798383836001610339565b505050565b600061028a8484610241565b905060001981146102d457818110156102c557828183604051637dc7a0d960e11b81526004016102bc93929190610684565b60405180910390fd5b6102d484848484036000610339565b50505050565b6001600160a01b038316610304576000604051634b637e8f60e11b81526004016102bc91906106a5565b6001600160a01b03821661032e57600060405163ec442f0560e01b81526004016102bc91906106a5565b61027983838361040e565b6001600160a01b03841661036357600060405163e602df0560e01b81526004016102bc91906106a5565b6001600160a01b03831661038d576000604051634a1406b160e11b81526004016102bc91906106a5565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156102d457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161040091815260200190565b60405180910390a350505050565b6001600160a01b03831661043957806002600082825461042e91906106b9565b909155506104989050565b6001600160a01b038316600090815260208190526040902054818110156104795783818360405163391434e360e21b81526004016102bc93929190610684565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b0382166104b4576002805482900390556104d3565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161051891815260200190565b60405180910390a3505050565b600060208083528351808285015260005b8181101561055257858101830151858201604001528201610536565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461058a57600080fd5b919050565b600080604083850312156105a257600080fd5b6105ab83610573565b946020939093013593505050565b6000806000606084860312156105ce57600080fd5b6105d784610573565b92506105e560208501610573565b9150604084013590509250925092565b60006020828403121561060757600080fd5b61061082610573565b9392505050565b6000806040838503121561062a57600080fd5b61063383610573565b915061064160208401610573565b90509250929050565b600181811c9082168061065e57607f821691505b60208210810361067e57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0391909116815260200190565b808201808211156101fa57634e487b7160e01b600052601160045260246000fdfea2646970667358221220971c0411aa52274b5b193f98b7e4a9e2e3b85d9474dd56b20a8924d5daa020dc64736f6c63430008140033", 322 | "linkReferences": {}, 323 | "deployedLinkReferences": {} 324 | } -------------------------------------------------------------------------------- /ignition/deployments/chain-420420421/artifacts/TokenVesting#mock_token.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "MockERC20", 4 | "sourceName": "contracts/token.sol", 5 | "abi": [ 6 | { 7 | "inputs": [ 8 | { 9 | "internalType": "string", 10 | "name": "name", 11 | "type": "string" 12 | }, 13 | { 14 | "internalType": "string", 15 | "name": "symbol", 16 | "type": "string" 17 | } 18 | ], 19 | "stateMutability": "nonpayable", 20 | "type": "constructor" 21 | }, 22 | { 23 | "inputs": [ 24 | { 25 | "internalType": "address", 26 | "name": "spender", 27 | "type": "address" 28 | }, 29 | { 30 | "internalType": "uint256", 31 | "name": "allowance", 32 | "type": "uint256" 33 | }, 34 | { 35 | "internalType": "uint256", 36 | "name": "needed", 37 | "type": "uint256" 38 | } 39 | ], 40 | "name": "ERC20InsufficientAllowance", 41 | "type": "error" 42 | }, 43 | { 44 | "inputs": [ 45 | { 46 | "internalType": "address", 47 | "name": "sender", 48 | "type": "address" 49 | }, 50 | { 51 | "internalType": "uint256", 52 | "name": "balance", 53 | "type": "uint256" 54 | }, 55 | { 56 | "internalType": "uint256", 57 | "name": "needed", 58 | "type": "uint256" 59 | } 60 | ], 61 | "name": "ERC20InsufficientBalance", 62 | "type": "error" 63 | }, 64 | { 65 | "inputs": [ 66 | { 67 | "internalType": "address", 68 | "name": "approver", 69 | "type": "address" 70 | } 71 | ], 72 | "name": "ERC20InvalidApprover", 73 | "type": "error" 74 | }, 75 | { 76 | "inputs": [ 77 | { 78 | "internalType": "address", 79 | "name": "receiver", 80 | "type": "address" 81 | } 82 | ], 83 | "name": "ERC20InvalidReceiver", 84 | "type": "error" 85 | }, 86 | { 87 | "inputs": [ 88 | { 89 | "internalType": "address", 90 | "name": "sender", 91 | "type": "address" 92 | } 93 | ], 94 | "name": "ERC20InvalidSender", 95 | "type": "error" 96 | }, 97 | { 98 | "inputs": [ 99 | { 100 | "internalType": "address", 101 | "name": "spender", 102 | "type": "address" 103 | } 104 | ], 105 | "name": "ERC20InvalidSpender", 106 | "type": "error" 107 | }, 108 | { 109 | "inputs": [ 110 | { 111 | "internalType": "address", 112 | "name": "owner", 113 | "type": "address" 114 | } 115 | ], 116 | "name": "OwnableInvalidOwner", 117 | "type": "error" 118 | }, 119 | { 120 | "inputs": [ 121 | { 122 | "internalType": "address", 123 | "name": "account", 124 | "type": "address" 125 | } 126 | ], 127 | "name": "OwnableUnauthorizedAccount", 128 | "type": "error" 129 | }, 130 | { 131 | "anonymous": false, 132 | "inputs": [ 133 | { 134 | "indexed": true, 135 | "internalType": "address", 136 | "name": "owner", 137 | "type": "address" 138 | }, 139 | { 140 | "indexed": true, 141 | "internalType": "address", 142 | "name": "spender", 143 | "type": "address" 144 | }, 145 | { 146 | "indexed": false, 147 | "internalType": "uint256", 148 | "name": "value", 149 | "type": "uint256" 150 | } 151 | ], 152 | "name": "Approval", 153 | "type": "event" 154 | }, 155 | { 156 | "anonymous": false, 157 | "inputs": [ 158 | { 159 | "indexed": true, 160 | "internalType": "address", 161 | "name": "previousOwner", 162 | "type": "address" 163 | }, 164 | { 165 | "indexed": true, 166 | "internalType": "address", 167 | "name": "newOwner", 168 | "type": "address" 169 | } 170 | ], 171 | "name": "OwnershipTransferred", 172 | "type": "event" 173 | }, 174 | { 175 | "anonymous": false, 176 | "inputs": [ 177 | { 178 | "indexed": true, 179 | "internalType": "address", 180 | "name": "from", 181 | "type": "address" 182 | }, 183 | { 184 | "indexed": true, 185 | "internalType": "address", 186 | "name": "to", 187 | "type": "address" 188 | }, 189 | { 190 | "indexed": false, 191 | "internalType": "uint256", 192 | "name": "value", 193 | "type": "uint256" 194 | } 195 | ], 196 | "name": "Transfer", 197 | "type": "event" 198 | }, 199 | { 200 | "inputs": [ 201 | { 202 | "internalType": "address", 203 | "name": "owner", 204 | "type": "address" 205 | }, 206 | { 207 | "internalType": "address", 208 | "name": "spender", 209 | "type": "address" 210 | } 211 | ], 212 | "name": "allowance", 213 | "outputs": [ 214 | { 215 | "internalType": "uint256", 216 | "name": "", 217 | "type": "uint256" 218 | } 219 | ], 220 | "stateMutability": "view", 221 | "type": "function" 222 | }, 223 | { 224 | "inputs": [ 225 | { 226 | "internalType": "address", 227 | "name": "spender", 228 | "type": "address" 229 | }, 230 | { 231 | "internalType": "uint256", 232 | "name": "value", 233 | "type": "uint256" 234 | } 235 | ], 236 | "name": "approve", 237 | "outputs": [ 238 | { 239 | "internalType": "bool", 240 | "name": "", 241 | "type": "bool" 242 | } 243 | ], 244 | "stateMutability": "nonpayable", 245 | "type": "function" 246 | }, 247 | { 248 | "inputs": [ 249 | { 250 | "internalType": "address", 251 | "name": "account", 252 | "type": "address" 253 | } 254 | ], 255 | "name": "balanceOf", 256 | "outputs": [ 257 | { 258 | "internalType": "uint256", 259 | "name": "", 260 | "type": "uint256" 261 | } 262 | ], 263 | "stateMutability": "view", 264 | "type": "function" 265 | }, 266 | { 267 | "inputs": [], 268 | "name": "decimals", 269 | "outputs": [ 270 | { 271 | "internalType": "uint8", 272 | "name": "", 273 | "type": "uint8" 274 | } 275 | ], 276 | "stateMutability": "view", 277 | "type": "function" 278 | }, 279 | { 280 | "inputs": [ 281 | { 282 | "internalType": "address", 283 | "name": "to", 284 | "type": "address" 285 | }, 286 | { 287 | "internalType": "uint256", 288 | "name": "amount", 289 | "type": "uint256" 290 | } 291 | ], 292 | "name": "mint", 293 | "outputs": [], 294 | "stateMutability": "nonpayable", 295 | "type": "function" 296 | }, 297 | { 298 | "inputs": [], 299 | "name": "name", 300 | "outputs": [ 301 | { 302 | "internalType": "string", 303 | "name": "", 304 | "type": "string" 305 | } 306 | ], 307 | "stateMutability": "view", 308 | "type": "function" 309 | }, 310 | { 311 | "inputs": [], 312 | "name": "owner", 313 | "outputs": [ 314 | { 315 | "internalType": "address", 316 | "name": "", 317 | "type": "address" 318 | } 319 | ], 320 | "stateMutability": "view", 321 | "type": "function" 322 | }, 323 | { 324 | "inputs": [], 325 | "name": "renounceOwnership", 326 | "outputs": [], 327 | "stateMutability": "nonpayable", 328 | "type": "function" 329 | }, 330 | { 331 | "inputs": [], 332 | "name": "symbol", 333 | "outputs": [ 334 | { 335 | "internalType": "string", 336 | "name": "", 337 | "type": "string" 338 | } 339 | ], 340 | "stateMutability": "view", 341 | "type": "function" 342 | }, 343 | { 344 | "inputs": [], 345 | "name": "totalSupply", 346 | "outputs": [ 347 | { 348 | "internalType": "uint256", 349 | "name": "", 350 | "type": "uint256" 351 | } 352 | ], 353 | "stateMutability": "view", 354 | "type": "function" 355 | }, 356 | { 357 | "inputs": [ 358 | { 359 | "internalType": "address", 360 | "name": "to", 361 | "type": "address" 362 | }, 363 | { 364 | "internalType": "uint256", 365 | "name": "value", 366 | "type": "uint256" 367 | } 368 | ], 369 | "name": "transfer", 370 | "outputs": [ 371 | { 372 | "internalType": "bool", 373 | "name": "", 374 | "type": "bool" 375 | } 376 | ], 377 | "stateMutability": "nonpayable", 378 | "type": "function" 379 | }, 380 | { 381 | "inputs": [ 382 | { 383 | "internalType": "address", 384 | "name": "from", 385 | "type": "address" 386 | }, 387 | { 388 | "internalType": "address", 389 | "name": "to", 390 | "type": "address" 391 | }, 392 | { 393 | "internalType": "uint256", 394 | "name": "value", 395 | "type": "uint256" 396 | } 397 | ], 398 | "name": "transferFrom", 399 | "outputs": [ 400 | { 401 | "internalType": "bool", 402 | "name": "", 403 | "type": "bool" 404 | } 405 | ], 406 | "stateMutability": "nonpayable", 407 | "type": "function" 408 | }, 409 | { 410 | "inputs": [ 411 | { 412 | "internalType": "address", 413 | "name": "newOwner", 414 | "type": "address" 415 | } 416 | ], 417 | "name": "transferOwnership", 418 | "outputs": [], 419 | "stateMutability": "nonpayable", 420 | "type": "function" 421 | } 422 | ], 423 | "bytecode": "0x60806040523480156200001157600080fd5b5060405162000c4a38038062000c4a8339810160408190526200003491620001b1565b3382826003620000458382620002aa565b506004620000548282620002aa565b5050506001600160a01b0381166200008657604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b62000091816200009a565b50505062000376565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200011457600080fd5b81516001600160401b0380821115620001315762000131620000ec565b604051601f8301601f19908116603f011681019082821181831017156200015c576200015c620000ec565b816040528381526020925086838588010111156200017957600080fd5b600091505b838210156200019d57858201830151818301840152908201906200017e565b600093810190920192909252949350505050565b60008060408385031215620001c557600080fd5b82516001600160401b0380821115620001dd57600080fd5b620001eb8683870162000102565b935060208501519150808211156200020257600080fd5b50620002118582860162000102565b9150509250929050565b600181811c908216806200023057607f821691505b6020821081036200025157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002a557600081815260208120601f850160051c81016020861015620002805750805b601f850160051c820191505b81811015620002a1578281556001016200028c565b5050505b505050565b81516001600160401b03811115620002c657620002c6620000ec565b620002de81620002d784546200021b565b8462000257565b602080601f831160018114620003165760008415620002fd5750858301515b600019600386901b1c1916600185901b178555620002a1565b600085815260208120601f198616915b82811015620003475788860151825594840194600190910190840162000326565b5085821015620003665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6108c480620003866000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c57806395d89b411161006657806395d89b41146101aa578063a9059cbb146101b2578063dd62ed3e146101c5578063f2fde38b146101fe57600080fd5b806370a082311461015e578063715018a6146101875780638da5cb5b1461018f57600080fd5b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461011557806323b872dd14610127578063313ce5671461013a57806340c10f1914610149575b600080fd5b6100dc610211565b6040516100e9919061070e565b60405180910390f35b610105610100366004610778565b6102a3565b60405190151581526020016100e9565b6002545b6040519081526020016100e9565b6101056101353660046107a2565b6102bd565b604051601281526020016100e9565b61015c610157366004610778565b6102e1565b005b61011961016c3660046107de565b6001600160a01b031660009081526020819052604090205490565b61015c6102f7565b6005546040516001600160a01b0390911681526020016100e9565b6100dc61030b565b6101056101c0366004610778565b61031a565b6101196101d3366004610800565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61015c61020c3660046107de565b610328565b60606003805461022090610833565b80601f016020809104026020016040519081016040528092919081815260200182805461024c90610833565b80156102995780601f1061026e57610100808354040283529160200191610299565b820191906000526020600020905b81548152906001019060200180831161027c57829003601f168201915b5050505050905090565b6000336102b181858561036b565b60019150505b92915050565b6000336102cb85828561037d565b6102d68585856103fb565b506001949350505050565b6102e961045a565b6102f38282610487565b5050565b6102ff61045a565b61030960006104bd565b565b60606004805461022090610833565b6000336102b18185856103fb565b61033061045a565b6001600160a01b03811661035f57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610368816104bd565b50565b610378838383600161050f565b505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146103f557818110156103e657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610356565b6103f58484848403600061050f565b50505050565b6001600160a01b03831661042557604051634b637e8f60e11b815260006004820152602401610356565b6001600160a01b03821661044f5760405163ec442f0560e01b815260006004820152602401610356565b6103788383836105e4565b6005546001600160a01b031633146103095760405163118cdaa760e01b8152336004820152602401610356565b6001600160a01b0382166104b15760405163ec442f0560e01b815260006004820152602401610356565b6102f3600083836105e4565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166105395760405163e602df0560e01b815260006004820152602401610356565b6001600160a01b03831661056357604051634a1406b160e11b815260006004820152602401610356565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156103f557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d691815260200190565b60405180910390a350505050565b6001600160a01b03831661060f578060026000828254610604919061086d565b909155506106819050565b6001600160a01b038316600090815260208190526040902054818110156106625760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610356565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661069d576002805482900390556106bc565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161070191815260200190565b60405180910390a3505050565b600060208083528351808285015260005b8181101561073b5785810183015185820160400152820161071f565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461077357600080fd5b919050565b6000806040838503121561078b57600080fd5b6107948361075c565b946020939093013593505050565b6000806000606084860312156107b757600080fd5b6107c08461075c565b92506107ce6020850161075c565b9150604084013590509250925092565b6000602082840312156107f057600080fd5b6107f98261075c565b9392505050565b6000806040838503121561081357600080fd5b61081c8361075c565b915061082a6020840161075c565b90509250929050565b600181811c9082168061084757607f821691505b60208210810361086757634e487b7160e01b600052602260045260246000fd5b50919050565b808201808211156102b757634e487b7160e01b600052601160045260246000fdfea2646970667358221220109b9a599f0badc23fa957fb1510c08b12fb54cd8baf3ac22829364fb2029e0564736f6c63430008140033", 424 | "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c806370a082311161008c57806395d89b411161006657806395d89b41146101aa578063a9059cbb146101b2578063dd62ed3e146101c5578063f2fde38b146101fe57600080fd5b806370a082311461015e578063715018a6146101875780638da5cb5b1461018f57600080fd5b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461011557806323b872dd14610127578063313ce5671461013a57806340c10f1914610149575b600080fd5b6100dc610211565b6040516100e9919061070e565b60405180910390f35b610105610100366004610778565b6102a3565b60405190151581526020016100e9565b6002545b6040519081526020016100e9565b6101056101353660046107a2565b6102bd565b604051601281526020016100e9565b61015c610157366004610778565b6102e1565b005b61011961016c3660046107de565b6001600160a01b031660009081526020819052604090205490565b61015c6102f7565b6005546040516001600160a01b0390911681526020016100e9565b6100dc61030b565b6101056101c0366004610778565b61031a565b6101196101d3366004610800565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61015c61020c3660046107de565b610328565b60606003805461022090610833565b80601f016020809104026020016040519081016040528092919081815260200182805461024c90610833565b80156102995780601f1061026e57610100808354040283529160200191610299565b820191906000526020600020905b81548152906001019060200180831161027c57829003601f168201915b5050505050905090565b6000336102b181858561036b565b60019150505b92915050565b6000336102cb85828561037d565b6102d68585856103fb565b506001949350505050565b6102e961045a565b6102f38282610487565b5050565b6102ff61045a565b61030960006104bd565b565b60606004805461022090610833565b6000336102b18185856103fb565b61033061045a565b6001600160a01b03811661035f57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610368816104bd565b50565b610378838383600161050f565b505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146103f557818110156103e657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610356565b6103f58484848403600061050f565b50505050565b6001600160a01b03831661042557604051634b637e8f60e11b815260006004820152602401610356565b6001600160a01b03821661044f5760405163ec442f0560e01b815260006004820152602401610356565b6103788383836105e4565b6005546001600160a01b031633146103095760405163118cdaa760e01b8152336004820152602401610356565b6001600160a01b0382166104b15760405163ec442f0560e01b815260006004820152602401610356565b6102f3600083836105e4565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166105395760405163e602df0560e01b815260006004820152602401610356565b6001600160a01b03831661056357604051634a1406b160e11b815260006004820152602401610356565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156103f557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d691815260200190565b60405180910390a350505050565b6001600160a01b03831661060f578060026000828254610604919061086d565b909155506106819050565b6001600160a01b038316600090815260208190526040902054818110156106625760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610356565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661069d576002805482900390556106bc565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161070191815260200190565b60405180910390a3505050565b600060208083528351808285015260005b8181101561073b5785810183015185820160400152820161071f565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461077357600080fd5b919050565b6000806040838503121561078b57600080fd5b6107948361075c565b946020939093013593505050565b6000806000606084860312156107b757600080fd5b6107c08461075c565b92506107ce6020850161075c565b9150604084013590509250925092565b6000602082840312156107f057600080fd5b6107f98261075c565b9392505050565b6000806040838503121561081357600080fd5b61081c8361075c565b915061082a6020840161075c565b90509250929050565b600181811c9082168061084757607f821691505b60208210810361086757634e487b7160e01b600052602260045260246000fd5b50919050565b808201808211156102b757634e487b7160e01b600052601160045260246000fdfea2646970667358221220109b9a599f0badc23fa957fb1510c08b12fb54cd8baf3ac22829364fb2029e0564736f6c63430008140033", 425 | "linkReferences": {}, 426 | "deployedLinkReferences": {} 427 | } --------------------------------------------------------------------------------