├── .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 | 
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 | 
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 | 
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 | }
--------------------------------------------------------------------------------