我们在git上找到合约源码比如uniswap,或者自己写了一个合约工程,合约依赖关系比较复杂。
以下truffle-flattener为例子展示如何使用,solidity-flattener使用类似。
下面是uniswap v2-core 的工程结构
├── LICENSE
├── README.md
├── contracts
│ ├── UniswapV2ERC20.sol
│ ├── UniswapV2Factory.sol
│ ├── UniswapV2Pair.sol
│ ├── interfaces
│ │ ├── IERC20.sol
│ │ ├── IUniswapV2Callee.sol
│ │ ├── IUniswapV2ERC20.sol
│ │ ├── IUniswapV2Factory.sol
│ │ └── IUniswapV2Pair.sol
│ ├── libraries
│ │ ├── Math.sol
│ │ ├── SafeMath.sol
│ │ └── UQ112x112.sol
│ └── test
│ └── ERC20.sol
└── package.json
UniswapV2Factory
依赖了多个其他的合约。
pragma solidity =0.5.16;
import './interfaces/IUniswapV2Factory.sol';
import './UniswapV2Pair.sol';
contract UniswapV2Factory is IUniswapV2Factory {
address public feeTo;
address public feeToSetter;
mapping(address => mapping(address => address)) public getPair;
address[] public allPairs;
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
constructor(address _feeToSetter) public {
feeToSetter = _feeToSetter;
}
使用truffle-flattener,将多个sol文件压缩成一个文件
安装truffle
。。。
安装truffle-flattener:
npm install -g truffle-flattener
新建一个truffle的工程
truffle init
将合约文件,比如uniswap的v2-core的contracts文件copy到工程里。
npm init
将项目转换为一个npm的项目。
目录结构:
├── contracts
│ ├── Migrations.sol
│ ├── UniswapV2ERC20.sol
│ ├── UniswapV2Factory.sol
│ ├── UniswapV2Pair.sol
│ ├── interfaces
│ │ ├── IERC20.sol
│ │ ├── IUniswapV2Callee.sol
│ │ ├── IUniswapV2ERC20.sol
│ │ ├── IUniswapV2Factory.sol
│ │ └── IUniswapV2Pair.sol
│ ├── libraries
│ │ ├── Math.sol
│ │ ├── SafeMath.sol
│ │ └── UQ112x112.sol
│ └── test
│ └── ERC20.sol
├── migrations
│ └── 1_initial_migration.js
├── package.json
├── test
└── truffle-config.js
合并合约文件
将项目中的某个合约文件及其依赖都合并写入一个文件里:
方式一
truffle-flattener contracts/UniswapV2Factory.sol --output UniswapV2Factory.sol
方式二
truffle-flattener contracts/UniswapV2Factory.sol > UniswapV2Factory.sol
重定向后的UniswapV2Factory.sol
文件就汇聚了所有编译需要的solidity代码。但是pragma信息有很多重复的,将多余的pragma信息删除,将该文件内容全部复制到remix中,就可以使用remix了。
// File: contracts/interfaces/IUniswapV2Factory.sol
pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
// File: contracts/interfaces/IUniswapV2Pair.sol
pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
...
solidity-flattener
安装
安装solc:
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
安装 solidity-flattener
pip3 install solidity-flattener
使用
进入到truffle目录的contracts目录,执行:
solidity_flattener XXX.sol > target_XXX.sol
方式和truffle-flattener一样。
truffle-flattener官方介绍:https://github.com/nomiclabs/truffle-flattener
solidity-flattener官方介绍:https://github.com/BlockCatIO/solidity-flattener